引言
自从升级到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_CALENDARgroup:android.permission-group.CAMERA
permission:android.permission.CAMERAgroup:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIOgroup: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);
}
});
}