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: 继续执行业务代码
}

全文完。

posted @ 2025-07-01 14:57  安联酋长  阅读(60)  评论(0)    收藏  举报