持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
前言
虽然现在安卓的系统版本已经到13了,而且也刚刚发布了,但是对于权限这块的设置由来,我还是想说一下,对于已经完全熟知的朋友完全可以略过,我只是把它作为我们的基础开发中的一个小章节。
缘由
安卓6.0发布之后,官方的说明中对系统的权限做了重新设置,在我们使用的运行环境小于23的时候,所有的权限都是在我们的manifest种声明就可以直接使用了,但是6.0之后用户不仅要在manifest中配置权限,如果某些权限在App运行过程中就需要,那么就需要向用户询问是否授权,此时系统会弹出一个对话框让用户选择确认或者取消授权,有的权限如果用户不给予授权APP是无法正常使用的,比如网络权限。最重要的一点是,这些授权是需要开发者自己手动调用,而且样式是系统的。
举个栗子
我们在开发中经常会用到上传头像,比如修改个人信息,就有修改头像,这个时候一般我们都会提供一个底部弹框,一个选择相册,一个拍照,如果在23之前,就直接可以调起系统的相册或者是调起系统的拍照进行拍照,但是23之后,我们需要先申请相册权限和拍照权限才可以使用。具体代码如下:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
清单中的配置还是需要的。
//权限列表
String[] permissions = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
};
private final int permissionCode = 0x001;//权限请求码
private AlertDialog alertDialog;
private void checkPermission(){
List permissionList = new ArrayList<>();
if (Build.VERSION.SDK_INT >= 23) {
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(permissions[i]);
}
}
if (permissionList.size() <= 0) {
//已经全部授权
openDialog();
} else {
//还有未授权
ActivityCompat.requestPermissions(this, permissions, permissionCode);
}
}
}
//授权后回调函数
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean isContinuePermission = false;
if (permissionCode == requestCode) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == -1) {
isContinuePermission = true;
}
}
if (isContinuePermission) {
needPermission();
} else {
openDialog();
}
}
}
//打开手动设置应用权限
private void needPermission() {
if (alertDialog == null) {
alertDialog = new AlertDialog.Builder(this)
.setTitle("授权提示")
.setMessage("请前往设置页面授予当前应用相机权限")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.cancel();
Uri packageURI = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.cancel();
}
}).create();
}
alertDialog.show();
}
弹框的代码自己实现咯,这边就简单的贴了需要授权的步骤以及实现,提示信息以及授权的文案自己根据需求来定,我只简单描述了下,弹框也可以自己根据业务封装,权限列表也可以自己动态设置。这里就简单以相机权限来说明,开发中还有很多其他的权限都需要通过这样的方式来授权,所以我们最好是封装起来,现在已经有封装好的权限库,比如soulPermission,easypermission等等,都可以直接使用了。