android 6.0权限请求

最近手机升级到6.0之后,原先的程序就跑不了了,原因主要出自6.0以后,权限会被控制,用户既可以授权,也可以禁止这个权限,从而达到了保护自己隐私的目的。

然而我们的程序为了保证用户的唯一性,就是通过获取手机的mac地址或者IMEI识别码来实现的,但是假如我们要获取IMEI码的话,只要是通过在mainfest中配置

  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

再在代码中写上

  TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            String imeiCode = manager.getDeviceId();

这样基本上就可以获取得到了,要是获取不到,报

Neither user 10129 nor current process has android.permission.READ_PHONE_STATE
Neither user 10056 nor current process has android.permission.MODIFY_PHONE_STATE

这2者的之一的,原因主要在于你的手机没有root,或者第二个权限是系统权限,不能直接获取,要么就是用户已经禁止了你访问手机状态了

那么,该咋办呢,当然不能为了你这个app,用户还要花时间去root吧。

那么,解决的方法主要有2个。

1.舍弃IMEI码,将代码改成了从获取imei变成或获取mac地址

            TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            String imeiCode =null;
            try {
                imeiCode=manager.getDeviceId();
            }catch(Exception e){
                imeiCode=getMacAddress(context);
            }

2.动态获取我们所需要的权限

具体的主要分为4步:

1)检查权限

2)请求权限

3)获取deviceID

4)设置deviceId

首先我们需要在Activity中的onresume或者fragment的setuservisiblehint中,检查我们的权限,写法如下:

    private static String[] PERMISSION= {Manifest.permission.READ_PHONE_STATE};
    private  boolean islacksOfPermission(String permission){
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            return ContextCompat.checkSelfPermission(mContext, permission) ==
                    PackageManager.PERMISSION_DENIED;
        }
        return false;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==0x12){
            setDeviceId();
        }else{
            finish();
        }
    }

其次就是

 @Override
    protected void onResume() {
        super.onResume();
        if(islacksOfPermission(PERMISSION[0])){
            ActivityCompat.requestPermissions(this,PERMISSION,0x12);
        }else{
            setDeviceId();
        }
    }
    private void setDeviceId(){
        device_Id=getDeviceId();
        app.setDeviceID(device_Id);
    }
    private String device_Id="";
    private String getDeviceId(){
        return  Utils.getDeviceImei(mContext);
    }

这样基本就可以搞定我们的权限问题了,当然为了用户更佳的体验感,可以加上请求权限的对话框之类的。

其次就是camera的问题,上面那个权限我们只要在配置文件里面写了该写的权限,就可以了,但是camera属于危险权限(google说的),因此,在6.0里,仅仅在配置文件里面写了还不够,还需要在程序里面向上面那样请求,但是表现的形式不一样,因为是危险权限,因此会有一个提示应用请求选线对话框,这个对话框是google系统自带的。

因此,写法也是一样,只要在permission改一下名字,改成:

private static String[] PERMISSION = {Manifest.permission.CAMERA};

其次就是在

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if(requestCode==0x12){
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                initCamera();
            } else {
                // Permission Denied
                Toast.makeText(this, "CALL_PHONE Denied", Toast.LENGTH_SHORT)
                        .show();
                finish();
            }
        }else{
            finish();
        }
    }

在这里上面加上初始化就好

谢谢~

    原文作者:北冰洋的旧船
    原文地址: https://blog.csdn.net/gan303/article/details/50895404
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞