#android #android-contentprovider #android-sharing
#Android #android-contentprovider #совместное использование Android
Вопрос:
Я достаточно погуглил, но не смог найти этот случай. Я хочу написать пользовательский контент-провайдер, который является общим / доступным только для определенных приложений.
У меня такой сценарий:
- В Google Play есть несколько приложений. Скажем, A, B и C.
- Хотите написать контент-провайдера, скажем, Z, к которому могут быть доступны только A, B и C. Я подумываю опубликовать контент-провайдера «Z» в качестве собственного apk.
- Когда Z установлен на устройстве; A, B и C могут получить доступ к Z. Если Z не установлен, то первое приложение отправится в Google Play для установки Z.
Теперь мой вопрос:
Возможно ли вообще вообще написать такого контент-провайдера, который доступен только для определенных приложений? android:exported=»false» делает его недоступным для любого другого внешнего приложения. android: grantUriPermissions=»true» не работает, если для android:exported установлено значение false, а установка android:exported в true делает его общедоступным.
Пожалуйста, не стесняйтесь делиться и другими решениями, если они кажутся более подходящими для моих требований обмена информацией между несколькими приложениями.
Комментарии:
1. Нет, он не может быть выборочно доступен только для определенных приложений. Вместо этого Google
ContentProviders
проверяет подпись вызывающих приложений и разрешает доступ только к своим приложениям. Не только с помощью, но и со всем остальным.
Ответ №1:
android: grantUriPermissions=»true» не работает, если для android:exported установлено значение false
Да, это так.
Однако android:grantUriPermissions
это может быть неуместно для вашего варианта использования, особенно если Z является собственным автономным приложением. Z должен быть тем, кто вызывает A / B / C, используя Intent
с FLAG_GRANT*
флагом, и я предполагаю, что это не соответствует вашему плану.
Если, как я подозреваю, A / B / C необходимо получить доступ к Z независимо от того, что Z сообщает им, что к нему можно получить доступ, и предоставляет Uri
разрешения -specific, стандартным подходом будет использование пользовательского signature
уровня <permission>
. Затем вы должны защитить экспорт поставщика и защитить его с этим разрешением, используя android:permission
в <provider>
. Теория заключается в том, что только ваш набор приложений может содержать это разрешение, потому что только ваш набор приложений будет подписан этим ключом подписи и, следовательно, будет соответствовать подписи.
(Я говорю «в теории», потому что есть проблемы с этим подходом)
Комментарии:
1. могут ли приложения, подписанные одним и тем же сертификатом и имеющие разрешение подписи, беспрепятственно обмениваться данными (даже без использования контент-провайдера)? У вас есть какой-нибудь пример, на который можно посмотреть? Спасибо!
2. @bianca: Нет. Разрешения на уровне подписи волшебным образом не создают новые протоколы IPC; они просто защищают те, которые существуют.
android:sharedUserId
позволяет приложениям, подписанным одним и тем же ключом подписи, совместно использовать идентификатор пользователя Linux, позволяя им напрямую считывать / записывать часть внутренней памяти друг друга. Однако это очень хрупко. В частности, если какое-либо из ваших приложений уже отправлено, это больше не вариант для вас.