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
相关产品推荐
相关产品推荐

