无法使用Android DocumentsProvider写入文件

时间:2018-10-31 02:53:20

标签: android

我有一个Android DocumentsProvider,可以使用支持Androids Storage Access Framework的应用程序来阅读。 Word等应用程序以及Google自己的DocumentsUI。我无法将文件写入DocumentsProvider。写入存储的任何内容,无论是重命名,删除,创建文件还是写入文件,都将在请求甚至到达文档提供者之前失败。

我的AndroidManifest.xml的提供者部分如下:

<provider android:name="com.mycompany.myproduct.myprovider"
android:authorities="com.mycompany.myproduct.documents"
android:grantUriPermissions="true"
android:exported="true"
android:permission="android.permission.MANAGE_DOCUMENTS">
  <intent-filter>
    <action android:name="android.content.action.DOCUMENTS_PROVIDER"/>
  </intent-filter>
</provider>

我的提供者是具有以下permissions的应用程序的一部分:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.INTERNET"/>

当我从存储提供商那里返回行时,我会包含FLAGS_SUPPORTS_WRITE, FLAGS_SUPPORTS_DELETE, FLAGS_SUPPORTS_RENAME

我想知道,与发起意图的应用程序一样,DocumentsProvider是否不是问题所在。但是,这些应用似乎可以写给其他提供商。所以,我想知道我是否缺少明显的东西(或微妙的,我不在乎哪个)。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我在这个问题上工作了几天。曾经发誓可以奏效。它对读取有效但对写入无效的事实使我感到困扰。无论如何,在仔细审核了提供商之后,我发现一件事是不对的。

  

通话   在API级别19中添加   公共捆绑包调用(字符串方法,                   字符串arg,                   捆绑包)   实现由父类提供。可以覆盖提供   附加功能,但子类必须始终调用超类。如果>超类返回null,则子类可以实现自定义行为。

     

如果重写此方法,则必须调用超类   实施。

我最近在提供程序中添加了一个调用,因此我实现了此调用例程,但是...没有对super的调用。其他所有东西都起作用,因此除了写不起作用之外,它没有以其他任何特殊方式突出。必须有一些可能与权限相关的调用必须传递给基类。我阻止了它。因此,请考虑解决此问题。