You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13环境下Java开发的应用无法获取文本文件读取权限如何解决

Android 13 读取文本文件权限问题解决方法

Android 13(API 33)对文件访问权限做了重大调整:原有的READ_EXTERNAL_STORAGE权限仅对媒体文件(图片、视频、音频)生效,无法访问非媒体类型文件(如.txt)。针对这个问题,有两种可行的解决方案:

方案一:使用存储访问框架(SAF)推荐

这是Google官方推荐的方式,无需申请特殊权限,通过让用户手动选择文件来获取访问权,适用于大多数非文件管理器类应用。

代码实现

  1. 启动文件选择器:
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);
}
  1. 处理选择结果并读取文件:
@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会严格审核该权限的使用场景,非必要不建议使用。

步骤

  1. 在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" />
  1. 检查并请求权限:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:25:12