添加依赖:
implementation 'com.amap.api:location:latest.integration'
String NOW_LOCATION ="";//用户当前定位位置
int GET_USER_LOACTION_PERMISSIONS=1;//申请定位权限
/**
* 1.获取定位权限
* */
public static void getLocationPermissions(Context context){
// 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//开始获取定位
getLocation();
}else {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, GET_USER_LOACTION_PERMISSIONS);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 2.用户权限 申请 的回调方法
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == GET_USER_LOACTION_PERMISSIONS)
try {
{
// 如果用户赋予全选,则执行相应逻辑
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//开始i定位
getLocation(getActivity(), tvSeachGoods);
} else {
ToastUtils.show("缺少定位权限,无法使用此功能,请打开设置-应用管理-权限前去开启");
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", BaseApplication.getInstance().getPackageName(), null));
} else if (Build.VERSION.SDK_INT <= 8) {
localIntent.setAction(Intent.ACTION_VIEW);
localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
localIntent.putExtra("com.android.settings.ApplicationPkgName", BaseApplication.getInstance().getPackageName());
}
startActivity(localIntent);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 3.高德-*开始定位
* */
public static void getLocation(){
try {
AMapLocationClient mlocationClient = new AMapLocationClient(this);
//初始化定位参数
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
//设置定位监听
mlocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();//获取纬度
amapLocation.getLongitude();//获取经度
amapLocation.getAccuracy();//获取精度信息
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);//定位时间
amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
amapLocation.getCountry();//国家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城区信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道门牌号信息
amapLocation.getCityCode();//城市编码
amapLocation.getAdCode();//地区编码
NOW_LOCATION = amapLocation.getProvince()
+amapLocation.getCity()
+amapLocation.getDistrict()
+amapLocation.getStreet()
+amapLocation.getStreetNum();
ToastUtils.show("定位成功,位置为"+NOW_LOCATION);
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError","location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
ToastUtils.show("定位失败,点击重试");
//没有开启定位权限,跳转设置页面去
if(amapLocation.getErrorCode()==12){
ToastUtils.show("缺少定位权限,无法使用此功能,请打开设置-应用管理-权限前去开启");
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", BaseApplication.getInstance().getPackageName(), null));
} else if (Build.VERSION.SDK_INT <= 8) {
localIntent.setAction(Intent.ACTION_VIEW);
localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
localIntent.putExtra("com.android.settings.ApplicationPkgName", "自己应用包名");
}
startActivity(localIntent);
}else if(amapLocation.getErrorCode()==7){
ToastUtils.show("key不正确,请使用正式包后重试");
}else {
ToastUtils.show("定位失败,ErrCode=======" + amapLocation.getErrorCode() + ", errInfo======="
+ amapLocation.getErrorInfo());
}
}
}
}
});
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//该方法默认为false。 设置单次定位
mLocationOption.setOnceLocation(true);
//设置定位间隔,单位毫秒,默认为2000ms
// mLocationOption.setInterval(10000);
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
//启动定位
mlocationClient.startLocation();
} catch (Exception e) {
e.printStackTrace();
tvShowLocation.setText("定位失败,点击重试");
}
}