手把手教你实现百度基础地图+定位功能+设置中心点+添加Marker

原文地址: https://blog.csdn.net/pan960821/article/details/50914000


配置环境

1.获取AppKey

1.创建应用地址:http://lbsyun.baidu.com/apiconsole/key


2.创建应用:


3.获取SHA1值,首先cmd打开dos窗口



4.cd .android 切换到 .android目录

   

5.使用keytool -list -v -keystore debug.keystore获取指纹整数中的SHA1值,输入口令直接回车或者输入android即可:



6.得到的指纹整数SHA1值



7.获取应用的包名(PackageName):

这个是包名 PackageName

8.把SHA1和PackageName放到对应的位置点击确定,得到APPKEY


2.配置AndroidManifest.xml文件

1.设置你的APPKEY

 
  
  1. <meta-data
  2. android:name= "com.baidu.lbsapi.API_KEY"
  3. android:value= "你的 AppKey" />


2.添加用户权限

 
  
  1. <!-- 百度地图需要的权限 -->
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. <uses-permission android:name="android.permission.INTERNET" />
  4. <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
  5. <uses-permission android:name="android.permission.WAKE_LOCK" />
  6. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  7. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  8. <uses-permission android:name="android.permission.GET_TASKS" />
  9. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  10. <uses-permission android:name="android.permission.WRITE_SETTINGS" />

3.基础地图实现

效果图

1.在布局文件添加地图控件

 
   
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools= "http://schemas.android.com/tools"
  4. android:layout_width= "match_parent"
  5. android:layout_height= "match_parent"
  6. tools:context= "com.demo.baidumapblog.ShowMapActivity">
  7. <com.baidu.mapapi.map.MapView
  8. android:id= "@+id/bmapView"
  9. android:layout_width= "fill_parent"
  10. android:layout_height= "fill_parent"
  11. android:clickable= "true" />
  12. </RelativeLayout>

2.初始化地图控件并管理控件的生命周期

 
   
  1. package com.demo.baidumapblog;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import com.baidu.mapapi.SDKInitializer;
  5. import com.baidu.mapapi.map.MapView;
  6. public class ShowMapActivity extends AppCompatActivity {
  7. private MapView mMapView;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. //在使用SDK各组件之前初始化context信息,传入ApplicationContext
  12. //注意该方法要再setContentView方法之前实现
  13. //使用百度地图的任何功能都需要先初始化这段代码 最好放在全局中进行初始化
  14. //百度地图+定位+marker比较简单 我就不放到全局去了
  15. SDKInitializer.initialize(getApplicationContext());
  16. setContentView(R.layout.activity_show_map);
  17. //获取地图控件引用
  18. mMapView = (MapView) findViewById(R.id.bmapView);
  19. }
  20. /**
  21. * 必须要实现
  22. */
  23. @Override
  24. protected void onDestroy() {
  25. super.onDestroy();
  26. //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
  27. mMapView.onDestroy();
  28. }
  29. /**
  30. * 必须要实现
  31. */
  32. @Override
  33. protected void onResume() {
  34. super.onResume();
  35. //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
  36. mMapView.onResume();
  37. }
  38. /**
  39. * 必须要实现
  40. */
  41. @Override
  42. protected void onPause() {
  43. super.onPause();
  44. //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
  45. mMapView.onPause();
  46. }
  47. }


4.实现定位功能

效果图  和基础地图没有什么区别 因为没有加中心点以及marker 但是已经获取到了经纬度坐标


1.在AndroidManifest.xml中注册广播  注意这个广播一定要注册 否则定位会失败

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>

2.添加定位需要的权限 去重之后的:

 
  
  1. <!-- 这个权限用于进行网络定位-->
  2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"> </uses-permission>
  3. <!-- 这个权限用于访问GPS定位-->
  4. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"> </uses-permission>
  5. <!-- 用于读取手机当前的状态-->
  6. <uses-permission android:name="android.permission.READ_PHONE_STATE"> </uses-permission>
  7. <!-- SD卡读取权限,用户写入离线定位数据-->
  8. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

3.正式写代码 定位功能的全部代码:

 
  
  1. package com.demo.baidumapblog;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import com.baidu.location.BDLocation;
  6. import com.baidu.location.BDLocationListener;
  7. import com.baidu.location.LocationClient;
  8. import com.baidu.location.LocationClientOption;
  9. import com.baidu.location.Poi;
  10. import com.baidu.mapapi.SDKInitializer;
  11. import com.baidu.mapapi.map.MapView;
  12. import java.util.List;
  13. public class ShowMapActivity extends AppCompatActivity {
  14. private MapView mMapView;
  15. public LocationClient mLocationClient = null;
  16. public BDLocationListener myListener = new MyLocationListener();
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. //在使用SDK各组件之前初始化context信息,传入ApplicationContext
  21. //注意该方法要再setContentView方法之前实现
  22. //使用百度地图的任何功能都需要先初始化这段代码 最好放在全局中进行初始化
  23. //百度地图+定位+marker比较简单 我就不放到全局去了
  24. SDKInitializer.initialize(getApplicationContext());
  25. setContentView(R.layout.activity_show_map);
  26. //获取地图控件引用
  27. mMapView = (MapView) findViewById(R.id.bmapView);
  28. //声明LocationClient类
  29. mLocationClient = new LocationClient(getApplicationContext());
  30. //注册监听函数
  31. mLocationClient.registerLocationListener( myListener );
  32. //配置定位参数
  33. initLocation();
  34. //开始定位
  35. mLocationClient.start();
  36. }
  37. /**
  38. * 配置定位参数
  39. */
  40. private void initLocation(){
  41. LocationClientOption option = new LocationClientOption();
  42. option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
  43. ); //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
  44. option.setCoorType( "bd09ll"); //可选,默认gcj02,设置返回的定位结果坐标系
  45. int span= 1000;
  46. option.setScanSpan(span); //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
  47. option.setIsNeedAddress( true); //可选,设置是否需要地址信息,默认不需要
  48. option.setOpenGps( true); //可选,默认false,设置是否使用gps
  49. option.setLocationNotify( true); //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
  50. option.setIsNeedLocationDescribe( true); //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
  51. option.setIsNeedLocationPoiList( true); //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
  52. option.setIgnoreKillProcess( false); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
  53. option.SetIgnoreCacheException( false); //可选,默认false,设置是否收集CRASH信息,默认收集
  54. option.setEnableSimulateGps( false); //可选,默认false,设置是否需要过滤gps仿真结果,默认需要
  55. mLocationClient.setLocOption(option);
  56. }
  57. /**
  58. * 实现定位监听 位置一旦有所改变就会调用这个方法
  59. * 可以在这个方法里面获取到定位之后获取到的一系列数据
  60. */
  61. public class MyLocationListener implements BDLocationListener {
  62. private double lat;
  63. private double lon;
  64. @Override
  65. public void onReceiveLocation(BDLocation location) {
  66. //Receive Location
  67. StringBuffer sb = new StringBuffer( 256);
  68. sb.append( "time : ");
  69. sb.append(location.getTime());
  70. sb.append( "\nerror code : ");
  71. sb.append(location.getLocType());
  72. sb.append( "\nlatitude : ");
  73. sb.append(location.getLatitude());
  74. sb.append( "\nlontitude : ");
  75. sb.append(location.getLongitude());
  76. sb.append( "\nradius : ");
  77. sb.append(location.getRadius());
  78. lat = location.getLatitude();
  79. lon = location.getLongitude();
  80. if (location.getLocType() == BDLocation.TypeGpsLocation) { // GPS定位结果
  81. sb.append( "\nspeed : ");
  82. sb.append(location.getSpeed()); // 单位:公里每小时
  83. sb.append( "\nsatellite : ");
  84. sb.append(location.getSatelliteNumber());
  85. sb.append( "\nheight : ");
  86. sb.append(location.getAltitude()); // 单位:米
  87. sb.append( "\ndirection : ");
  88. sb.append(location.getDirection()); // 单位度
  89. sb.append( "\naddr : ");
  90. sb.append(location.getAddrStr());
  91. sb.append( "\ndescribe : ");
  92. sb.append( "gps定位成功");
  93. } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { // 网络定位结果
  94. sb.append( "\naddr : ");
  95. sb.append(location.getAddrStr());
  96. //运营商信息
  97. sb.append( "\noperationers : ");
  98. sb.append(location.getOperators());
  99. sb.append( "\ndescribe : ");
  100. sb.append( "网络定位成功");
  101. } else if (location.getLocType() == BDLocation.TypeOffLineLocation) { // 离线定位结果
  102. sb.append( "\ndescribe : ");
  103. sb.append( "离线定位成功,离线定位结果也是有效的");
  104. } else if (location.getLocType() == BDLocation.TypeServerError) {
  105. sb.append( "\ndescribe : ");
  106. sb.append( "服务端网络定位失败,可以反馈IMEI号和大体定位时间到[email protected],会有人追查原因");
  107. } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
  108. sb.append( "\ndescribe : ");
  109. sb.append( "网络不同导致定位失败,请检查网络是否通畅");
  110. } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
  111. sb.append( "\ndescribe : ");
  112. sb.append( "无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
  113. }
  114. sb.append( "\nlocationdescribe : ");
  115. sb.append(location.getLocationDescribe()); // 位置语义化信息
  116. List<Poi> list = location.getPoiList(); // POI数据
  117. if (list != null) {
  118. sb.append( "\npoilist size = : ");
  119. sb.append(list.size());
  120. for (Poi p : list) {
  121. sb.append( "\npoi= : ");
  122. sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
  123. }
  124. }
  125. Log.v( "pcw", "lat : " + lat+ " lon : " + lon);
  126. Log.i( "BaiduLocationApiDem", sb.toString());
  127. }
  128. }
  129. /**
  130. * 必须要实现
  131. */
  132. @Override
  133. protected void onDestroy() {
  134. super.onDestroy();
  135. //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
  136. mMapView.onDestroy();
  137. }
  138. /**
  139. * 必须要实现
  140. */
  141. @Override
  142. protected void onResume() {
  143. super.onResume();
  144. //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
  145. mMapView.onResume();
  146. }
  147. /**
  148. * 必须要实现
  149. */
  150. @Override
  151. protected void onPause() {
  152. super.onPause();
  153. //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
  154. mMapView.onPause();
  155. }
  156. }

4.声明LocationClient类 并注册监听函数

 
  
  1. //声明LocationClient类
  2. mLocationClient = new LocationClient(getApplicationContext());
  3. //注册监听函数
  4. mLocationClient.registerLocationListener( myListener );

5.配置定位参数

 
  
  1. /**
  2. * 配置定位参数
  3. */
  4. private void initLocation(){
  5. LocationClientOption option = new LocationClientOption();
  6. option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
  7. ); //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
  8. option.setCoorType( "bd09ll"); //可选,默认gcj02,设置返回的定位结果坐标系
  9. int span= 1000;
  10. option.setScanSpan(span); //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
  11. option.setIsNeedAddress( true); //可选,设置是否需要地址信息,默认不需要
  12. option.setOpenGps( true); //可选,默认false,设置是否使用gps
  13. option.setLocationNotify( true); //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
  14. option.setIsNeedLocationDescribe( true); //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
  15. option.setIsNeedLocationPoiList( true); //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
  16. option.setIgnoreKillProcess( false); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
  17. option.SetIgnoreCacheException( false); //可选,默认false,设置是否收集CRASH信息,默认收集
  18. option.setEnableSimulateGps( false); //可选,默认false,设置是否需要过滤gps仿真结果,默认需要
  19. mLocationClient.setLocOption(option);
  20. }


6.实现定位监听

 
  
  1. /**
  2. * 实现定位监听 位置一旦有所改变就会调用这个方法
  3. * 可以在这个方法里面获取到定位之后获取到的一系列数据
  4. */
  5. public class MyLocationListener implements BDLocationListener {
  6. private double lat;
  7. private double lon;
  8. @Override
  9. public void onReceiveLocation(BDLocation location) {
  10. //Receive Location
  11. StringBuffer sb = new StringBuffer(256);
  12. sb.append("time : ");
  13. sb.append(location.getTime());
  14. sb.append("\nerror code : ");
  15. sb.append(location.getLocType());
  16. sb.append("\nlatitude : ");
  17. sb.append(location.getLatitude());
  18. sb.append("\nlontitude : ");
  19. sb.append(location.getLongitude());
  20. sb.append("\nradius : ");
  21. sb.append(location.getRadius());
  22. lat = location.getLatitude();
  23. lon = location.getLongitude();
  24. if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
  25. sb.append("\nspeed : ");
  26. sb.append(location.getSpeed());// 单位:公里每小时
  27. sb.append("\nsatellite : ");
  28. sb.append(location.getSatelliteNumber());
  29. sb.append("\nheight : ");
  30. sb.append(location.getAltitude());// 单位:米
  31. sb.append("\ndirection : ");
  32. sb.append(location.getDirection());// 单位度
  33. sb.append("\naddr : ");
  34. sb.append(location.getAddrStr());
  35. sb.append("\ndescribe : ");
  36. sb.append("gps定位成功");
  37. } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
  38. sb.append("\naddr : ");
  39. sb.append(location.getAddrStr());
  40. //运营商信息
  41. sb.append("\noperationers : ");
  42. sb.append(location.getOperators());
  43. sb.append("\ndescribe : ");
  44. sb.append("网络定位成功");
  45. } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
  46. sb.append("\ndescribe : ");
  47. sb.append("离线定位成功,离线定位结果也是有效的");
  48. } else if (location.getLocType() == BDLocation.TypeServerError) {
  49. sb.append("\ndescribe : ");
  50. sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到[email protected],会有人追查原因");
  51. } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
  52. sb.append("\ndescribe : ");
  53. sb.append("网络不同导致定位失败,请检查网络是否通畅");
  54. } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
  55. sb.append("\ndescribe : ");
  56. sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
  57. }
  58. sb.append("\nlocationdescribe : ");
  59. sb.append(location.getLocationDescribe());// 位置语义化信息
  60. List <Poi> list = location.getPoiList();// POI数据
  61. if (list != null) {
  62. sb.append("\npoilist size = : ");
  63. sb.append(list.size());
  64. for (Poi p : list) {
  65. sb.append("\npoi= : ");
  66. sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
  67. }
  68. }
  69. Log.v("pcw","lat : " + lat+" lon : " + lon);
  70. Log.i("BaiduLocationApiDem", sb.toString());
  71. }
  72. }

5.设置中心点和marker

效果图


1.基础地图+定位+设置中心点+marker 所有代码

 
  
  1. package com.demo.baidumapblog;
  2. import android.os.Handler;
  3. import android.os.Message;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import com.baidu.location.BDLocation;
  8. import com.baidu.location.BDLocationListener;
  9. import com.baidu.location.LocationClient;
  10. import com.baidu.location.LocationClientOption;
  11. import com.baidu.location.Poi;
  12. import com.baidu.mapapi.SDKInitializer;
  13. import com.baidu.mapapi.map.BaiduMap;
  14. import com.baidu.mapapi.map.BitmapDescriptor;
  15. import com.baidu.mapapi.map.BitmapDescriptorFactory;
  16. import com.baidu.mapapi.map.MapStatus;
  17. import com.baidu.mapapi.map.MapStatusUpdate;
  18. import com.baidu.mapapi.map.MapStatusUpdateFactory;
  19. import com.baidu.mapapi.map.MapView;
  20. import com.baidu.mapapi.map.MarkerOptions;
  21. import com.baidu.mapapi.map.OverlayOptions;
  22. import com.baidu.mapapi.model.LatLng;
  23. import java.util.List;
  24. public class ShowMapActivity extends AppCompatActivity {
  25. private MapView mMapView;
  26. private boolean isFirstLocation = true;
  27. public LocationClient mLocationClient = null;
  28. public BDLocationListener myListener = new MyLocationListener();
  29. private BaiduMap mBaiduMap;
  30. private double lat;
  31. private double lon;
  32. @Override
  33. protected void onCreate(Bundle savedInstanceState) {
  34. super.onCreate(savedInstanceState);
  35. //在使用SDK各组件之前初始化context信息,传入ApplicationContext
  36. //注意该方法要再setContentView方法之前实现
  37. //使用百度地图的任何功能都需要先初始化这段代码 最好放在全局中进行初始化
  38. //百度地图+定位+marker比较简单 我就不放到全局去了
  39. SDKInitializer.initialize(getApplicationContext());
  40. setContentView(R.layout.activity_show_map);
  41. //获取地图控件引用
  42. mMapView = (MapView) findViewById(R.id.bmapView);
  43. //获取BaiduMap对象
  44. mBaiduMap = mMapView.getMap();
  45. //声明LocationClient类
  46. mLocationClient = new LocationClient(getApplicationContext());
  47. //注册监听函数
  48. mLocationClient.registerLocationListener(myListener);
  49. //配置定位参数
  50. initLocation();
  51. //开始定位
  52. mLocationClient.start();
  53. }
  54. /**
  55. * 添加marker
  56. */
  57. private void setMarker() {
  58. Log.v( "pcw", "setMarker : lat : "+ lat+ " lon : " + lon);
  59. //定义Maker坐标点
  60. LatLng point = new LatLng(lat, lon);
  61. //构建Marker图标
  62. BitmapDescriptor bitmap = BitmapDescriptorFactory
  63. .fromResource(R.drawable.location_marker);
  64. //构建MarkerOption,用于在地图上添加Marker
  65. OverlayOptions option = new MarkerOptions()
  66. .position(point)
  67. .icon(bitmap);
  68. //在地图上添加Marker,并显示
  69. mBaiduMap.addOverlay(option);
  70. }
  71. /**
  72. * 设置中心点
  73. */
  74. private void setUserMapCenter() {
  75. Log.v( "pcw", "setUserMapCenter : lat : "+ lat+ " lon : " + lon);
  76. LatLng cenpt = new LatLng(lat,lon);
  77. //定义地图状态
  78. MapStatus mMapStatus = new MapStatus.Builder()
  79. .target(cenpt)
  80. .zoom( 18)
  81. .build();
  82. //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
  83. MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
  84. //改变地图状态
  85. mBaiduMap.setMapStatus(mMapStatusUpdate);
  86. }
  87. /**
  88. * 配置定位参数
  89. */
  90. private void initLocation(){
  91. LocationClientOption option = new LocationClientOption();
  92. option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
  93. ); //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
  94. option.setCoorType( "bd09ll"); //可选,默认gcj02,设置返回的定位结果坐标系
  95. int span= 1000;
  96. option.setScanSpan(span); //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
  97. option.setIsNeedAddress( true); //可选,设置是否需要地址信息,默认不需要
  98. option.setOpenGps( true); //可选,默认false,设置是否使用gps
  99. option.setLocationNotify( true); //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
  100. option.setIsNeedLocationDescribe( true); //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
  101. option.setIsNeedLocationPoiList( true); //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
  102. option.setIgnoreKillProcess( false); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
  103. option.SetIgnoreCacheException( false); //可选,默认false,设置是否收集CRASH信息,默认收集
  104. option.setEnableSimulateGps( false); //可选,默认false,设置是否需要过滤gps仿真结果,默认需要
  105. mLocationClient.setLocOption(option);
  106. }
  107. /**
  108. * 实现定位监听 位置一旦有所改变就会调用这个方法
  109. * 可以在这个方法里面获取到定位之后获取到的一系列数据
  110. */
  111. public class MyLocationListener implements BDLocationListener {
  112. @Override
  113. public void onReceiveLocation(BDLocation location) {
  114. //Receive Location
  115. StringBuffer sb = new StringBuffer( 256);
  116. sb.append( "time : ");
  117. sb.append(location.getTime());
  118. sb.append( "\nerror code : ");
  119. sb.append(location.getLocType());
  120. sb.append( "\nlatitude : ");
  121. sb.append(location.getLatitude());
  122. sb.append( "\nlontitude : ");
  123. sb.append(location.getLongitude());
  124. sb.append( "\nradius : ");
  125. sb.append(location.getRadius());
  126. if (location.getLocType() == BDLocation.TypeGpsLocation) { // GPS定位结果
  127. sb.append( "\nspeed : ");
  128. sb.append(location.getSpeed()); // 单位:公里每小时
  129. sb.append( "\nsatellite : ");
  130. sb.append(location.getSatelliteNumber());
  131. sb.append( "\nheight : ");
  132. sb.append(location.getAltitude()); // 单位:米
  133. sb.append( "\ndirection : ");
  134. sb.append(location.getDirection()); // 单位度
  135. sb.append( "\naddr : ");
  136. sb.append(location.getAddrStr());
  137. sb.append( "\ndescribe : ");
  138. sb.append( "gps定位成功");
  139. } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { // 网络定位结果
  140. sb.append( "\naddr : ");
  141. sb.append(location.getAddrStr());
  142. //运营商信息
  143. sb.append( "\noperationers : ");
  144. sb.append(location.getOperators());
  145. sb.append( "\ndescribe : ");
  146. sb.append( "网络定位成功");
  147. } else if (location.getLocType() == BDLocation.TypeOffLineLocation) { // 离线定位结果
  148. sb.append( "\ndescribe : ");
  149. sb.append( "离线定位成功,离线定位结果也是有效的");
  150. } else if (location.getLocType() == BDLocation.TypeServerError) {
  151. sb.append( "\ndescribe : ");
  152. sb.append( "服务端网络定位失败,可以反馈IMEI号和大体定位时间到[email protected],会有人追查原因");
  153. } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
  154. sb.append( "\ndescribe : ");
  155. sb.append( "网络不同导致定位失败,请检查网络是否通畅");
  156. } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
  157. sb.append( "\ndescribe : ");
  158. sb.append( "无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
  159. }
  160. sb.append( "\nlocationdescribe : ");
  161. sb.append(location.getLocationDescribe()); // 位置语义化信息
  162. List<Poi> list = location.getPoiList(); // POI数据
  163. if (list != null) {
  164. sb.append( "\npoilist size = : ");
  165. sb.append(list.size());
  166. for (Poi p : list) {
  167. sb.append( "\npoi= : ");
  168. sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
  169. }
  170. }
  171. lat = location.getLatitude();
  172. lon = location.getLongitude();
  173. //这个判断是为了防止每次定位都重新设置中心点和marker
  174. if(isFirstLocation){
  175. isFirstLocation = false;
  176. setMarker();
  177. setUserMapCenter();
  178. }
  179. Log.v( "pcw", "lat : " + lat+ " lon : " + lon);
  180. Log.i( "BaiduLocationApiDem", sb.toString());
  181. }
  182. }
  183. /**
  184. * 必须要实现
  185. */
  186. @Override
  187. protected void onDestroy() {
  188. super.onDestroy();
  189. //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
  190. mMapView.onDestroy();
  191. }
  192. /**
  193. * 必须要实现
  194. */
  195. @Override
  196. protected void onResume() {
  197. super.onResume();
  198. //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
  199. mMapView.onResume();
  200. }
  201. /**
  202. * 必须要实现
  203. */
  204. @Override
  205. protected void onPause() {
  206. super.onPause();
  207. //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
  208. mMapView.onPause();
  209. }
  210. }

2.设置中心点的代码:

 
  
  1. /**
  2. * 设置中心点
  3. */
  4. private void setUserMapCenter() {
  5. Log.v( "pcw", "setUserMapCenter : lat : "+ lat+ " lon : " + lon);
  6. LatLng cenpt = new LatLng(lat,lon);
  7. //定义地图状态
  8. MapStatus mMapStatus = new MapStatus.Builder()
  9. .target(cenpt)
  10. .zoom( 18)
  11. .build();
  12. //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
  13. MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
  14. //改变地图状态
  15. mBaiduMap.setMapStatus(mMapStatusUpdate);
  16. }

3.添加marker:

 
   
  1. /**
  2. * 添加marker
  3. */
  4. private void setMarker() {
  5. Log.v( "pcw", "setMarker : lat : "+ lat+ " lon : " + lon);
  6. //定义Maker坐标点
  7. LatLng point = new LatLng(lat, lon);
  8. //构建Marker图标
  9. BitmapDescriptor bitmap = BitmapDescriptorFactory
  10. .fromResource(R.drawable.location_marker);
  11. //构建MarkerOption,用于在地图上添加Marker
  12. OverlayOptions option = new MarkerOptions()
  13. .position(point)
  14. .icon(bitmap);
  15. //在地图上添加Marker,并显示
  16. mBaiduMap.addOverlay(option);
  17. }



猜你喜欢

转载自blog.csdn.net/chenhuakang/article/details/80909681
今日推荐