Android权限适配

引言

自从升级到android的23版本后,Google对Android权限进行了调整,增加了运行时的权限Runtime Permission,6.0以上的设备如果没有进行适配,会获取不到权限,当然如果你还没准备好适配权限,把targetSDK设置成小于23就ok了,其实简单的权限适配并不是很难,下面我们就一起来看下权限的适配问题

权限种类
Google将权限分成了两类,一个是正常权限,一类是涉及到用户隐私的权限,需要用户主动授权才可以使用,请看下图

注:可以通过adb shell pm list permissions -d -g 查看危险权限(需要用户授权的权限)

  • group:android.permission-group.CALENDAR
    permission:android.permission.READ_CALENDAR
    permission:android.permission.WRITE_CALENDAR

  • group:android.permission-group.CAMERA
    permission:android.permission.CAMERA

  • group:android.permission-group.SENSORS
    permission:android.permission.BODY_SENSORS

  • group:android.permission-group.LOCATION
    permission:android.permission.ACCESS_FINE_LOCATION
    permission:android.permission.ACCESS_COARSE_LOCATION

  • group:android.permission-group.STORAGE
    permission:android.permission.READ_EXTERNAL_STORAGE
    permission:android.permission.WRITE_EXTERNAL_STORAGE

  • group:android.permission-group.MICROPHONE
    permission:android.permission.RECORD_AUDIO

  • group:android.permission-group.SMS
    permission:android.permission.READ_SMS
    permission:android.permission.RECEIVE_WAP_PUSH
    permission:android.permission.RECEIVE_MMS
    permission:android.permission.RECEIVE_SMS
    permission:android.permission.SEND_SMS
    permission:android.permission.READ_CELL_BROADCASTS

扯得有点远了,还是回到权限申请这里吧

首先我们需要统计出来需要什么权限

public static final String[] requestPermissions = {
            PERMISSION_RECORD_AUDIO,
            PERMISSION_GET_ACCOUNTS,
            PERMISSION_READ_PHONE_STATE,
            PERMISSION_CALL_PHONE,
            PERMISSION_CAMERA,
            PERMISSION_ACCESS_FINE_LOCATION,
            PERMISSION_ACCESS_COARSE_LOCATION,
            PERMISSION_READ_EXTERNAL_STORAGE,
            PERMISSION_WRITE_EXTERNAL_STORAGE,
            PERMISSION_BLUETOOTH_ADMIN,
            PERMISSION_BLUETOOTH,
            PERMISSION_SYSTEM_ALERT_WINDOW,
            PERMISSION_WRITE_SETTINGS
    };

然后在页面初始化的时候,判断当前设备的版本号是否大于等于23

// 定义一个回调的code值
public static final int CODE_MULTI_PERMISSION = 100;

protected boolean checkUriPermission(Activity activity, PermissionUtils.PermissionGrant grant) {
        if (android.os.Build.VERSION.SDK_INT >= 23) {
//            if (!Settings.canDrawOverlays(this)) {
//                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
//                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                startActivityForResult(intent, 1);
//            }
            int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (hasWriteContactsPermission != PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(activity, PermissionUtils.requestPermissions,
                        CODE_MULTI_PERMISSION);
//                ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
//                        PermissionUtils.CODE_WRITE_EXTERNAL_STORAGE);
//                requestMulti(activity, grant);
                return false;
            }
            return true;
        }
        return true;
    }
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        PermissionUtils.requestPermissionsResult(this, requestCode, permissions, grantResults, mPermissionGrant);
        switch (requestCode) {
            case PermissionUtils.CODE_MULTI_PERMISSION:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED
                        && grantResults[2] == PackageManager.PERMISSION_GRANTED && grantResults[3] == PackageManager.PERMISSION_GRANTED
                        && grantResults[4] == PackageManager.PERMISSION_GRANTED && grantResults[5] == PackageManager.PERMISSION_GRANTED
                        && grantResults[6] == PackageManager.PERMISSION_GRANTED && grantResults[7] == PackageManager.PERMISSION_GRANTED
                        && grantResults[8] == PackageManager.PERMISSION_GRANTED && grantResults[9] == PackageManager.PERMISSION_GRANTED
                        && grantResults[10] == PackageManager.PERMISSION_GRANTED) {
                    initData();
                    animation();
                } else {
//                    showToast("授权失败,退出登录");
//                    finish();
                }
                break;
            default:
                break;
        }
    }

到这里基本权限适配就完事了,当然这只是简单的权限适配,网上还有很多适配的框架呢,使用起来都是很简单的。

我们也可以提示用户,让其跳转至权限管理界面,主动选择授予的权限

    private static void openSettingActivity(final Activity activity, String message) {

        showMessageOKCancel(activity, message, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Log.d(TAG, "getPackageName(): " + activity.getPackageName());
                Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
                intent.setData(uri);
                activity.startActivity(intent);
            }
        });
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值