动态的开启手机权限(获取位置权限)

当Google更新到6.0以后为了用户的安全考虑.增加了权限问题,需要用户自己手动的开启权限.因此对于一些非开发人员,有的时候对于app的使用过程中会感觉到很困惑.一些功能无法使用.因此需要开发者去判断用户手机是否高于6.0,或者api23,如果高于的话就让用户自己去开启权限,代码包含一个封装的工具类.你也可以添加其他权限的信息.还有一个就是activity


工具类:

public class UserPermissionUtil {

    // 要申请的权限
    //本权限为获取到当前的位置,如果你有需要可以添加其他权限
    public  String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION};
    public Dialog dialog;
    //传递过来的activity
   public  Activity mActivity;

    /**
     * 构造函数
     * @param mActivity 为传递过来的上下文
     */
    public UserPermissionUtil(Activity mActivity) {
        this.mActivity = mActivity;
    }

    /**
     * 判断当前的权限是否满足条件
     */
    public  void getVersion() {
        // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
        if (Build.VERSION.SDK_INT >= M) {

            // 检查该权限是否已经获取
            int i = ContextCompat.checkSelfPermission(mActivity, permissions[0]);
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
            if (i != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
               showDialogTipUserGoToAppSettting();
            }
        }
    }

    /**
     * 弹出对话框.首都添加权限
     */
    public void showDialogTipUserGoToAppSettting() {

        dialog = new AlertDialog.Builder(mActivity)
                .setTitle("获取当前位置权限")
                .setMessage("请在-应用设置-权限-中,允许地图获取手机的位置权限")
                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 跳转到应用设置界面
                         goToAppSetting();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                     dialog.dismiss();
                    }
                }).setCancelable(false).show();
    }


    /**
     * 跳转到手动开启权限页面
     */
    public void goToAppSetting() {
        //通过意图打开权限页面,手动的开启权限
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", mActivity.getPackageName(), null);
        intent.setData(uri);
        //第二种开启activity的方式,不详细介绍.可以自己查一下
        mActivity.startActivityForResult(intent, 123);
    }

}


activity的调用,这个地方我使用的是高德地图,使用到工具类的地方用蓝色标注.在代码中,为了给初学者提供一些便利,所有粘贴全部代码.自己

也是菜鸟,希望各大神指点



public class MainActivity extends AppCompatActivity implements AMapLocationListener {
    private MapView mMapView;
    private AMap aMap;
    private UiSettings mUiSettings;//定义一个UiSettings对象

    public double longitude;
    public double latitude;
    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    //声明定位回调监听器
    public AMapLocationListener mLocationListener = new AMapLocationListener() {


        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (aMapLocation != null) {

                if (aMapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation获取相应内容。


                    int locationType = aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
                    latitude = aMapLocation.getLatitude();
                    longitude = aMapLocation.getLongitude();
                    aMapLocation.getAccuracy();//获取精度信息
                    aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
                    aMapLocation.getCountry();//国家信息
                    aMapLocation.getProvince();//省信息
                    aMapLocation.getCity();//城市信息
                    aMapLocation.getDistrict();//城区信息
                    aMapLocation.getStreet();//街道信息
                    aMapLocation.getStreetNum();//街道门牌号信息
                    aMapLocation.getCityCode();//城市编码
                    aMapLocation.getAdCode();//地区编码
                    aMapLocation.getAoiName();//获取当前定位点的AOI信息
                    aMapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
//获取定位时间
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(aMapLocation.getTime());
                    df.format(date);

                    // 设置当前地图显示为当前位置
                    aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 15));
                    MarkerOptions markerOptions = new MarkerOptions();
                    markerOptions.position(new LatLng(latitude, longitude));
                    markerOptions.title("当前位置");
                    markerOptions.visible(true);
                    BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.dizhi));
                    markerOptions.icon(bitmapDescriptor);
                    aMap.addMarker(markerOptions);
                } else {
                    //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
                    Log.e("AmapError", "location Error, ErrCode:"
                            + aMapLocation.getErrorCode() + ", errInfo:"
                            + aMapLocation.getErrorInfo());
                }
            }
        }
    };

    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption = null;
    private UserPermissionUtil util;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //'首先判断当前的权限问题

        util = new UserPermissionUtil(this);
          util.getVersion();

        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.map);
        //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理
        mMapView.onCreate(savedInstanceState);

        //初始化地图变量
        if (aMap == null) {

            aMap = mMapView.getMap();

        }
//        mUiSettings = aMap.getUiSettings();//实例化UiSettings类
//        mUiSettings.setScaleControlsEnabled(true);//显示比例尺控件
//
//        LatLng latLng = new LatLng(latitude, longitude);
//        final Marker marker = aMap.addMarker(new MarkerOptions().
//                position(latLng).
//                title("北京").
//                snippet("DefaultMarker"));
//
        MarkerOptions markerOption = new MarkerOptions();
        markerOption.position(latLng);
        markerOption.title("西安市").snippet("西安市:39.906901,116.397972");

        markerOption.draggable(true);
//
//        Animation animation = new RotateAnimation(marker.getRotateAngle(), marker.getRotateAngle() + 180, 0, 0, 0);
//        long duration = 1000L;
//        animation.setDuration(duration);
//        animation.setInterpolator(new LinearInterpolator());
//
//        marker.setAnimation(animation);
//        marker.startAnimation();
//        Circle   circle = aMap.addCircle(new CircleOptions().
//                center(latLng).
//                radius(10000).
//                fillColor(Color.argb(50, 1, 1, 1)).
//                strokeColor(Color.argb(50, 1, 1, 1)).
//                strokeWidth(15));
        initPosition();


    }

    /**
     * 初始化定位
     */
    private void initPosition() {
        //初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
        mLocationClient.setLocationListener(mLocationListener);

        //初始化定位参数
        mLocationOption = new AMapLocationClientOption();
        //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //设置是否返回地址信息(默认返回地址信息)
        mLocationOption.setNeedAddress(true);
        //设置是否只定位一次,默认为false
        mLocationOption.setOnceLocation(true);
        //设置是否强制刷新WIFI,默认为强制刷新
        mLocationOption.setWifiActiveScan(true);
        //设置是否允许模拟位置,默认为false,不允许模拟位置
        mLocationOption.setMockEnable(false);
        //设置定位间隔,单位毫秒,默认为2000ms
//        mLocationOption.setInterval(2000);
        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        //启动定位
        mLocationClient.startLocation();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView.onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView.onPause (),实现地图生命周期管理
        mMapView.onPause();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理
        mMapView.onSaveInstanceState(outState);
    }

    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 123) {

            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                // 检查该权限是否已经获取
                int i = ContextCompat.checkSelfPermission(this, util.permissions[0]);
                // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
                if (i != PackageManager.PERMISSION_GRANTED) {
                    // 提示用户应该去应用设置界面手动开启权限
                    util.showDialogTipUserGoToAppSettting();
                } else {
                    Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
                    initPosition();
                }
            }
        }
    }
}


  • 4
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值