DocumentProvider не имеет разрешения на владение ContentProvider - PullRequest
0 голосов
/ 16 ноября 2018

Мое приложение имеет 2 типа провайдера

  • DocumentProvider (DP) экспортируется = "true", требуемый спецификациями
  • ContentProvider (CP) экспортируется = "ложь", требуемая для безопасности

Базовый поток связи - 3-е приложение. DP запрашивает некоторую информацию, а DP запрашивает CP эту информацию и возвращает информацию 3-му приложению.

Предположим, мы используем Microsoft Word / Excel для получения некоторых данных из DocumentProvider.Это схема обмена данными между приложениями:

Word <-------> Поставщик документов <---- ошибка здесь ----> ContentProvider

Проблема в том, что DocumentProvider не имеет доступа к своему собственному ContentProvider.Я имею в виду, что DP и CP находятся внутри 1 приложения, но работают в разных процессах.

Ошибка:

java.lang.SecurityException: Permission Denial: reading com.app.name.provider.DataBaseContentProvider uri content://com.app.name.db.provider/files/innnerFiles/151515 from pid=6655, uid=10042 requires the provider be exported, or grantUriPermission

DP:

<provider
        android:name="com.app.name.provider.DocProvider"
        android:authorities="com.app.name.provider.DocProvider"
        android:exported="true"
        android:grantUriPermissions="true"
        android:permission="android.permission.MANAGE_DOCUMENTS">
        <intent-filter>
            <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
        </intent-filter>
</provider>

CP:

<provider
    android:name="com.app.name.provider.DBProvider"
    android:authorities="com.app.name.provider.DBProvider"
    android:exported="false" />

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Для ответа на этот вопрос требуется дополнительная информация, включая исходные коды.

Однако, согласно документу разработчика :

Предоставление разрешения - это способ предоставления клиентам провайдера, которые обычно не имеют разрешения, доступа к своим данным, для однократного преодоления этого ограничения.

добавив элемент grant-uri-permission к декларации DocProvider, он может предоставить предоставленный доступ к определенным uri s, и проблема может быть решена.

<provider
    android:name="com.app.name.provider.DocProvider"
    android:authorities="com.app.name.provider.DocProvider"
    android:exported="true"
    android:grantUriPermissions="true"
    android:permission="android.permission.MANAGE_DOCUMENTS">

    <intent-filter>
        <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
    </intent-filter>

    <grant-uri-permission android:pathPrefix="content://com.app.name.db.provider" />

</provider>
0 голосов
/ 24 ноября 2018

Атрибут

android:authority

атрибут, который является именем вашего пакета в этом примере,

com.app.name.provider.documents

тип поставщика контента (документов)

Пользовательский поставщик документов

...