上一篇介绍了接入高德地图,显示地图,这篇介绍获取当前定位坐标。
1.首先根据上一篇在AndroidManififest.xml添加的权限缺少定位的权限,需要再添加一个权限:
<!--用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
2.这个权限是需要动态允许的,所以在定位之前必须要获取该权限的允许。
在Activity中添加获取权限的方法代码:
//权限 void getPessimission() { ArrayList<String> permissions = new ArrayList<String>(); if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){//未开启定位权限 //开启定位权限,200是标识码 permissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION); }else{ //已开启定位权限,直接定位 setPosition(); } if (permissions != null && permissions.size() > 0) { String[] array = (String[]) permissions.toArray(new String[permissions.size()]); ActivityCompat.requestPermissions(this, array, 9); } }
在获取权限回调方法里面也添加相应的代码:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode==9){ if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){ setPosition(); } } }
3.添加定位代码:
Activity 实现 AMapLocationListener,并实现相关的onLocationChanged()方法;以下为Activity完整的代码:
package com.my.gaodemapdemo; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationListener; import com.amap.api.maps.AMap; import com.amap.api.maps.LocationSource; import java.util.ArrayList; public class TestActivity2 extends AppCompatActivity implements AMapLocationListener { //定位 private AMapLocationClient mlocationClient = null; private AMapLocationClientOption mLocationOption = null; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); getPessimission(); } @Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation != null) { Log.d("Test","location ecode: "+aMapLocation.getErrorInfo()); if (aMapLocation.getErrorCode() == 0) { double lat = aMapLocation.getLatitude(); double lon = aMapLocation.getLongitude(); //打印定位的坐标 Log.d("Test","lat: "+lat); Log.d("Test","lon: "+lon); } } } void setPosition() { //声明mlocationClient对象 // AMapLocationClient mlocationClient; //声明mLocationOption对象 // AMapLocationClientOption mLocationOption = null; mlocationClient = new AMapLocationClient(this); //初始化定位参数 mLocationOption = new AMapLocationClientOption(); //设置定位监听 mlocationClient.setLocationListener(this); //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //设置定位间隔,单位毫秒,默认为2000ms mLocationOption.setInterval(2000); //设置定位参数 mlocationClient.setLocationOption(mLocationOption); // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗, // 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求 // 在定位结束后,在合适的生命周期调用onDestroy()方法 // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除 //启动定位 mlocationClient.startLocation(); } private void destroyLocation() { if (null != mlocationClient) { /** * 如果AMapLocationClient是在当前Activity实例化的, * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy */ mlocationClient.onDestroy(); mlocationClient = null; mLocationOption = null; } } @Override protected void onDestroy() { super.onDestroy(); destroyLocation(); } //权限 void getPessimission() { ArrayList<String> permissions = new ArrayList<String>(); if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){//未开启定位权限 //开启定位权限,200是标识码 permissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION); }else{ //已开启定位权限,直接定位 setPosition(); } if (permissions != null && permissions.size() > 0) { String[] array = (String[]) permissions.toArray(new String[permissions.size()]); ActivityCompat.requestPermissions(this, array, 9); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode==9){ if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){ setPosition(); } } } }