如何将 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。
我的问题是 -
- 有什么方法可以让我从另一个应用程序访问我的授权前缀?
- 有没有其他方法可以访问存储在另一个应用程序的 APK 文件中的文件?
提前感谢您的回复! :)
在 AppA 中,subclass StreamProvider
and override getUriPrefix()
to return null
。在 <provider>
元素中使用子类。然后,在 AppB 中构建不带前缀的 Uri
。
顺便说一句,您应该可以删除 android:grantUriPermissions="true"
,因为您正在导出此提供程序。
我对 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。
我的问题是 -
- 有什么方法可以让我从另一个应用程序访问我的授权前缀?
- 有没有其他方法可以访问存储在另一个应用程序的 APK 文件中的文件?
提前感谢您的回复! :)
在 AppA 中,subclass StreamProvider
and override getUriPrefix()
to return null
。在 <provider>
元素中使用子类。然后,在 AppB 中构建不带前缀的 Uri
。
顺便说一句,您应该可以删除 android:grantUriPermissions="true"
,因为您正在导出此提供程序。