Контент-провайдер INSTALL_FAILED_CONFLICTING_PROVIDER (установка контент-провайдера в виде отдельного apk)

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

Теперь проблема в том, что apk поставщика контента должен быть установлен до того, как любое из этих двух приложений можно будет установить на устройство. В противном случае во время установки отображается ошибка «Провайдер не найден».

Итак, как я могу убедиться, что apk провайдера установлен до того, как будут установлены какие-либо другие apk?

Есть ли способ объединить apk поставщика контента с обоими другими apk по отдельности, чтобы они были установлены вместе как два приложения и не отображали ошибку INSTALL_FAILED_CONFLICTING_PROVIDER?

Мне нужно объединить apk поставщика контента с обоими приложениями, потому что пользователь может не устанавливать оба приложения или может установить их оба на одном устройстве.


person Imon    schedule 08.06.2011    source источник
comment
Это очень интересная проблема. Здесь объясняется аналогичный пример: stackoverflow.com/questions/3578751/. Я не уверен, что там есть ответ для вас, поэтому я добавил его в качестве комментария. Это напоминает мне о проблеме, с которой вы сталкиваетесь в C/C++ с файлами заголовков, и почему вы используете #ifndef/#define   -  person plainjimbo    schedule 08.06.2011
comment
@Джеймс, спасибо за ваш ответ. Я думал о решении, представленном в упомянутой вами теме, но я ищу что-то лучшее. Помещение провайдера в отдельный apk и его установка сначала решает ошибку INSTALL_FAILED_CONFLICTING_PROVIDER и я думаю, что это лучше, чем держать двух провайдеров. Но мне нужно убедиться, что apk провайдера установлен первым или каким-то образом объединить apk, как я уже упоминал.   -  person Imon    schedule 08.06.2011
comment
См. также исчерпывающий ответ @CommonsWare stackoverflow.com/a/10791144/94363   -  person rds    schedule 10.12.2012


Ответы (5)


Я могу придумать одно решение: сделать поставщика контента частью обоих приложений с разными идентификаторами пакетов внутри и экспортировать его, используя android:exported = true. Однако оба могут использовать один и тот же код.

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

Чтобы защитить своего поставщика контента от всех остальных, вы можете определить специальное разрешение для его защиты, чтобы ваши приложения могли использовать только его, или вы также можете установить некоторую пользовательскую аутентификацию, например секретный ключ, для доступа к поставщику контента. вы можете использовать этот код аутентификации во всех методах контент-провайдера.

person Naresh    schedule 22.07.2011
comment
Это кажется возможным решением, но не тем, что я ожидаю. Возможно, нет возможности упаковать два apk как один в android. - person Imon; 25.05.2012

Вы можете решить эту проблему, изменив значение android:authorities в файле AndroidManifest.xml. Причина ошибки в том, что другое приложение, установленное на вашем устройстве, уже использует такое же значение для android:authorities.

person Ali Ashraf    schedule 24.07.2012

Чтобы устранить эту ошибку: Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER

измените значение android:authorities в файле AndroidManifest.xml, другое приложение, установленное на вашем устройстве, уже использует это значение для android:authorities.

person Jorgesys    schedule 28.11.2012

Вы используете одни уникальные данные, такие как регистрационный номер Facebook API или что-то подобное в вашем файле манифеста (AndroidManifest.xml) для обеих программ: для которых уже установлено и для которого вы пытаетесь и не можете установить. Тебе нужно:

  1. Попробуйте найти что-то подобное и проверьте, подходит ли оно для вашей текущей программы:

android:authorities="com.facebook.app.FacebookContentProvider23473465463573466" android:name="com.facebook.FacebookContentProvider" android:exported="true"/>

  1. Проверьте, нет ли дубликатов в других программах, если это программа, которую вы пытаетесь установить.
person Iefimenko Ievgen    schedule 06.01.2016

Это означает, что у вашего телефона уже есть провайдер с такими же полномочиями, зарегистрированный другим приложением (может быть другим примером). Измените полномочия вашего провайдера, т.е. android:authorities, и все готово.

person Nishant Shah    schedule 26.06.2014