首页 > Java > java教程 > 正文

Android 11 存储权限获取指南

花韻仙語
发布: 2025-09-11 23:41:01
原创
580人浏览过

android 11 存储权限获取指南

本文旨在帮助开发者解决在 Android 11 (API level 30) 及以上版本中获取存储权限的问题。由于 Android 11 引入了分区存储机制,传统的存储权限申请方式可能不再适用。本文将详细介绍如何在 Android 11 中正确申请和处理存储权限,包括清单文件配置、权限请求以及运行时权限处理等关键步骤,并提供相应的代码示例,助您顺利完成应用适配。

Android 11 引入了分区存储 (Scoped Storage) 机制,旨在增强用户隐私和数据安全。这意味着应用程序默认情况下只能访问其自身创建的文件以及特定的公共目录。如果您的应用需要访问更广泛的外部存储,您需要进行额外的权限申请和处理。

1. 清单文件配置

首先,需要在 AndroidManifest.xml 文件中进行必要的配置。

重要: android:requestLegacyExternalStorage="true" 在 targetSdkVersion 大于等于 30 时将不再生效。因此,依赖此属性来获取传统存储权限的方法不再可行。

如果您需要申请 "所有文件访问权限" (All files access),则无需声明任何存储权限。但是,您需要在代码中检查并请求 MANAGE_EXTERNAL_STORAGE 权限。

2. 权限请求

根据您的应用需求,选择合适的权限请求方式。

  • 访问应用特定目录和媒体文件: 这是推荐的方式,应用应该尽可能使用分区存储提供的API,例如 MediaStore API 来访问媒体文件。

  • 申请 "所有文件访问权限" (All files access): 仅当您的应用的核心功能需要访问设备上的所有文件时,才应申请此权限。例如,文件管理器、备份应用等。

    存了个图
    存了个图

    视频图片解析/字幕/剪辑,视频高清保存/图片源图提取

    存了个图 17
    查看详情 存了个图

    以下是申请 "所有文件访问权限" 的步骤:

    1. 检查是否已授权:
    if (!Environment.isExternalStorageManager()) {
        // 未授权,需要请求权限
    }
    登录后复制
    1. 请求权限:
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    Uri uri = Uri.fromParts("package", this.getPackageName(), null);
    intent.setData(uri);
    startActivity(intent);
    登录后复制

    这段代码会打开系统设置界面,允许用户手动授予应用 "所有文件访问权限"。

3. 运行时权限处理

在 Android 6.0 (API level 23) 及以上版本中,需要在运行时检查和请求权限。对于 Android 11,READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限在 targetSdkVersion 大于等于 30 时,行为会发生变化。

如果您的应用需要兼容旧版本,可以使用以下代码进行权限请求:

private static final int REQUEST_CODE_PERMISSION = 1;

private void requestStoragePermissions() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // Android 11 及以上
        if (!Environment.isExternalStorageManager()) {
            try {
                Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                intent.setData(Uri.fromParts("package", getPackageName(), null));
                startActivityForResult(intent, REQUEST_CODE_PERMISSION);
            } catch (Exception e) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                startActivityForResult(intent, REQUEST_CODE_PERMISSION);
            }
        } else {
            // 已经拥有所有文件访问权限
            // 执行相关操作
        }
    } else {
        // Android 10 及以下
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_CODE_PERMISSION);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_PERMISSION) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            if (Environment.isExternalStorageManager()) {
                // 用户授予了所有文件访问权限
                // 执行相关操作
            } else {
                // 用户拒绝了权限
                // 进行相应的处理,例如提示用户或禁用相关功能
            }
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CODE_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户授予了权限
            // 执行相关操作
        } else {
            // 用户拒绝了权限
            // 进行相应的处理,例如提示用户或禁用相关功能
        }
    }
}
登录后复制

注意事项:

  • 在 onActivityResult 中检查 Environment.isExternalStorageManager() 以确认用户是否授予了 "所有文件访问权限"。
  • 在 onRequestPermissionsResult 中处理 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限的授予情况。
  • 当用户拒绝权限时,提供清晰的解释,说明为什么应用需要这些权限,并引导用户前往设置界面手动授予权限。

4. 总结

在 Android 11 及以上版本中获取存储权限需要特别注意分区存储机制的变化。您需要根据应用的需求选择合适的权限申请方式,并正确处理运行时权限。尽量使用分区存储提供的 API,避免过度申请权限,以保护用户隐私。 确保您的应用遵循 Android 的最佳实践,并提供清晰的用户体验。

以上就是Android 11 存储权限获取指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号