SAF(Storage Access Framework)是否解决了Android 4.4(KitKat)中的SD卡写入问题?

在Android 4.4中,来自Play Store的应用程序只能写入其特定于应用程序的目录(例如:/storage/extSdCar/Android/data/com.example.myapp/),并且应用程序不允许在微型SD卡。 所以我正在探索新的SAF API来检查是否可以使用SAF写入除应用程序特定目录之外的微型SD卡。

我通过创build示例提供程序和客户端应用程序来实现SAF。 在我的提供者中,我尝试通过在queryRoots中实现以下代码来显示SD卡的全部内容:

row.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(new File("/storage/extSdCard"))); row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_RECENTS | Root.FLAG_SUPPORTS_SEARCH); 

我在客户端创build了以下意图,我可以通过我的提供者从SAF的系统UI中浏览SD卡的全部内容。

  Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_TITLE, "test.txt"); startActivityForResult(intent, WRITE_REQUEST_CODE); 

当我点击保存button,我得到一个Toast错误“保存文档失败”。但是当我导航到我的提供商的应用程序特定目录(/ storage / extSdCar /安卓/数据/com.example.myprovider/)系统用户界面,我可以保存文件。 也没有任何意图,如Intent.CATEGORY_WRITABLE,这样我就只能得到可以编辑的文档。 请帮助我以下几点:

看来即使我们使用SAF,仍然对微型SD卡的WRITE限制保持不变。 它是否正确?

2.有什么方法可以创build,删除或修改微型SD卡的应用程序特定目录以外的已有文件?

3.谁决定FLAG_SUPPORTS_WRITE标志为正常的用户文件,如照片,video,音乐,文件等?

Solutions Collecting From Web of "SAF(Storage Access Framework)是否解决了Android 4.4(KitKat)中的SD卡写入问题?"

在实现DocumentsProvider ,只能扩展对已有权访问的磁盘上的文件的访问。 添加一个DocumentsProvider不会给你任何新的访问,所以你可能不需要实现一个。

通过使用您提到的ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT意图,您可以在SD卡上的任何位置获得写权限。 系统内置了一个ExternalStorageProvider ,可以访问所有的SD卡,并且一旦用户通过这些意图确认,它将很乐意将写权限委托给您。

用户可能需要启用“设置>显示高级设备”以显示由ExternalStorageProvider提供的SD卡。 另外,如果您想限制用户与本地存储交互,则可以设置EXTRA_LOCAL_ONLY

至于(2),您可以使用ACTION_CREATE_DOCUMENT在包特定的目录之外创build新文件,并且可以select具有任意目的的现有文件。 用户select的文件可以使用DocumentsContract.deleteDocument()来删除。

对于(3), MediaDocumentsProvider构build到平台中的FLAG_SUPPORTS_WRITE不会为照片,video和音乐扩展FLAG_SUPPORTS_WRITE

希望这可以帮助。 🙂