采用百度开放平台的api对自己位置的定位的好处有很多。
1,完全不需要你做任何事情。程序自动给调用。
2,稳定。流量少。之前做的有些程序是从网络上抓取自己的ip地址来进行定位。
而百度的这个,返回一些你位置的基本信息。
一下就是代码:
基础类,这个类保存个人位置信息。
第二个为百度返回json的解析类,将获得的信息解析到基础类中进行保存。
第三个为layout的main.xml
最后是activity。可以显示地图和定位的。
最后还有权限:
1,完全不需要你做任何事情。程序自动给调用。
2,稳定。流量少。之前做的有些程序是从网络上抓取自己的ip地址来进行定位。
而百度的这个,返回一些你位置的基本信息。
一下就是代码:
基础类,这个类保存个人位置信息。
package com.duduli.li;
public class Addr {
private String time;
private String error;
private String pointX;
private String PointY;
private String radius;
private String addr;
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getPointX() {
return pointX;
}
public void setPointX(String pointX) {
this.pointX = pointX;
}
public String getPointY() {
return PointY;
}
public void setPointY(String pointY) {
PointY = pointY;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
public String getRadius() {
return radius;
}
public void setRadius(String radius) {
this.radius = radius;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
第二个为百度返回json的解析类,将获得的信息解析到基础类中进行保存。
package com.duduli.li;
import org.json.JSONException;
import org.json.JSONObject;
public class JsonParse {
public Addr parseJson(String json) throws JSONException{
Addr addrMsg = new Addr();
JSONObject jo = new JSONObject(json);
// 解析json中的result值
String result = jo.getString("result");
JSONObject resultJO = new JSONObject(result);
String time = resultJO.getString("time");
String error = resultJO.getString("error");
addrMsg.setTime(time);
addrMsg.setError(error);
// 解析json中的content值
String content = jo.getString("content");
JSONObject contentJO = new JSONObject(content);
String point = contentJO.getString("point");
// 解析json中point数据
JSONObject pointJO = new JSONObject(point);
String x = pointJO.getString("x");
String y = pointJO.getString("y");
addrMsg.setPointX(x);
addrMsg.setPointY(y);
String radius = contentJO.getString("radius");
addrMsg.setRadius(radius);
// 解析json中add数据
String addr = contentJO.getString("addr");
JSONObject addrJO = new JSONObject(addr);
String detail = addrJO.getString("detail");
addrMsg.setAddr(detail);
return addrMsg;
}
}
第三个为layout的main.xml
<com.baidu.mapapi.MapView android:id="@+id/bmapsView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:clickable="true" />
最后是activity。可以显示地图和定位的。
package com.duduli.li;
import org.json.JSONException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import com.baidu.location.LocServiceMode;
import com.baidu.location.LocationChangedListener;
import com.baidu.location.LocationClient;
import com.baidu.location.ReceiveListener;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.Overlay;
public class BaiduMapTestActivity extends MapActivity {
private LocationClient lc ;
private BMapManager mBMapMan;
private MapView mMapView;
private double x;
private double y;
// private GeoPoint gp;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.main);
mBMapMan = new BMapManager(getApplication());
mBMapMan.init("279B8BABF0AA0A98B33A494C9E310BBB10137789", null);
super.initMapActivity(mBMapMan);
lc = new LocationClient(this);
lc.setCoorType("gcj02");
lc.setServiceMode(LocServiceMode.Background);
lc.addLocationChangedlistener(new MyLocationChangedListener());
lc.addRecerveListener(new MyReceiveListenner());
lc.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
lc.getLocation();
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
public class MyLocationChangedListener implements LocationChangedListener {
public void onLocationChanged() {
//在此添加,位置改变触发的功能。
// tv.append(text)
}
}
public class MyReceiveListenner implements ReceiveListener{
public void onReceive(String strData) {
//在此处理 获取到的定位结果的json串。
try {
JsonParse jp = new JsonParse();
Addr ad = jp.parseJson(strData);
// x = getPoint(ad.getPointX());//114.105
// y = getPoint(ad.getPointY());//22.54
x = Double.valueOf(ad.getPointX());
y = Double.valueOf(ad.getPointY());
mMapView = (MapView) findViewById(R.id.bmapsView);
mMapView.setBuiltInZoomControls(true);
mMapView.getOverlays().add(new MyOverlay());
MapController mc = mMapView.getController();
GeoPoint gp = new GeoPoint((int)(y*1E6),(int)(x*1E6));
// GeoPoint gp = new GeoPoint((int)(22.54762429*1E6),(int)(114.1054699*1E6));
mc.setCenter(gp);
mc.setZoom(12);
mBMapMan.start();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/* public int getPoint(String s){
String str = s.substring(0, s.indexOf("."))+s.substring(s.indexOf(".")+1, s.indexOf(".")+7);
return Integer.valueOf(str);
}*/
}
public class MyOverlay extends Overlay {
GeoPoint geoPoint = new GeoPoint((int)(y*1E6),(int)(x*1E6));
Paint paint = new Paint();
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Point point = mMapView.getProjection().toPixels(geoPoint, null);
Bitmap bmp = BitmapFactory.decodeResource(getResources(),android.R.drawable.presence_online);
canvas.drawBitmap(bmp,point.x, point.y,paint);
canvas.drawText("你在这里", point.x, point.y, paint);
}
}
}
最后还有权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>