在实现定位到我的位置时,首先要开启定位图层,可以使用com.baidu.mapapi.map.BaiduMap 对象的setMyLocationEnabled()方法实现。该方法的语法格式如下:
Public final void set MyLocationEnabled(boolean enabled)
其中,enabled参数用于指定是否允许定位图层,值为true时表示允许,否则为不允许。
开启定位图层的代码如下:
mBaiduMap.setMyLocationEnabled(true);
然后创建MyLocationData对象,用于构造定位数据,包括GPS定位时方向角度、纬度坐标、经度坐标、定位精度和时速等。例如,构造定位数据,指定GPS定位时方向角度为100、坐标位置为当前位置,可以使用下面的代码。
01 MyLocationData locData = new MyLocationData.Builder().02 accuracy(location.getAccuracy()) //设置精度03 .direction(100) //此处设置开发者获取到的方向信息,顺时针0-36004 .latitude(location.getLatitude()) //设置纬度坐标05 .longitude(location.getLongitude()) //设置经度坐标06 .build();
说明:此处代码将使用Android原有定位方法。
再设置定位数据,并配置定位图层的一些信息。代码如下:
01 mBaiduMap.setMyLocationData(locData);02 //设置自定义定位图标03 BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory04 .fromResource(R.drawable.icon_geo);05 mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL; //设置定位模式06 //位置构造方式,将定位模式,定义图标添加其中07 MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);08 mBaiduMap.setMyLocationConfigeration(config); //地图显示定位图标
最后,在不需要定位图层时关闭定位图层。代码如下:
mBaiduMap.setMyLocationEnabled(false); //关闭定位图层
下面通过一个实例来演示如何在百度地图上定位我的位置。
实例 百度地图定位我的位置
说明:该实例在本章实例06基础上进行修改。
在Android Studio中创建Module,名称为“My Location”。在该Module中实现本实例,具体步骤如下。
(1)打开主活动MainActivity,在该文件中声明所需成员变量,关键代码如下:
01 private MapView mMapView; //百度地图组件02 private BaiduMap mBaiduMap; //定义百度地图对象03 private boolean isFirstLoc = true; //定义第一次启动04 private MyLocationConfiguration.LocationMode mCurrentMode; //定义当前定位模式
(2)在MainActivity的onCreate()方法中,获取系统的LocationManager对象,关键代码如下:
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
(3)在onCreate()方法中,通过locationManager.requestLocationUpdates()方法与位置监听器来设置每秒获取一次location信息,并将最新的定位信息传递给创建的locationUpdates()方法中。关键代码如下:
01 //设置每秒获取一次location信息02 locationManager.requestLocationUpdates(03 LocationManager.GPS_PROVIDER, //GPS定位提供者04 1000, //更新数据时间为1秒05 1, //位置间隔为1米06 //位置监听器07 new LocationListener() { //GPS定位信息发生改变时触发,用于更新位置信息08 @Override09 public void onLocationChanged(Location location) {10 //GPS信息发生改变时,更新位置11 locationUpdates(location);12 }13 @Override14 //位置状态发生改变时触发15 public void onStatusChanged(String provider, int status, Bundle extras) {16 }17 @Override18 //定位提供者启动时触发19 public void onProviderEnabled(String provider) {20 }21 @Override22 //定位提供者关闭时触发23 public void onProviderDisabled(String provider) {24 }25 });26 //从GPS获取最新的定位信息27 Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);28 locationUpdates(location); //将最新的定位信息传递给创建的locationUpdates()方法中
说明:添加上的代码后,在代码的下方将出现红色浪线,此时按下〈Alt+Enter〉键,然后选择Add Permission ACCESS_FINE_LOCATION选项,添加该权限解决红色浪线问题。此时,Android Studio将自动添加以下权限检查的代码。
01 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {02 return;03 }
(4)在MainActivity中,创建locationUpdates()方法,用于获取当前的经纬度,并设置定位。当获取的信息不为空时,首先设置第一次定位的中心点为当前位置,然后构造和设置定位数据,最后在地图上显示定位图标。关键代码如下:
01 public void locationUpdates(Location location) { //获取指定的查询信息02 //如果location不为空时03 if (location != null) {04 //获取用户当前经纬度05 LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());06 Log.i("Location","纬度:"+location.getLatitude()+" | 经度:"+location.getLongitude());07 if (isFirstLoc) { //如果是第一次定位,就定位到以自己为中心08 MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); //更新坐标位置09 mBaiduMap.animateMapStatus(u); //设置地图位置10 isFirstLoc = false; //取消第一次定位11 }12 //构造定位数据13 MyLocationData locData = new MyLocationData.Builder().14 accuracy(location.getAccuracy()) //设置精度15 .direction(100) // 此处设置开发者获取到的方向信息,顺时针0~36016 .latitude(location.getLatitude()) //设置纬度坐标17 .longitude(location.getLongitude()) //设置经度坐标18 .build();19 //设置定位数据20 mBaiduMap.setMyLocationData(locData);21 //设置自定义定位图标22 BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory23 .fromResource(R.drawable.icon_geo);24 mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL; //设置定位模式25 //位置构造方式,将定位模式,定义图标添加其中26 MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);27 mBaiduMap.setMyLocationConfigeration(config); //地图显示定位图标28 } else {29 //否则输出空信息30 Log.i("Location","没有获取到GPS信息");31 }32 }
(5)重写Activity的onStart()方法和onStop()方法,在onStart()方法中启动地图定位,在onStop()方法中停止地图定位。关键代码如下:
01 @Override02 protected void onStart() { //启动地图定位03 super.onStart();04 mBaiduMap.setMyLocationEnabled(true); //启动定位图层05 }06 @Override07 protected void onStop() { //停止地图定位08 super.onStop();09 mBaiduMap.setMyLocationEnabled(false); //关闭定位图层10 }
(6)在AndroidManifest.xml文件中,添加以下代码设置访问LocationProvider的相关权限,具体代码如下:
0102
(7)在工具栏中找到下拉列表框,选择要运行的应用(这里为My Location),再单击右侧的按钮,运行效果如图14.24所示。
图14.24 在百度地图上显示我的位置
说明:运行本实例需要在手机中进入 “设置”→“应用”→你的App应用名称→“权限”开启位置权限,即可进行定位。
本文摘自明日科技出版的《零基础学Android》,转载请注明出处!!!