DocumentProvider не имеет разрешения на владение ContentProvider

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

  • DocumentProvider ( DP ) exported="true" требуется спецификациями.
  • ContentProvider (CP)exported="false" требуется безопасностью

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

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

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

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

Ошибка:

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" />

person Vetalll    schedule 16.11.2018    source источник
comment
Возможно, вам следует добавить этот ‹provider android:name=com.activeandroid.content.ContentProvider android:authorities=your.package.name android:enabled=true android:exported=false /› в файл манифеста.   -  person Muhammadjon    schedule 16.11.2018
comment
@ tm13 Зачем мне это нужно? com.activeandroid.content.ContentProvider — это настраиваемый поставщик. даже не знаю что это..   -  person Vetalll    schedule 16.11.2018
comment
Вы видели это: developer.android.com/reference/android /поддержка/v4/контент/   -  person aminography    schedule 19.11.2018
comment
@aminography Да, я видел это. Использую как временное решение. Предоставление разрешения на пакет открывает доступ ко всему ContentProvider. Мне не нужно открывать доступ. Мне просто нужны мои данные из моего CP в моем DP!   -  person Vetalll    schedule 19.11.2018


Ответы (2)


Атрибут

android:authority

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

com.app.name.provider.documents

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

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

person Sachin Kasaraddi    schedule 24.11.2018

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

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

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

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

<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>
person aminography    schedule 26.11.2018