学习内容来自“慕课网”
在上一学习内容的基础上改进代码,需要学习定位功能的同学请先将我的上一篇百度地图基础的学习一下
http://www.cnblogs.com/xqxacm/p/4337054.html
第一次学习百度地图的定位功能,理解不深,相应注释都在代码中写出了
MainActivity.java
1 package com.example.map; 2 3 import com.baidu.location.BDLocation; 4 import com.baidu.location.BDLocationListener; 5 import com.baidu.location.LocationClient; 6 import com.baidu.location.LocationClientOption; 7 import com.baidu.mapapi.SDKInitializer; 8 import com.baidu.mapapi.map.BaiduMap; 9 import com.baidu.mapapi.map.MapStatusUpdate; 10 import com.baidu.mapapi.map.MapStatusUpdateFactory; 11 import com.baidu.mapapi.map.MapView; 12 import com.baidu.mapapi.map.MyLocationConfiguration; 13 import com.baidu.mapapi.map.MyLocationData; 14 import com.baidu.mapapi.model.LatLng; 15 import com.example.map.R; 16 17 import android.location.Location; 18 import android.os.Bundle; 19 import android.app.Activity; 20 import android.content.Context; 21 import android.graphics.Bitmap; 22 import android.view.Menu; 23 import android.view.MenuItem; 24 import android.view.Window; 25 import android.widget.Toast; 26 27 public class MainActivity extends Activity { 28 29 private MapView mMapView = null; 30 private BaiduMap mBaiduMap; 31 //简化代码 用于this.context=this; 32 private Context context; 33 //定位相关 34 private LocationClient mLocationClient; 35 private MyLocationListener mLocationListener; 36 //是否第一次定位的标志 37 private boolean isFirstIn = true; 38 //定位经纬度 39 private double mLatitude; 40 private double mLongtitude; 41 42 @Override 43 protected void onCreate(Bundle savedInstanceState) { 44 super.onCreate(savedInstanceState); 45 //在使用SDK各组件之前初始化context信息,传入ApplicationContext 46 //注意该方法要再setContentView方法之前实现 47 SDKInitializer.initialize(getApplicationContext()); 48 49 requestWindowFeature(Window.FEATURE_NO_TITLE); 50 setContentView(R.layout.activity_main); 51 this.context = this; 52 initView(); 53 //初始化定位 54 initLocation(); 55 56 } 57 58 private void initView() { 59 // TODO Auto-generated method stub 60 mMapView = (MapView) findViewById(R.id.bmapView); 61 mBaiduMap = mMapView.getMap(); 62 //设置打开时的显示比列 这里显示500m左右 63 MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f); 64 mBaiduMap.setMapStatus(msu); 65 } 66 private void initLocation() { 67 // TODO Auto-generated method stub 68 mLocationClient = new LocationClient(this); 69 mLocationListener = new MyLocationListener(); 70 mLocationClient.registerLocationListener(mLocationListener); 71 LocationClientOption option = new LocationClientOption(); 72 option.setCoorType("bd09ll"); 73 option.setIsNeedAddress(true); 74 option.setOpenGps(true); 75 option.setScanSpan(1000); 76 77 mLocationClient.setLocOption(option); 78 } 79 //activity销毁时百度地图也销毁 80 @Override 81 protected void onDestroy() { 82 super.onDestroy(); 83 //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 84 mMapView.onDestroy(); 85 } 86 @Override 87 protected void onStart() { 88 // TODO Auto-generated method stub 89 super.onStart(); 90 // 开启定位 91 mBaiduMap.setMyLocationEnabled(true); 92 if (!mLocationClient.isStarted()) 93 mLocationClient.start(); 94 95 } 96 @Override 97 protected void onStop() { 98 // TODO Auto-generated method stub 99 super.onStop(); 100 // 停止定位 101 mBaiduMap.setMyLocationEnabled(false); 102 mLocationClient.stop(); 103 } 104 @Override 105 protected void onResume() { 106 super.onResume(); 107 //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 108 mMapView.onResume(); 109 } 110 @Override 111 protected void onPause() { 112 super.onPause(); 113 //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 114 mMapView.onPause(); 115 } 116 @Override 117 public boolean onCreateOptionsMenu(Menu menu) { 118 // TODO Auto-generated method stub 119 120 getMenuInflater().inflate(R.menu.main, menu); 121 return true; 122 } 123 //菜单按钮的响应事件 124 @Override 125 public boolean onOptionsItemSelected(MenuItem item) { 126 // TODO Auto-generated method stub 127 switch (item.getItemId()) { 128 case R.id.id_map_common: 129 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); 130 break; 131 case R.id.id_map_site: 132 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); 133 break; 134 case R.id.id_map_traffic: 135 if(mBaiduMap.isTrafficEnabled()) 136 { 137 mBaiduMap.setTrafficEnabled(false); 138 item.setTitle("实时交通(off)"); 139 } 140 else 141 { 142 mBaiduMap.setTrafficEnabled(true); 143 item.setTitle("实时交通(on)"); 144 } 145 break; 146 case R.id.id_map_location: 147 //定位最新自己的位置 148 centerToMyLocation(); 149 break; 150 151 default: 152 break; 153 } 154 return super.onOptionsItemSelected(item); 155 } 156 //进到自己的位置 157 private void centerToMyLocation() { 158 LatLng latLng = new LatLng(mLatitude,mLongtitude); 159 160 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); 161 mBaiduMap.animateMapStatus(msu); 162 } 163 private class MyLocationListener implements BDLocationListener{ 164 165 @Override 166 public void onReceiveLocation(BDLocation location) { 167 // TODO Auto-generated method stub 168 MyLocationData data = new MyLocationData.Builder()// 169 .accuracy(location.getRadius())// 170 .latitude(location.getLatitude())// 171 .longitude(location.getLongitude())// 172 .build(); 173 mBaiduMap.setMyLocationData(data); 174 //获取最新经纬度 175 mLatitude = location.getLatitude(); 176 mLongtitude = location.getLongitude(); 177 //判断是否第一次定位 178 if (isFirstIn) 179 { 180 //设置经纬度 181 LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude()); 182 183 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); 184 mBaiduMap.animateMapStatus(msu); 185 //将是否第一次定位的标志 变为不是第一次定位 186 isFirstIn = false; 187 //显示当前定位的位置 188 Toast.makeText(context, location.getAddrStr(), 189 Toast.LENGTH_SHORT).show(); 190 } 191 192 } 193 194 } 195 }
菜单对应的文件
位置位于:res-menu-main.xml
1 <menu xmlns:android="http://schemas.android.com/apk/res/android" > 2 3 <item 4 android:id="@+id/id_map_common" 5 6 android:showAsAction="never" 7 android:title="普通地图"/> 8 <item 9 android:id="@+id/id_map_site" 10 11 android:showAsAction="never" 12 android:title="卫星地图"/> 13 <item 14 android:id="@+id/id_map_traffic" 15 16 android:showAsAction="never" 17 android:title="实时交通(off)"/> 18 <item 19 android:id="@+id/id_map_location" 20 21 android:showAsAction="never" 22 android:title="定位我的位置"/> 23 24 </menu>
要注意的是 在AndroidManifest.xml文件中 需要加入几段代码
1 <service 2 android:name="com.baidu.location.f" 3 android:enabled="true" 4 android:process=":remote" > 5 <intent-filter> 6 <action android:name="com.baidu.location.service_v2.2" > 7 </action> 8 </intent-filter> 9 </service>
具体位置:
1 <application 2 android:allowBackup="true" 3 android:icon="@drawable/ic_launcher" 4 android:label="@string/app_name" 5 android:theme="@style/AppTheme" > 6 <meta-data 7 android:name="com.baidu.lbsapi.API_KEY" 8 android:value="N6RKiEDLzPFGdqVTfsf7h5GD" /> 9 <activity 10 android:name="com.example.map.MainActivity" 11 android:label="@string/app_name" > 12 <intent-filter> 13 <action android:name="android.intent.action.MAIN" /> 14 15 <category android:name="android.intent.category.LAUNCHER" /> 16 </intent-filter> 17 </activity> 18 <service 19 android:name="com.baidu.location.f" 20 android:enabled="true" 21 android:process=":remote" > 22 <intent-filter> 23 <action android:name="com.baidu.location.service_v2.2" > 24 </action> 25 </intent-filter> 26 </service> 27 28 </application>
效果图:
显示进入activity后定位到自己当前位置的效果
菜单项中“定位我的位置” 点击后 地图调至手机当前坐标位置