如何将 CWAC-Provider 设置为可从其他应用程序访问?

How to set up CWAC-Provider to be accessible from another app?

我对 Android 中的 ContentProvider 比较陌生,我喜欢在应用程序之间共享资产文件的想法。 假设我有 2 个应用程序:AppA 有我想从 AppB 访问的所有漂亮图像。 AppA 的 StreamProvider 设置如下:

<provider
        android:authorities="org.example.AssetProvider"
        android:name="com.commonsware.cwac.provider.StreamProvider"
        android:exported="true"
        android:grantUriPermissions="true">
        <meta-data
            android:name="com.commonsware.cwac.provider.STREAM_PROVIDER_PATHS"
            android:resource="@xml/assetpaths" />
</provider>

与 assetpaths.xml 像这样:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <asset name="assets" path="test"/>
</paths>

一切正常,我可以通过 AppA 中的 StreamProvider 访问我的资产(该权限的 getUriPrefix() returns 一些非空值)。

当我尝试使用以下代码从我的 AppB 访问资产时,困难的部分开始了:

String COMMON_AUTHORITY = "org.example.AssetProvider";
Uri test = Uri.parse("content://" + COMMON_AUTHORITY)
    .buildUpon()
    .appendPath(StreamProvider.getUriPrefix(COMMON_AUTHORITY))
    .appendPath("assets")
    .appendPath("test.jpg")
    .build();
InputStream is = getContentResolver().openInputStream(test)

getUriPrefix() 方法 returns null,因为没有在 StreamProvider class 的 INSTANCES 私有字段中注册提供者。当我在 AppA 中写下 运行 这段代码的前缀,然后将其硬编码到 AppB 时,一切顺利,我可以获得一个 InputStream。

我的问题是 -

  1. 有什么方法可以让我从另一个应用程序访问我的授权前缀?
  2. 有没有其他方法可以访问存储在另一个应用程序的 APK 文件中的文件?

提前感谢您的回复! :)

在 AppA 中,subclass StreamProvider and override getUriPrefix() to return null。在 <provider> 元素中使用子类。然后,在 AppB 中构建不带前缀的 Uri

顺便说一句,您应该可以删除 android:grantUriPermissions="true",因为您正在导出此提供程序。