android6.0权限管理

android6.0的全新的权限管理机制

简介

不知不觉android已经出了android7.0的预览版了。但是android6.0的普及程度不高,比例没有超过2%.
这里写图片描述
但是Android6.0权限管理比较之前的版本有了很大的改进。android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西。但是大部分的第三方的系统,很早之前就可以在安装的时候进行权限的管理了。终于在在android6.0棉花糖,app将不会在安装的时候授予权限。取而代之的是,app不得不在运行时一个一个询问用户授予权限。
即使用户在安装的时候,赋予了应用程序全部的使用权限 ,但是用户依旧可以在设置里面 取消相关的权限设置。
这里写图片描述

版本问题

在应用程序设置targetSdkVersion为23是需要适配Android6.0最新的权限管理机制。如果不对于权限管理做任何的操作如果用户禁止了相关权限,就会出现程序停止运行的状况。
配置targetSdkVersion:
这里写图片描述
程序异常日志:

代码实现

1.检查相关权限是否被允许。

/**
     *适用于最小SDK  23(android m)
     * @param permission    对应的权限.格式:Manifest.permission.ACCOUNT_MANAGER
     * @return    true:权限已经分配    false: 需要弹出对话框来设置权限:
     * codeing :    requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
     */
    public static List<String> isThatPermissionGranted(Context context,String... permission)
    {
        List<String> list = new ArrayList<>();
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
        {
            return list;
        }
        for(String str : permission)
        {
            if (GlobalApplication.getInstance().checkSelfPermission(str)
                    != PackageManager.PERMISSION_GRANTED)
            {
                list.add(str);
            }
        }
        return  list;
    }

2.

/**
     *是否應該顯示對話框
     * @param permissions
     */
    public static List<String> shouldShowDialog(Activity context,String... permissions)
    {
        List<String> list = new ArrayList<>();
        if(permissions.length < 0  || Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
        {
            return  list;
        }
        else
        {
            for (String str : permissions)
            {
                if(!context.shouldShowRequestPermissionRationale(str))
                {
                    list.add(str);
                }
            }
        }
        return list;
    }

3.

List<String> list =
                PermissionManager.PermissionV4.isThatPermissionGranted(this,
                        Manifest.permission.RECEIVE_SMS,Manifest.permission.READ_SMS);
        LogUtils.i(TAG, "list size " + list.size());
        if(list != null && list.size() > 0)
        {
            final List<String> list1 =
                    PermissionManager.PermissionV4.shouldShowDialog(this,
                            Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS);
            if(list1 != null && list1.size() > 0)
            {
                    showMessageOKCancel("You need to allow access to Contacts",
                            new DialogInterface.OnClickListener()
                            {
                                @Override
                                public void onClick(DialogInterface dialog, int which)
                                {
                                    ActivityCompat.requestPermissions(BossLoginActivity.this,
                                            list1.toArray(new String[list1.size()]),
                                            REQUEST_CODE_SOME_FEATURES_PERMISSIONS);
                                }
                            });
                    return;

            }
            ActivityCompat.requestPermissions(BossLoginActivity.this, list.toArray(new String[list.size()]),
                    REQUEST_CODE_SOME_FEATURES_PERMISSIONS);
        }
        else
        {
            LogUtils.i(TAG," register broad cast ");
            SmsBroadcast smsBroadcast = new SmsBroadcast();
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.provider.Telephony.SMS_RECEIVED");
            registerReceiver(smsBroadcast, filter);
        }

4.

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
    {
        switch (requestCode)
        {
            case REQUEST_CODE_SOME_FEATURES_PERMISSIONS:
                for(int i=0;i<permissions.length;i++)
                {
                    if(grantResults[i] == PackageManager.PERMISSION_GRANTED)
                    {
                        LogUtils.i(TAG,"permisssion granted "+permissions[i]);
                        SmsBroadcast smsBroadcast = new SmsBroadcast();
                        IntentFilter filter = new IntentFilter();
                        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
                        registerReceiver(smsBroadcast, filter);
                    }
                    else
                    {
                        LogUtils.i(TAG,"permisssion deny "+permissions[i]);
                    }
                }
                break;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

5.兼容其他版本。

 public static class PermissionV4
    {
        /**
         *适用于最小SDK  23(android m)
         * @param permission    对应的权限.格式:Manifest.permission.ACCOUNT_MANAGER
         * @return    true:权限已经分配    false: 需要弹出对话框来设置权限:
         * codeing :    requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
         */
        public static List<String> isThatPermissionGranted(Context context,String... permission)
        {
            List<String> list = new ArrayList<>();
            if(permission.length <= 0)
            {
                return  list;
            }
            for(String str : permission)
            {
                if (ContextCompat.checkSelfPermission(context,str)
                        != PackageManager.PERMISSION_GRANTED)
                {
                    list.add(str);
                }
            }
            return list;
        }


        /**
         *是否應該顯示對話框
         * @param permissions
         */
        public static List<String> shouldShowDialog(Activity context,String... permissions)
        {
            List<String> list = new ArrayList<>();
            if(permissions.length < 0  || Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
            {
                return  list;
            }
            else
            {
                for (String str : permissions)
                {
                    if(!ActivityCompat.shouldShowRequestPermissionRationale(context,str))
                    {
                        list.add(str);
                    }
                }
            }
            return list;
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值