android 动态申请写外部存储权限
从安卓11(Build.VERSION_CODES.R)开始,申请方式与之前版本有所不同,具体见下面注释。
这里用到了 EasyPermissions,需要在 build.gradle 里加入:
implementation libs.easypermissions.v300
在 libs.versions.toml 里加入:
[versions]
easypermissionsVersion = "3.0.0"
[libraries]
easypermissions-v300 = { module = "pub.devrel:easypermissions", version.ref = "easypermissionsVersion" }
申请权限的类里加入以下代码:
final int REQUEST_CODE_WES_PERMISSION = 1; // 权限申请码
/**
* 创建事件的响应方法。
* @param savedInstanceState 系统保存的实例状态
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_splash);
this.requestWESPermission();
}
/**
* 申请外部存储权限。
*/
private void requestWESPermission() {
boolean isExternalStorageManager;
final String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
// 判断是否已有权限
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
// 安卓10及以前版本
isExternalStorageManager = EasyPermissions.hasPermissions(this, permissions);
} else {
// 安卓11及以后版本
isExternalStorageManager = Environment.isExternalStorageManager();
}
if (isExternalStorageManager) {
TODO: 已经有权限了,继续执行业务代码
} else {
// 没有写外部存储权限则申请
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
// 安卓10及以前版本
EasyPermissions.requestPermissions(this, super.getString(R.string.need_permission), REQUEST_CODE_WES_PERMISSION, permissions);
} else {
// 安卓11及以后版本
final Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
final Uri uri = Uri.parse("package:" + super.getPackageName());
intent.setData(uri);
super.startActivityForResult(intent, REQUEST_CODE_WES_PERMISSION);
}
}
}
/**
* 获取到申请权限结果事件的响应方法。
* @param requestCode 申请码
* @param permissions 所有申请的权限
* @param grantResults 所有权限的申请结果
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
// 判断用户是允许还是拒绝权限
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
TODO: 被拒绝后的处理,比如提示用户如果拒绝则某些功能无法正常运行
}
}
TODO: 继续执行业务代码
}
全文完。

浙公网安备 33010602011771号