运行时请求权限
好处:
1)简化应用安装过程,因为用户在安装或更新应用时不需要授予权限;
2)让用户可以对应用的功能进行更多控制。
权限分类:正常权限 + 危险权限(会授予应用访问用户机密数据的权限)
一下图片是官方文档总结的10组26种危险权限。
所有Android版本中,都需要在应用清单中同时声明它需要的正常权限和危险权限。声明权限会在不同的Android版本中有所差异。
- 低版本SDK为22或更低,如果您在清单中列出了危险权限,则用户必须在安装应用时授予权限;如果他们不授予此权限,系统根本不会安装应用。
- 高版本SDK为23或更高,应用必须在清单中列出权限,并且在运行时请求其需要的没想危险权限。用户可以授予或拒绝每项权限。即使用户拒绝权限请求,应用仍可以继续运行有限的功能。
步骤:
- 检查权限
- 请求权限
- 处理权限请求响应
如下图是ContextCompat类的用来检查权限的方法,第二个参数传Manifest.permission.WRITE_EXTERNAL_STORAGE类似这样的值。返回值由两种。PackageManager.PERMISSION_DENIED和PackageManager.PERMISSION_GRANTED。
checkSelfPermission.PNG
如下图是ActivityCompat类用来解释应用为什么需要权限的方法,初次使用时返回值时false,当用户拒绝权限再次点击的时候,返回值是true。
shouldShow.PNG
如下图是ActivityCompat类用来请求权限的方法
requestPermissions.PNG
onRequestPermissionsResult回调方法
{
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback,
TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider
public class FragmentActivity extends BaseFragmentActivityApi16 implements
ViewModelStoreOwner,
ActivityCompat.OnRequestPermissionsResultCallback,
ActivityCompat.RequestPermissionsRequestCodeValidator
}
以上代码可以看出Activity已经实现了ActivityCompat.OnRequestPermissionsResultCallback接口。
@TargetApi(Build.VERSION_CODES.M)
private void checkPermission() {
int checkSelfPermission = ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (checkSelfPermission == PackageManager.PERMISSION_DENIED) {
boolean b = ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
Log.d(TAG, "checkPermission: b = " + b);
//首次为false,用户拒绝之后为true
if (b) {
new AlertDialog.Builder(this)
.setMessage("申请权限")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 请求您需要的权限
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
}
})
.create()
.show();
} else {
// 请求您需要的权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
}
} else if (checkSelfPermission == PackageManager.PERMISSION_GRANTED) {
write();
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
write();
}
}
}
网友评论