Android第三方高德实现基础定位

添加依赖:
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("定位失败,点击重试");
        }
    }

 

你可能感兴趣的:(Android高级)