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

如何在Android 11中实现新的存储API?,android,mediastore,android-11,storage-access-framework,scoped-storage,Android,Mediastore,Android 11,Storage Access Framework,Scoped Storage,场景 我有两个应用程序,一个是Tracker应用程序,它记录呼入和呼出的电话并压缩这些文件,然后通过进程间通信将文件路径发送到主应用程序,后者将这些文件上传到服务器 现在我正在将这两个应用升级到Android 11。在Tracker应用程序中,我正在使用MediaStore.Files API保存文件,并尝试使用主应用程序中的文件路径读取这些文件。读取文件时,在主应用程序中返回false。即使我尝试mediastoreapi读取这些文件,它也会返回空的Cursor 这里我有几个问题 我可以读取A

场景

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

现在我正在将这两个应用升级到Android 11。在Tracker应用程序中,我正在使用
MediaStore.Files API
保存文件,并尝试使用主应用程序中的文件路径读取这些文件。读取文件时,在主应用程序中返回
false
。即使我尝试
mediastoreapi
读取这些文件,它也会返回空的
Cursor

这里我有几个问题

  • 我可以读取Android 11上其他应用程序创建的文件吗?我在某个地方读到,你不能访问Android 11中的其他应用程序文件
  • 我的应用程序是否符合访问存储中所有文件的
    MANAGE\u EXTERNAL\u STORAGE
    权限?
  • 处理这种情况的最佳方法是什么
  • “存储访问框架”能否帮助我处理此场景

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

    在Android 11中,MediaStore API只返回媒体文件

    所以,我将回答你们有关它的问题

    我可以读取Android 11上其他应用程序创建的文件吗?我 在安卓11中读到你无法访问其他应用程序文件的地方

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

    我的应用程序是否有资格获得“管理\u外部\u存储”访问权限 存储中的所有文件

    据我所知,你的应用程序不需要外部存储来存储数据,它也可以在私人存储中完成,在那里你可以读取或写入数据。如果你的应用程序有资格获得此权限,你现在仍然不能使用它。官方网站建议,而不是请求此权限,在清单中使用目标API 29和android:requestLegacyExternalStorage=“true”。

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

    您可以使用特定于应用程序的文件夹来存储正在创建的存档,而不是使用外部音频路径

    “存储访问框架”能否帮助我处理此场景


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

    就像在Android 11中一样,MediaStore API只返回媒体文件

    所以,我将回答你们有关它的问题

    我可以读取Android 11上其他应用程序创建的文件吗?我 在安卓11中读到你无法访问其他应用程序文件的地方

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

    我的应用程序是否有资格获得“管理\u外部\u存储”访问权限 存储中的所有文件

    据我所知,你的应用程序不需要外部存储来存储数据,它也可以在私人存储中完成,在那里你可以读取或写入数据。如果你的应用程序有资格获得此权限,你现在仍然不能使用它。官方网站建议,而不是请求此权限,在清单中使用目标API 29和android:requestLegacyExternalStorage=“true”。

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

    您可以使用特定于应用程序的文件夹来存储正在创建的存档,而不是使用外部音频路径

    “存储访问框架”能否帮助我处理此场景


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

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

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


    如果您使用进程间通信(顺便说一下),您可以使用mediastore和FileProvider提供的uri逐个提供文件。

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

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

    如果您使用进程间通信(顺便说一下),您可以使用mediastore和FileProvider提供的uri逐个提供文件

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

    这似乎过于复杂

    我可以读取Android 11上其他应用程序创建的文件吗

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

    我的应用程序有资格访问存储中的所有文件吗

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

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

    嗯,依咪浩,到目前为止最好的方法是有一个应用程序,而不是两个。但我假设你现在还不能改变这一点

    若有,则:

    • 让“跟踪器”应用程序将内容写入应用程序可以写入的文件系统目录中的文件。大多数情况下,这将通过
      上下文
      上的方法实现,例如
      getFilesDir()
      getExternalCacheDir()

    • 让“跟踪器”应用程序使用
      FileProvider
      为该目录中的文件提供服务,并使用
      FileProvider.getUriForFile()
      获取
      Uri
      po