一,开发者文档中心
二,百度地图API概述
百度地图密钥申请
1.登陆/注册百度账号:
2.获取SHA1或MD5数字签名
原先在 Eclipse中 数字签名(SHA1或MD5)的获取方法 为:
点击 Eclipse导航栏的Windows --> Preference --> Android --> Build
现在 改到 Android Studio 下开发Android 应用, 没用找到只用鼠标点击的方法. 但可以打开Terminal,使用keytool获取:
1》第一步:先定位到.android文件夹位置
cd C:\Users\Administrator\.android
2》第二步:输入以下信息,注意 " 和空格
"C:\Program Files\Java\jre7\bin\keytool.exe" -list -v -keystore "C:\Users\Administrator\.android\debug.keystore"
(图中口令为:android)
三,百度地图环境配置
1.下载官方示例代码,将libs目录下的所有文件拷贝到自己的工程的libs目录
2.配置build.gradle,将编译时的jniLibs目录指向到libs目录
使用AndroidStutio的开发者除了上述操作,还需要在build.gradle中的android节点配置SO的使用,如下所示:
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
修改后,同步gradle.
3.权限及注册
(注意:key和包名是绑定的
,
不同的包名要重新申请key)!
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.day_26"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <application android:name=".MainApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="q7EqzMopGdazjzihQe86iCTWNSmWpWa8" /><!--开发者 key--> </application> </manifest>
四,显示基本地图(交通地图、卫星地图、热力地图)
显示百度地图的基础地图:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap
模拟器请用com.baidu.mapapi.map.TextureMapView
交通、卫星、热力:
五,百度地图定位
package com.qf.baidu.test; import android.app.Activity; import android.os.Bundle; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.RadioGroup; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.TextureMapView; public class MainActivity extends Activity { public LocationClient mLocationClient = null; public BDLocationListener myListener; TextureMapView mMapView = null; RadioGroup rg; CheckBox cb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (TextureMapView) findViewById(R.id.bmapView); //设置 setupViews(); myListener = new MyLocationListener(mMapView); mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener(myListener); //注册监听函数 initLocation(); //开始定位,定位完成后,不管是否成功,都会调用监听函数中的方法 mLocationClient.start(); } private void initLocation() { LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系 int span = 1000; option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true);//可选,默认false,设置是否使用gps option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要 mLocationClient.setLocOption(option); } private void setupViews() { rg = (RadioGroup) findViewById(R.id.rg); //设置监听 rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rb1: { mMapView.getMap().setMapType(BaiduMap.MAP_TYPE_NORMAL); } break; case R.id.rb2: { mMapView.getMap().setMapType(BaiduMap.MAP_TYPE_SATELLITE); } break; } } }); //实时交通 cb = (CheckBox) findViewById(R.id.cb1); cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mMapView.getMap().setTrafficEnabled(isChecked); } }); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } }
1.百度地图定位SDK是独立的。
2.基本步骤
1》.声明
public LocationClient mLocationClient = null; public BDLocationListener myListener;
2》.初始化
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener(myListener); //注册监听函数 initLocation(); mLocationClient.start();
3.设置地图中心
public void setCenter(double latitude, double longitude) { //设置地图中心 LatLng center = new LatLng(latitude, longitude); //地图状态,构建者模式 MapStatus mapStatus = new MapStatus.Builder() //设置目标点 .target(center) //支持缩放模式3-18 .zoom(15) //构建 .build(); //构建新状态,工厂模式 MapStatusUpdate msu = MapStatusUpdateFactory.newMapStatus(mapStatus); //更新状态 tmv.getMap().setMapStatus(msu); }
六,百度地图覆盖物基本用法
1.对地图设置监听,点击添加覆盖物
//设置监听,点击添加覆盖物 mMapView.getMap().setOnMapClickListener(new BaiduMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { //添加覆盖物 } @Override public boolean onMapPoiClick(MapPoi mapPoi) { return false; } });
2.长按覆盖物,可拖动
package com.qf.baidu.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.RadioGroup; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapPoi; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.TextureMapView; import com.baidu.mapapi.model.LatLng; public class MainActivity extends Activity { public LocationClient mLocationClient = null; public BDLocationListener myListener; TextureMapView mMapView = null; RadioGroup rg; CheckBox cb; private Marker marker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (TextureMapView) findViewById(R.id.bmapView); //设置 setupViews(); myListener = new MyLocationListener(mMapView); mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener(myListener); //注册监听函数 initLocation(); //开始定位,定位完成后,不管是否成功,都会调用监听函数中的方法 mLocationClient.start(); //设置监听,点击添加覆盖物 mMapView.getMap().setOnMapClickListener(new BaiduMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { //先移除先前的覆盖物 if (marker != null) { marker.remove(); } //添加覆盖物 //定义Maker坐标点 // LatLng latLng1=new LatLng(2f,3f); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.mipmap.icon_marka); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(latLng) .icon(bitmap) .zIndex(9) .draggable(true); //在地图上添加Marker,并显示 marker = (Marker) mMapView.getMap().addOverlay(option); } @Override public boolean onMapPoiClick(MapPoi mapPoi) { return false; } }); //设置覆盖物拖动监听 mMapView.getMap().setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() { @Override public void onMarkerDrag(Marker marker) { } @Override public void onMarkerDragEnd(Marker marker) { } @Override public void onMarkerDragStart(Marker marker) { } }); } private void initLocation() { LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系 int span = 1000; option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true);//可选,默认false,设置是否使用gps option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要 mLocationClient.setLocOption(option); } private void setupViews() { rg = (RadioGroup) findViewById(R.id.rg); //设置监听 rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rb1: { mMapView.getMap().setMapType(BaiduMap.MAP_TYPE_NORMAL); } break; case R.id.rb2: { mMapView.getMap().setMapType(BaiduMap.MAP_TYPE_SATELLITE); } break; } } }); //实时交通 cb = (CheckBox) findViewById(R.id.cb1); cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mMapView.getMap().setTrafficEnabled(isChecked); } }); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } }
七,POI检索
1.http://lbsyun.baidu.com/index.php?title=androidsdk/guide/retrieval
2.POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
3.注:检索结果是返回一个对象内容,并不会自动显示到地图上。开发者可以结合覆盖物让检索结果显示到地图上。
4.开发步骤
第一步,创建POI检索实例
mPoiSearch = PoiSearch.newInstance();
第二步,创建POI检索监听者;
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){ public void onGetPoiResult(PoiResult result){ //获取POI检索结果 } public void onGetPoiDetailResult(PoiDetailResult result){ //获取Place详情页检索结果 } };
第三步,设置POI检索监听者;
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
第四步,发起检索请求;
mPoiSearch.searchInCity((new PoiCitySearchOption()) .city(“北京”) .keyword(“美食”) .pageNum(10));
第五步,释放POI检索实例;
mPoiSearch.destroy();
PoiSearch类的searchInCity(PoiCitySearchOption) 发起检索时返回的结果,增加门址类数据:PoiResult中新增getAllAddr()获取门址类列表,当isHasAddrInfo() 返回true时,除了原poi列表外,还包含门址结果。
例如:在“北京”搜索“上地十街1号”,除返回包含“上地十街1号”的poi列表以外,还包括地址为“上地十街1号”的明确门址。
检索周边
//检索周边 PoiNearbySearchOption poiOption = new PoiNearbySearchOption(); poiOption.keyword("美食"); poiOption.location(latLng); poiOption.pageNum(0); poiOption.pageCapacity(20); poiOption.radius(100); poiOption.sortType(PoiSortType.distance_from_near_to_far); poiSearch.searchNearby(poiOption);
八,出行线路规划(公交、步行、自驾)
1.http://lbsyun.baidu.com/index.php?title=androidsdk/guide/retrieval#.E7.BA.BF.E8.B7.AF.E8.A7.84.E5.88.92
2.当查询到所有驾车路线后,可以获取到每一条线路的信息。其中每一条线路信息包含了 线路距离(可以根据这点判断哪条线路最短),预计行驶时间(可以根据这点判断哪条线路用时最短) ,以及包含 路线的行驶步骤等。
百度地图没有提供相关方法,需要自行完成
DrivingRouteLine item = mDrivingRouteResult.getRouteLines().get(position); StringBuilder sb = new StringBuilder(); sb.append(item.getDistance() + "\n");//返回起始点距离单位米 sb.append(item.getDuration() + "\n");//返回预计行驶时间单位秒 List<DrivingRouteLine.DrivingStep> allStep = item.getAllStep();//返回所有途径的步骤描述 if (allStep != null) for (DrivingRouteLine.DrivingStep s : allStep) { sb.append(s.getEntranceInstructions() + "\n");//入口描述 // sb.append(s.getInstructions() + "\n");//入口+出口描述 sb.append(s.getExitInstructions() + "\n");//出口描述 } textView.setText(sb.toString());
代码如下:
百度地图: package com.qf.baidu.test; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.RadioGroup; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.location.Poi; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapPoi; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.TextureMapView; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.core.PoiInfo; import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener; import com.baidu.mapapi.search.poi.PoiCitySearchOption; import com.baidu.mapapi.search.poi.PoiDetailResult; import com.baidu.mapapi.search.poi.PoiIndoorResult; import com.baidu.mapapi.search.poi.PoiNearbySearchOption; import com.baidu.mapapi.search.poi.PoiResult; import com.baidu.mapapi.search.poi.PoiSearch; import com.baidu.mapapi.search.poi.PoiSortType; import com.baidu.mapapi.search.route.BikingRouteResult; import com.baidu.mapapi.search.route.DrivingRouteLine; import com.baidu.mapapi.search.route.DrivingRoutePlanOption; import com.baidu.mapapi.search.route.DrivingRouteResult; import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener; import com.baidu.mapapi.search.route.PlanNode; import com.baidu.mapapi.search.route.RoutePlanSearch; import com.baidu.mapapi.search.route.TransitRouteLine; import com.baidu.mapapi.search.route.TransitRoutePlanOption; import com.baidu.mapapi.search.route.TransitRouteResult; import com.baidu.mapapi.search.route.WalkingRouteResult; import java.util.List; public class MainActivity extends Activity { public LocationClient mLocationClient = null; public BDLocationListener myListener; TextureMapView mMapView = null; RadioGroup rg; CheckBox cb; private Marker marker; private PoiSearch poiSearch; private RoutePlanSearch routeSearch; //起点 LatLng startLatLng; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (TextureMapView) findViewById(R.id.bmapView); //设置 setupViews(); myListener = new MyLocationListener(); mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener(myListener); //注册监听函数 initLocation(); //开始定位,定位完成后,不管是否成功,都会调用监听函数中的方法 mLocationClient.start(); //设置监听,点击添加覆盖物 mMapView.getMap().setOnMapClickListener(new BaiduMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { //检索周边 PoiNearbySearchOption poiOption = new PoiNearbySearchOption(); poiOption.keyword("美食"); poiOption.location(latLng); poiOption.radius(100);//检索周边范围 poiOption.sortType(PoiSortType.distance_from_near_to_far); poiSearch.searchNearby(poiOption); //路径规划 PlanNode start = PlanNode.withLocation(startLatLng); PlanNode end = PlanNode.withLocation(latLng); routeSearch.drivingSearch(new DrivingRoutePlanOption().from(start).to(end)); //先移除先前的覆盖物 if (marker != null) { marker.remove(); } //添加覆盖物 //定义Maker坐标点 // LatLng latLng1=new LatLng(2f,3f); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.mipmap.icon_markb); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(latLng) .icon(bitmap) .zIndex(9) .draggable(true); //在地图上添加Marker,并显示 marker = (Marker) mMapView.getMap().addOverlay(option); } @Override public boolean onMapPoiClick(MapPoi mapPoi) { return false; } }); //设置覆盖物拖动监听 mMapView.getMap().setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() { @Override public void onMarkerDrag(Marker marker) { } @Override public void onMarkerDragEnd(Marker marker) { } @Override public void onMarkerDragStart(Marker marker) { } }); //POI检索 poiSearch = PoiSearch.newInstance(); //创建监听 poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { Log.d("ytmfdw", "onGetPoiResult=========="); //获取POI检索结果 List<PoiInfo> result = poiResult.getAllPoi(); if (result == null) { return; } for (PoiInfo info : result) { Log.d("ytmfdw", "info:====" + info.address); } } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { //POI详情结果 //获取POI检索结果 String address = poiDetailResult.getAddress(); Log.d("ytmfdw", "onGetPoiDetailResult address:====" + address); } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { //POI室内结果 Log.d("ytmfdw", "onGetPoiIndoorResult:====" + poiIndoorResult.getmArrayPoiInfo()); } }); poiSearch.searchInCity(new PoiCitySearchOption().city("深圳").keyword("美食").pageNum(1)); //路线规划 routeSearch = RoutePlanSearch.newInstance(); //路线规划监听 routeSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) { //歩行检索 } @Override public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) { //公交车检索 List<TransitRouteLine> lines = transitRouteResult.getRouteLines(); if (lines != null) { for (TransitRouteLine line : lines) { Log.d("ytmfdw", "allStep=" + line.getAllStep()); Log.d("ytmfdw", "duraton=" + line.getDuration()); Log.d("ytmfdw", "distance=" + line.getDistance()); } } } @Override public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) { //驾车检索 List<DrivingRouteLine> lines = drivingRouteResult.getRouteLines(); if (lines != null) { for (DrivingRouteLine line : lines) { Log.d("ytmfdw", "allStep=" + line.getAllStep()); Log.d("ytmfdw", "duraton=" + line.getDuration()); Log.d("ytmfdw", "distance=" + line.getDistance()); } } } @Override public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) { } }); } private void initLocation() { LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系 int span = 1000; option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true);//可选,默认false,设置是否使用gps option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要 mLocationClient.setLocOption(option); } private void setupViews() { rg = (RadioGroup) findViewById(R.id.rg); //设置监听 rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.rb1: { mMapView.getMap().setMapType(BaiduMap.MAP_TYPE_NORMAL); } break; case R.id.rb2: { mMapView.getMap().setMapType(BaiduMap.MAP_TYPE_SATELLITE); } break; } } }); //实时交通 cb = (CheckBox) findViewById(R.id.cb1); cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { mMapView.getMap().setTrafficEnabled(isChecked); } }); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); //释放POI检索 poiSearch.destroy(); //释放路径检索 routeSearch.destroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } /** * 定位监听 */ class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { Log.d("ytmfdw", "onReceiveLocation~~~~~" + location.getAddrStr()); //初始化起点 startLatLng = new LatLng(location.getLatitude(), location.getLongitude()); //设置中心点 setCenter(location.getLatitude(), location.getLongitude()); //添加起点 //定义Maker坐标点 LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.mipmap.icon_marka); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(latLng) .icon(bitmap) .zIndex(9) .draggable(true); //添加覆盖物到地图上 mMapView.getMap().addOverlay(option); //Receive Location StringBuffer sb = new StringBuffer(256); sb.append("time : "); 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) {// GPS定位结果 sb.append("\nspeed : "); sb.append(location.getSpeed());// 单位:公里每小时 sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber()); sb.append("\nheight : "); sb.append(location.getAltitude());// 单位:米 sb.append("\ndirection : "); sb.append(location.getDirection());// 单位度 sb.append("\naddr : "); sb.append(location.getAddrStr()); sb.append("\ndescribe : "); sb.append("gps定位成功"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果 sb.append("\naddr : "); sb.append(location.getAddrStr()); //运营商信息 sb.append("\noperationers : "); sb.append(location.getOperators()); sb.append("\ndescribe : "); sb.append("网络定位成功"); } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果 sb.append("\ndescribe : "); sb.append("离线定位成功,离线定位结果也是有效的"); } else if (location.getLocType() == BDLocation.TypeServerError) { sb.append("\ndescribe : "); sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到[email protected],会有人追查原因"); } else if (location.getLocType() == BDLocation.TypeNetWorkException) { sb.append("\ndescribe : "); sb.append("网络不同导致定位失败,请检查网络是否通畅"); } else if (location.getLocType() == BDLocation.TypeCriteriaException) { sb.append("\ndescribe : "); sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机"); } sb.append("\nlocationdescribe : "); sb.append(location.getLocationDescribe());// 位置语义化信息 List<Poi> list = location.getPoiList();// POI数据 if (list != null) { sb.append("\npoilist size = : "); sb.append(list.size()); for (Poi p : list) { sb.append("\npoi= : "); sb.append(p.getId() + " " + p.getName() + " " + p.getRank()); } } Log.i("ytmfdw", sb.toString()); } /** * 设置地图中心 * * @param latitude * @param longitude */ public void setCenter(double latitude, double longitude) { //设置地图中心 LatLng center = new LatLng(latitude, longitude); //地图状态,构建者模式 MapStatus mapStatus = new MapStatus.Builder() //设置目标点 .target(center) //支持缩放模式3-18 .zoom(15) //构建 .build(); //构建新状态,工厂模式 MapStatusUpdate msu = MapStatusUpdateFactory.newMapStatus(mapStatus); //更新状态 mMapView.getMap().setMapStatus(msu); } } }