Как настроить доступ к CWAC-Provider из другого приложения?

Я относительно новичок в ContentProviders в Android, и мне понравилась идея совместного использования файлов активов между приложениями. Допустим, у меня есть 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>

с assetspaths.xml следующим образом:

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

Все работает хорошо, и я могу получить доступ к своим активам через StreamProvider в своем AppA (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, так как в приватном поле INSTANCES класса StreamProvider не зарегистрирован провайдер. Когда я записал префикс от запуска этого кода в AppA, а затем жестко закодировал его в AppB, все прошло хорошо, и я смог получить InputStream.

Мои вопросы -

  1. Есть ли способ получить доступ к префиксу моего авторитета из другого приложения?
  2. Есть ли другой способ получить доступ к файлам, хранящимся в APK-файле другого приложения?

Спасибо за ваш ответ заранее! :)


person bubakovsky    schedule 19.04.2018    source источник


Ответы (1)


В AppA подкласс StreamProvider и переопределить getUriPrefix(), чтобы вернуть null. Используйте подкласс в элементе <provider>. Затем создайте Uri в AppB без префикса.

Кстати, вы должны иметь возможность удалить android:grantUriPermissions="true", так как вы экспортируете этого провайдера.

person CommonsWare    schedule 19.04.2018