首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android 11中实现新的存储API?

如何在Android 11中实现新的存储API?
EN

Stack Overflow用户
提问于 2021-05-22 02:35:39
回答 3查看 7.5K关注 0票数 7

场景

我有两个应用程序,一个是跟踪应用程序,它记录传入和传出的呼叫,并压缩这些文件,并通过Inter-Process Communication将这些文件上传到服务器上,将文件路径发送到主应用程序。

现在,我正在将这两个应用程序升级到Android11。在跟踪程序中,我使用MediaStore.Files API保存文件,并试图使用主应用程序中的文件路径读取这些文件。在读取文件时,File.canRead()在主应用程序中返回false。即使我尝试MediaStore API读取这些文件,它也返回空的Cursor

这里我有几个问题。

  1. 我能读取其他应用程序在Android 11上创建的文件吗?我在某个地方读到,你不能访问Android 11中的其他应用程序文件。
  2. 我的应用程序是否符合访问存储中所有文件的MANAGE_EXTERNAL_STORAGE 权限?
  3. 处理这种情况的最佳方法是什么?
  4. Storage Access Framework能帮我处理这个场景吗?

我在公共目录Documents/AppData/Audio中保存文件。请给我相关的工作链接。任何帮助都将不胜感激。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-22 13:31:03

我有两个应用程序,一个是跟踪应用程序,它记录传入和传出的呼叫并压缩这些文件,并通过进程间通信将文件路径发送到主应用程序,后者将这些文件上传到服务器。

这似乎太复杂了。

我能读取其他应用程序在Android 11上创建的文件吗?

从技术上讲,你不是在写文件。您正在MediaStore.Files中创建一个条目。其他应用程序无法读取您在MediaStore.Files中创建的条目。

我的应用程序是否有资格获得MANAGE_EXTERNAL_STORAGE访问存储中所有文件的权限?

我们不是谷歌。我们没有办法回答这个问题。不过,如果他们认为你的应用程序符合这个条件,我会大吃一惊。

处理这种情况的最佳方法是什么?

嗯,IMHO,到目前为止最好的方法是有一个应用程序,而不是两个。但我认为你现在还不能改变这种状况。

如果是,那么:

  • 让“跟踪器”应用程序将内容写入应用程序可以写入的文件系统目录中的文件。大多数情况下,这将通过Context上的方法实现,比如getFilesDir()getExternalCacheDir()
  • 让“跟踪器”应用程序使用FileProvider为该目录中的文件提供服务,并使用FileProvider.getUriForFile()获取指向该文件的Uri
  • 让“跟踪器”应用程序通过一些Intent-based机制(startActivity()startService()sendBroadcast()等)调用“主”应用程序。将前一个项目中的Uri放入Intent中,并将FLAG_GRANT_READ_URI_PERMISSION添加到该Intent中。
  • 让“主”应用程序使用ContentResolveropenInputStream()读取内容,传递从Intent副本中提取的Uri

Storage Access Framework能帮我处理这个场景吗?

您可以让用户在每个应用程序中使用。例如,您可以在每个应用程序中使用ACTION_OPEN_DOCUMENT_TREE,希望用户在每个应用程序中选择相同的树。就我个人而言,我会使用FileProvider,因为它不需要用户交互,也不需要用户做出很好的选择。

票数 2
EN

Stack Overflow用户

发布于 2021-05-22 07:11:48

与Android11API一样,MediaStore API只返回媒体文件。

所以,我会回答你有关的问题。

我能读取其他应用程序在Android 11上创建的文件吗?我在某个地方读到,你不能访问Android 11中的其他应用程序文件。

不是的!您无法访问存储在该特定应用程序的个人存储中的其他应用程序创建的文件。

我的应用程序是否有资格获得MANAGE_EXTERNAL_STORAGE访问存储中所有文件的权限?

据我所知,您的应用程序不需要外部存储来存储数据--它也可以在私有存储中完成,在那里您可以读写数据。如果你的应用程序有资格获得这个许可,那么你现在还不能使用它。这是由官方网站建议的,而不是要求这个权限,让目标API 29和使用android:requestLegacyExternalStorage=“真”在您的清单。点击这里阅读它。

处理这种情况的最佳方法是什么?

相反,您可以使用外部音频路径使用应用程序特定的文件夹来存储正在创建的归档文件。

Storage Access Framework能帮我处理这个场景吗?

我不太清楚IPC在两个应用程序之间是如何工作的,所以我不能确切地说使用存储框架会更好。

票数 3
EN

Stack Overflow用户

发布于 2021-05-22 07:28:08

接收应用程序可以使用SAF让用户选择您的目录。

或者更标准的:您有文件,因此您可以构建自己的文件/内容提供程序来服务您的文件。

如果您使用进程间通信(顺便说一句),您可以使用来自纵隔和FileProvider的uri一个接一个地服务您的文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67645587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档