我正在Android 11(SDK版本30)上编写一个新的应用程序,我根本找不到如何将文件保存到外部存储的示例。
我阅读了他们的文档,现在知道他们基本上忽略了清单权限(READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
),还忽略了manifest.xml应用程序标记中的android:requestLegacyExternalStorage="true"
。
在他们的文档https://developer.android.com/about/versions/11/privacy/storage中,他们写道,您需要启用DEFAULT_SCOPED_STORAGE
和FORCE_ENABLE_SCOPED_STORAGE
标志才能在应用中启用作用域存储。
我必须在哪里启用这些功能?当我完成这些功能时,我如何以及何时获得写入外部存储的实际权限?有人能提供工作代码吗?
我想保存. gif、. png和.mp3文件。所以我不想写图库。
先谢了。
5条答案
按热度按时间olmpazwi1#
对应所有API,包括API 30、Android 11:
现在,使用此
commonDocumentDirPath
保存文件。评论中的一个侧记,
getExternalStoragePublicDirectory
与某些范围现在与API 30,Android 11一起工作。干杯!感谢CommonsWare的提示。q7solyqu2#
您可以将文件保存到外部存储上的公共目录。
如文档,下载,DCIM,图片等。
以与版本10之前相同的方式。
t5fffqht3#
最简单的答案和测试(Java)
tvmytwxo4#
我正在使用这个方法,它对我真的很有效,我希望我能帮助你。如果你有什么不明白的地方,尽管问我
清单文件(添加权限)
5cnsuln75#
我知道这个问题有点老,但这里有一个工作的解决方案来组织您的文件在任何地方,除了根电话目录
首先在您的build. gradle文件中,实现SAF框架的DocumentFile类:
下一步调用此方法,请求SAF的操作权限(您只需在用户安装时执行一次此操作):
下一步存储一些永久权限:
可以对正确的文件调用documentFile的rename方法
您还可以使用内容解析程序打开InputStreams和OutputStreams,因为使用以下代码段向内容解析程序授予了对该DocumentFile的持久URI权限:
输入流用于读取,输出流用于保存
您可以使用列出文件
或者您可以使用以下方式列出文件:
它的运行速度比df. listFiles()方法快
Src(这是我自己的实现,但这里是原始的SF问题)重命名视频/图像,同时针对Android 11(Api 30)