注:一些源码出自百度官网Demo
1)说点废话:
从拿到地图+定位这个需求的时候,我还算淡定,因为基于Google地图的资料太多了,不管是文字的还是视频,随便一百度就一大堆,但是那些都是基于Google map V1的。现在已经不提供V1版本的apiKey了,因此,直接跳过V1使用V2。至于V2的Key怎么注册申请都不说,因为Google map是需要Google Play服务的,我尝试了很多次,那个软件怎么都登陆不上,据说是咱国家把Google给墙了,而且获取一些开发资料的时候也需要翻墙,废了老劲了,最后就是程序没法跑,没办法只能用百度的地图+定位,可能是我才疏学浅,有能弄好的大神,还望来喷啊^_^。
2)准备工作:
首先在官网上下载对应的jar包和so引擎,
这里需要注意两点:
1.如果是开发单独的应用,比如只需要地图或是只需要定位,两者不结合,直接下载对应的包就行了。
百度地图 baidumapapi_v3_1_0.jar
百度定位 BaiduLBS_Android.jar
2.如果是两个功能结合使用,需要在百度地图上进行定位,就需要这两个包
百度地图 baidumapapi_v3_1_0.jar
百度定位 locSDK_4.2.jar
其目录结构如下:
这里并不是将第一点里的两个包整到工程里,那样的话回报一个两个证书的错误:
Error generating final archive: Found duplicate file for APK: assets/sapi_cert.cer
Origin1:D:\BaiduMapTest_2\libs\BaiduLBS_Android.jar
Origin2: D:\BaiduMapTest_2\libs\baidumapapi_v3_1_0.jar
这一点是比较坑爹的,居然没人说,而且在Demo里面是用的老版本的定位……这些包官网上还都是有的,懒得找的话直接把包名直接百度就行了。
3)走起!
没有接触过得同学们,我还是建议大家一个一个的来,首先把HelloMap的工程弄好,我觉得那个官方的文档最开始的那篇写的还是不错的。
接下来就是把定位的那个程序弄好,就是接收到位置,输出一堆的那个。代码如下图:
Hello Map:
代码部分就这么一段就行,关键是Manifest文件,官方文档上写的一样都不能丢,尤其是权限,这里就不再细说代码怎么写了,注意两点细节:
1.申请Key的时候,包名是和Manifest文件最上面有个PackageName属性,要和那里面的值一只,否则调试程序的时候会有permission denied错误,不能显示地图,只能显示灰色小格。
2.权限问题,百度官方说的需要那么多权限,就复制过去好了,回来再一个个研究。
BaiduLocation:
这个程序的代码我没有粘全,官网上都有的,不细说,还是细节问题:
1.定位需要在manifest文件里声明定位服务,否则会出现onReceiveLocation方法不回调的现象
2.权限问题,还是像上面的把需要的权限复制过去就行了,Demo里都有的
3.在调试的时候虚拟机默认是没有SDCard的,这时这个程序的errorCode会返回167
就是没有SD卡所致,建议真机调试下,正常的是161(网络定位),没记错的话还有个GPS定位的代码,好像是两位,官网上有不记得了……
定位+地图
这里注意定位和地图所需要的权限是不一样的,有交叉的部分,这里需要注意:
剩下的就是添加overLay了,代码如下,写的很不好,测试用的有一些没用,时间紧没整理,见谅啊……
private LocationClient mLocationClient = null;
private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
private BitmapDescriptor bitmap = null;
private LatLng point = null;
private OverlayOptions option = null;
private TextView content = null;
private boolean isFirstLoc = true;
private double lontitude = 116.404;// 初始值指向天安门
private double latitude = 39.915;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
content = (TextView) findViewById(R.id.content);
content.setText("lontitude" + lontitude + "latitude" + latitude);
mMapView = (MapView) findViewById(R.id.bmapView);
mMapView.refreshDrawableState();
mBaiduMap = mMapView.getMap();
LocationClientOption clientOption = new LocationClientOption();
clientOption.setLocationMode(LocationMode.Hight_Accuracy);
clientOption.setOpenGps(true); // 打开gps
clientOption.setCoorType("bd09ll"); // 设置坐标类型为bd09ll
clientOption.setScanSpan(3000); // 定时定位,每隔5秒钟定位一次。
mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类
mLocationClient.setLocOption(clientOption);
mLocationClient.registerLocationListener(new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
StringBuffer sb = new StringBuffer(256);
sb.append("\ntime : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation){
sb.append("\nspeed : ");
b.append(location.getSpeed());
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
sb.append("\ndirection : ");
sb.append("\naddr : ");
sb.append(location.getAddrStr());
sb.append(location.getDirection());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
sb.append("\naddr : ");
sb.append(location.getAddrStr());
// 运营商信息
sb.append("\noperationers : ");
sb.append(location.getOperators());
}
content.setText(sb.toString());
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
MyLocationData locData = new MyLocationData.Builder()
.latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
mBaiduMap.clear();
mBaiduMap.addOverlay(new MarkerOptions().position(ll).icon(bitmap));
}
}
});
// 定义Maker坐标点
point = new LatLng(latitude, lontitude);
// 构建Marker图标
bitmap=BitmapDescriptorFactory.fromResource(R.drawable.jiantou);
// 构建MarkerOption,用于在地图上添加Marker
option = new MarkerOptions().position(point).icon(bitmap);
// 在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);
mLocationClient.start();
if (mLocationClient != null && mLocationClient.isStarted())
mLocationClient.requestLocation();
else
Log.d("LocSDK3", "locClient is null or not started");