无法访问 API-29 中的外部存储

Posted

技术标签:

【中文标题】无法访问 API-29 中的外部存储【英文标题】:Can't access external storage in API-29 【发布时间】:2020-06-09 12:32:48 【问题描述】:

以下代码在较低的 API-29 中运行良好。但是在使用 API-29 时,它会拒绝访问外部存储错误。

public void persistFile(byte[] bytes, String path, String fileName) throws IOException 
    OutputStream fOut = null;
    File picDirectory = new File(path);
    File file = new File(path, fileName); 
    fOut = new FileOutputStream(file);
    fOut.write(bytes); 
    fOut.flush();  
    fOut.close();  

androidManifest.xml

<manifest>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>

【问题讨论】:

【参考方案1】:

在 Android 10 上,您的应用私有目录之外的文件路径默认没有价值,您可以暂时启用 requestLegacyExternalStorage 直到 Android 11(现已推出预览版)

见https://developer.android.com/training/data-storage

今后最好只使用媒体存储或存储访问框架

https://developer.android.com/training/data-storage/shared

【讨论】:

【参考方案2】:

在清单应用标签中添加android:requestLegacyExternalStorage="true"

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10 or higher. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

【讨论】:

抱歉,我误会了:一旦您的 targetSdkVersion 升至 30 或更高版本(或当前开发者预览版中的 "R"),这将无法在 Android 11 上运行。见developer.android.com/preview/privacy/storage#scoped-storage 谢谢。我看到了。 :(

以上是关于无法访问 API-29 中的外部存储的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Q 中从外部存储访问照片

无法访问其他应用程序创建的外部存储中的文件

从 nuxtjs 中的外部 js 文件访问存储

无法使用 Pyspark 访问外部 Hive 元存储

授予用户对所有外部存储桶的访问权限,但排除我们自己的帐户存储桶

获取 Android 4.3 中的外部存储列表