Android6.0以上权限管理问题(权限被拒绝后)

原创 2017年04月13日 17:02:24

          写之前,先发个牢骚,特么天天加班,感觉身体被掏空了........................

         -------------------------------------------------------------------------------------------------------------------------

          回到正题,对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装(比如是个app都要访问通讯录、短信,SD卡,相机等)。而在6.0以后,我们可以直接安装,当app需要我们授予不恰当的权限的时候,我们可以予以拒绝(比如:获取短信,SD卡,我一般都是拒绝的)。当然你也可以在设置界面对每个app的权限进行查看,以及对单个权限进行授权或者解除授权。Android6.0添加了运行时权限,用户可以在已安装的app上立刻同意或者拒绝权限,那么就意味着我们在使用APP的时候,当一个app会使用一些危险权限的时候就会提示用户是否授权.新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等。

那么这个权限机制对于用户来说是挺好的,但是对于我们开发人员来讲,却又多了一种适配-权限适配.

就拿申请访问SD卡来说吧,如果用户在第一次弹出授权申请的时候,用户选择了拒绝并不再提示,那么我们访问SD卡的路径就会出错.那么怎么去避免出错呢.

我的解决思路是,先判断权限,再去决定是否响应事件.然后根据回调函数判断是否授权.未授权弹出dialog提示用户去开启权限.

判断当前版本是否为6.0及以上(在清单文件中已经申请权限了)

 if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
                   ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                            PermissionsUtils.REQUEST_EXTERNAL_STORAGE);
               }else {
                    //正常响应事件
               }
回调函数

@Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);

            switch (requestCode){
                case PermissionsUtils.REQUEST_EXTERNAL_STORAGE:

                    if(grantResults.length>0 && grantResults[0]== PackageManager.PERMISSION_GRANTED){
                        //已获取权限
                  
                        //响应事件
                    }else{
                        //权限被拒绝
                       
                        new SimpleBaseDialog(this, "需要开启权限后才能使用", "去设置", "取消", new SimpleClickListener() {
                        @Override
                        public void ok() {
                            Intent intent=CMethod.getAppDetailSettingIntent(PulishWriteActivity.this);
                            startActivity(intent);
                        }
                        @Override
                        public void cancle() {

                        }
                    }).show();
                    }

                    break;
           }    
 /**
     * 获取应用详情页面intent
     *
     * @return
     */
    public static Intent getAppDetailSettingIntent(Context context) {
        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", context.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", context.getPackageName());
        }
        return localIntent;
    }
最后附上一个工具类

public class PermissionUtils {

    public static final int MY_PERMISSIONS_REQUEST_CODE=10001;

    public static boolean checkAudioPermission(Context context){  //检查麦克风权限 ,写入文件,读出文件权限
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO)
                != PackageManager.PERMISSION_GRANTED) {
            //申请RECORD_AUDIO  WRITE_EXTERNAL_STORAGE  READ_EXTERNAL_STORAGE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //申请RECORD_AUDIO  WRITE_EXTERNAL_STORAGE  READ_EXTERNAL_STORAGE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //申请RECORD_AUDIO  WRITE_EXTERNAL_STORAGE  READ_EXTERNAL_STORAGE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else{
            //权限已经允许   请执行下一步操作
//            Toast.makeText(context,"Permission Granted",Toast.LENGTH_LONG).show();
            return true;
        }
        return false;
    }

    public static boolean checkCameraPermission(Context context){  //检查拍照权限 ,写入文件,读出文件权限
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            //CAMERA  WRITE_EXTERNAL_STORAGE  READ_EXTERNAL_STORAGE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //CAMERA  WRITE_EXTERNAL_STORAGE  READ_EXTERNAL_STORAGE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //CAMERA  WRITE_EXTERNAL_STORAGE  READ_EXTERNAL_STORAGE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else{
            return true;
        }
        return false;
    }

    public static boolean checkCameraScanPermission(Context context){  //检查拍照权限
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            //CAMERA 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else{
            return true;
        }
        return false;
    }

    public static boolean checkExternalStoragePermission(Context context){  //检查写入文件,读出文件权限
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //CAMERA  WRITE_EXTERNAL_STORAGE  READ_EXTERNAL_STORAGE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //CAMERA  WRITE_EXTERNAL_STORAGE  READ_EXTERNAL_STORAGE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else{
            return true;
        }
        return false;
    }

    public static boolean checkLocationPermission(Context context){  //检查获取位置权限
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            //ACCESS_COARSE_LOCATION  ACCESS_FINE_LOCATION 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            //ACCESS_COARSE_LOCATION  ACCESS_FINE_LOCATION 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else{
            //权限已经允许   请执行下一步操作
//            Toast.makeText(context,"Permission Granted",Toast.LENGTH_LONG).show();
            return true;
        }
        return false;
    }

    public static boolean checkContactsPermission(Context context){  //检查获取联系人权限
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            //READ_CONTACTS  GET_ACCOUNTS 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED){
            return true;
        }
        return false;
    }

    public static boolean checkSendSMSPermission(Context context){  //检查获取发短信权限
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.SEND_SMS)
                != PackageManager.PERMISSION_GRANTED) {
            //SEND_SMS 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.SEND_SMS},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else{
            //权限已经允许   请执行下一步操作
//            Toast.makeText(context,"Permission Granted",Toast.LENGTH_LONG).show();
            return true;
        }
        return false;
    }

    public static boolean checkPhonePermission(Context context){  //检查获取电话权限
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            //READ_PHONE_STATE  CALL_PHONE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.CALL_PHONE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else if (ContextCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED) {
            //READ_PHONE_STATE  CALL_PHONE 权限
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.CALL_PHONE},
                    MY_PERMISSIONS_REQUEST_CODE);
        }else{
            //权限已经允许   请执行下一步操作
//            Toast.makeText(context,"Permission Granted",Toast.LENGTH_LONG).show();
            return true;
        }
        return false;
    }}

that's all THX











                    
版权声明:本文为博主原创文章,未经博主允许不得转载。

android运行时权限解决办法(含有申请权限已授权、权限被拒绝、权限勾选不在提示的回调)

先说明一下: 1、android运行时权限已经不是新东西了,我始终没在工程中实现。(因为有个方法,就是把targetSdkVersion控制在23 Android 6.0以下,系统为了兼容老客户端...
  • u010823943
  • u010823943
  • 2017年02月24日 23:11
  • 5241

Android6.0运行时权限,拒绝了权限还返回获取成功

如题: 推荐一个很好的项目:AndPermission 不用回来感谢了喂!这个问题在项目中,一直存在, 主要是第三方厂商各种改,返回的状态不正常; 主要解决思路: 在第三方成功获取权限时, ...
  • azhansy
  • azhansy
  • 2017年07月01日 18:11
  • 645

android 请求权限被拒处理方法(使用于6.0以下系统)

**android 请求权限被拒处理方法(使用于6.0以下系统)** 最近处理BUG,发现部分手机拒绝我拍照的请求权限之后,程序会崩溃。由于Android系统在6.0以下是没有动态权限管理的,只有在M...
  • qq_29967217
  • qq_29967217
  • 2016年06月13日 19:53
  • 4189

android用户拒绝权限

------------------------------------------------HNQ-------------------------------------------------...
  • hunanqi
  • hunanqi
  • 2016年05月12日 16:54
  • 1769

安卓android6.0权限管理,支持同时管理多个权限,权限被拒绝后的处理,并可在设置中进行更改权限

  • 2017年04月26日 16:09
  • 19.52MB
  • 下载

android6.0开发中遇到的权限坑

android的权限在23以下的版本中自动授权,而这个版本及以上需要用户手动授权。这对用户隐私来说当然有好处,比如我不想app获取我的位置。对开发来说,虽然麻烦是避免不了了,但是也不是很蛋疼。 对于...
  • little_shengsheng
  • little_shengsheng
  • 2016年10月28日 15:59
  • 945

android各大手机系统打开权限管理页面

最近项目上比较忙,终于有空闲时间写写东西了。 相信做过android的都知道,现在的手机系统五花八门,当我们去请求用户的权限的时候,总是会弹出是否允许的对话框。 而且用户一旦不小心点了拒绝,下次就不再...
  • vinoMVP
  • vinoMVP
  • 2016年08月17日 10:15
  • 14293

Android如何在app中通过一个按钮直接跳转到的系统的权限设置页面

续上一篇《Android的权限设置及自启动设置》,在开发中我通过一个按钮来进行跳转到系统的权限页面,一开始的代码就是上一篇中的原模原样的代码,如下所示: /** * 跳转到权限设置...
  • cbbbc
  • cbbbc
  • 2017年03月03日 21:01
  • 4546

Android 6.0以上权限拒绝打开权限设置界面

本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小...
  • qq_16382309
  • qq_16382309
  • 2016年06月21日 09:34
  • 2350

解决Android6.0+拨打电话权限问题

针对即使获取了拨打电话的权限依然报错问题的解决方案 private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1; // 检查...
  • lty406910111
  • lty406910111
  • 2017年02月21日 16:42
  • 5075
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android6.0以上权限管理问题(权限被拒绝后)
举报原因:
原因补充:

(最多只允许输入30个字)