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

Android 10设备无法复制PDF至Documents文件夹的问题排查

问题原因及解决方法

1. 权限请求代码错误

你的askForPermissions()方法中,申请写入权限时传递的权限常量错误,导致实际并未获取到WRITE_EXTERNAL_STORAGE权限:

// 原错误代码
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, WRITE_PERMISSION_REQUEST_CODE);

应修改为:

// 修正后
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_PERMISSION_REQUEST_CODE);

2. 未确保目标目录存在

代码中仅创建了File对象表示Documents/PDF目录,但未调用方法创建该目录。如果目录不存在,FileOutputStream会抛出FileNotFoundException,导致写入失败。

在copyPDF()方法中,创建dir对象后需添加目录创建逻辑:

File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath() + "/PDF");
// 新增:检查并创建目录(包括父目录)
if (!dir.exists()) {
    boolean isCreated = dir.mkdirs();
    if (!isCreated) {
        Log.e("CopyPDF", "Failed to create target directory");
        return;
    }
}

3. 异常处理不完善

当前代码仅通过e.printStackTrace()打印异常,无法直观看到错误原因。建议添加日志输出,方便排查问题:

catch (IOException e) {
    Log.e("CopyPDF", "Copy failed: " + e.getMessage(), e);
    Toast.makeText(context, "PDF复制失败", Toast.LENGTH_SHORT).show();
}

补充:Android 10(API 29)适配注意事项

虽然Environment.getExternalStoragePublicDirectory()在API 29被标记为废弃,但在API 29-32版本中,配合WRITE_EXTERNAL_STORAGE权限仍可正常使用。如果后续需要适配更高版本(API 33+),建议改用MediaStore或**Storage Access Framework(SAF)**来操作公共目录文件。

内容的提问来源于stack exchange,提问作者shahriar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:45:20