Android 13中申请WRITE_EXTERNAL_STORAGE运行时权限问题求助
Android 13中申请外部存储写入权限的问题分析与解决
你的代码核心错误
- 你目标是申请
WRITE_EXTERNAL_STORAGE,但代码全程检查、申请的是ACCESS_FINE_LOCATION(精确定位权限),完全搞错了权限类型。 - 方法末尾直接返回
false,忽略权限申请状态,逻辑不合理。
Android 13(API 33)的外部存储权限变化
Android 13开始废弃WRITE_EXTERNAL_STORAGE权限,根据文件类型不同,权限规则有以下调整:
1. 访问媒体文件(图片、视频、音频)
- 读取媒体文件:需按需申请
READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO权限。 - 写入媒体文件:Android 13及以上无需额外权限,可直接写入系统媒体集合。
2. 访问非媒体文件(文档、下载目录的非媒体文件等)
- 需要申请
MANAGE_EXTERNAL_STORAGE特殊权限,该权限无法通过常规弹窗申请,必须引导用户到系统设置手动开启;且Google Play对该权限的使用场景审核严格,仅允许文件管理器类等必要应用使用。
修正后的代码示例
场景一:处理媒体文件
第一步:在Manifest中声明权限
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 按需添加READ_MEDIA_VIDEO、READ_MEDIA_AUDIO -->
第二步:权限检查与申请代码
private boolean checkMediaPermissions() { // 以读取图片权限为例 int imagePermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_MEDIA_IMAGES); if (imagePermission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_MEDIA_IMAGES}, 100); return false; } return true; } // 处理权限申请回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 100) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予成功,执行媒体文件相关操作 } else { // 权限被拒绝,可提示用户开启权限 } } }
场景二:处理非媒体文件
第一步:在Manifest中声明权限
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" />
第二步:权限检查与引导开启代码
private boolean checkManageStoragePermission() { if (!Environment.isExternalStorageManager()) { // 跳转到系统设置页面引导开启权限 Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null); intent.setData(uri); startActivityForResult(intent, 200); return false; } return true; } // 处理设置页面返回结果 @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 200) { if (Environment.isExternalStorageManager()) { // 权限已开启,执行非媒体文件操作 } else { // 用户未开启权限,无法进行相关操作 } } }
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

