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



我对Android中的ContentProviders相对较新,我喜欢在应用程序之间共享资产文件的想法。 假设我有 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>

使用资产路径.xml如下所示:

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

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

当我尝试使用以下代码从我的 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() 方法返回 null,因为在 StreamProvider 类的 INSTANCES 私有字段中没有注册提供程序。当我记下在 AppA 中运行此代码的前缀,然后将其硬编码为 AppB 时,一切进展顺利,我可以获得输入流。

我的问题是——

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

提前感谢您的回复! :)

在 AppA 中,子类StreamProvider并覆盖getUriPrefix()以返回null。在<provider>元素中使用子类。然后,在 AppB 中构建不带前缀的Uri

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

相关内容

最新更新