Android 13环境下Java开发的应用无法获取文本文件读取权限如何解决
Android 13 读取文本文件权限问题解决方法
Android 13(API 33)对文件访问权限做了重大调整:原有的READ_EXTERNAL_STORAGE权限仅对媒体文件(图片、视频、音频)生效,无法访问非媒体类型文件(如.txt)。针对这个问题,有两种可行的解决方案:
方案一:使用存储访问框架(SAF)推荐
这是Google官方推荐的方式,无需申请特殊权限,通过让用户手动选择文件来获取访问权,适用于大多数非文件管理器类应用。
代码实现
- 启动文件选择器:
private static final int REQUEST_CODE_OPEN_TXT = 1001; // 触发文件选择 public void openTextFilePicker() { Intent pickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT); pickerIntent.addCategory(Intent.CATEGORY_OPENABLE); // 指定仅选择文本文件 pickerIntent.setType("text/*"); startActivityForResult(pickerIntent, REQUEST_CODE_OPEN_TXT); }
- 处理选择结果并读取文件:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_OPEN_TXT && resultCode == RESULT_OK) { if (data == null) return; Uri fileUri = data.getData(); try (InputStream inputStream = getContentResolver().openInputStream(fileUri)) { BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder contentBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { contentBuilder.append(line).append("\n"); } String fileContent = contentBuilder.toString(); // 在这里处理读取到的文本内容 } catch (IOException e) { e.printStackTrace(); // 处理读取异常 } } }
方案二:申请MANAGE_EXTERNAL_STORAGE权限仅适用于文件管理器类应用
如果你的应用是文件管理器、备份工具这类需要全面访问文件系统的应用,可以申请这个特殊权限,但需要注意:Google Play会严格审核该权限的使用场景,非必要不建议使用。
步骤
- 在
AndroidManifest.xml中声明权限:
<!-- 针对Android 13+的全文件访问权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" /> <!-- 兼容Android 12及以下版本 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
- 检查并请求权限:
public void checkAndRequestStoragePermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // 检查是否已获得全文件访问权限 if (!Environment.isExternalStorageManager()) { Intent permissionIntent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); Uri packageUri = Uri.fromParts("package", getPackageName(), null); permissionIntent.setData(packageUri); startActivity(permissionIntent); } else { // 权限已获取,执行文件读取操作 readTextFile(); } } else { // 兼容Android 12及以下版本的旧权限逻辑 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1002); } else { readTextFile(); } } } // 示例:读取指定路径的文本文件 private void readTextFile() { File textFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "test.txt"); try (BufferedReader reader = new BufferedReader(new FileReader(textFile))) { StringBuilder contentBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { contentBuilder.append(line).append("\n"); } String fileContent = contentBuilder.toString(); // 处理文本内容 } catch (IOException e) { e.printStackTrace(); } }
额外注意事项
- 如果读取的是应用私有目录下的文件(如
getFilesDir()、getExternalFilesDir()),无需任何权限,可直接访问。 - 尽量优先使用SAF方案,既符合隐私政策,也能避免权限审核问题。
内容的提问来源于stack exchange,提问作者Patrick Renaud
相关产品推荐
相关产品推荐

