Студия Android: INSTALL_FAILED_CONFLICTING_PROVIDER facebook sdk

У меня возникла странная проблема с андроид-студией. У меня есть два приложения для Android, которые используют facebook sdk с тем же приложением для facebook для входа в систему и обмена фотографиями. С новым api необходимо объявить внутри манифест этого:

<provider android:authorities="com.facebook.app.FacebookContentProvider[app_id]"
        android:name="com.facebook.FacebookContentProvider"
        android:exported="true"/>

Теперь, если одно из этих приложений уже установлено на устройстве, и я пытаюсь установить второй, я получаю эту ошибку в студии Android:

INSTALL_FAILED_CONFLICTING_PROVIDER

Нужно проблема провайдера facebook, то есть единственного    элемент внутри моего приложения. Таким образом, мои два приложения не могли быть установлены одновременно на одном устройстве? Я хотел бы, если есть способ использовать тот же провайдер и избежать этой ошибки.

Ответ 1

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

У вас не может быть два разных приложения (или одно и то же приложение с двумя разными идентификаторами приложений), используя тот же идентификатор приложения Facebook. Это нарушает материал ContentProvider. Вам нужно создать тестовое приложение под своим основным приложением в области разработчиков Facebook. Затем откройте новый идентификатор приложения и сохраните его.

Далее, в файле build.gradle добавьте (или добавьте) следующую запись в блок defaultConfig.

    manifestPlaceholders = [ facebook_app_id:"" ]

Затем в вашей конфигурации отладки добавьте:

    manifestPlaceholders = [ facebook_app_id:"<the_debug_app_id_you_kept_handy>"]

Затем в вашем релизе config добавьте:

    manifestPlaceholders = [ facebook_app_id:"<the_original_app_id_you_had>" ]

Теперь измените свой AndroidManifest.xml. Изменение:

    <provider android:authorities="com.facebook.app.FacebookContentProvider<original_app_id>"

в

    <provider android:authorities="com.facebook.app.FacebookContentProvider${facebook_app_id}"

и, измените:

    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="<original_app_id>"/>

в

    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebook_app_id}"/>

Это должно сделать это. То, что вы сделали, - добавить в манифест заполнителя. По существу это переменная, которую вы затем можете установить для своей сборки gradle для заполнения ее значения разными способами, основанными на типе сборки или вкусе.

Ответ 2

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

Правильно.

Я хотел бы, если бы был способ использовать тот же провайдер и избежать этой ошибки.

Следующее не имеет ничего общего с Facebook SDK, но имеет дело только с Android и его пределами. Facebook SDK может налагать новые и захватывающие ограничения.

В теории вы могли бы сказать, что приложение A имеет <provider>, а приложение B использует поставщика из приложения A. Это означает, что приложение B нельзя использовать самостоятельно. Когда пользователь запускает приложение, вам нужно будет проверить, установлено ли приложение A, и заставить пользователя его установить, чтобы иметь возможность использовать приложение B. Это может вызвать некоторый острый вопрос пользователя. Если вы хотите, чтобы приложение A и App B можно было использовать индивидуально, это нормально, но тогда оба должны будут иметь <provider>, а затем оба они не могут быть установлены одновременно.

В идеале вы решили бы это, если бы оба элемента <provider> были отключены (android:enabled="false") с самого начала. Затем, кто бы ни работал первым, сам выбирал бы того, кто предлагал провайдер для этого устройства, и в этот момент он включил бы поставщика. Увы, из-за ошибка/ограничение Android, это не решит проблему, так как вы не сможете одновременно установить оба установленных в любом случае.

Я склонен согласиться с комментарием Раджана Бхавсара. Либо вам нужно иметь одно приложение для Android для вашего одного идентификатора приложения Facebook, либо вам нужны два идентификатора приложения Facebook для ваших двух приложений для Android.

Ответ 3

Насколько я вижу, нет требования к имени для android:autorities в соответствующем провайдере node (https://developer.android.com/guide/topics/manifest/provider-element.html), поэтому вы можете сделать URI уникальным, вставив applicationId:

android:authorities="${applicationId}.com.facebook.app.FacebookContentProvider[app_id]

Ответ 4

Таким образом, вы можете изменить имя поставщика из одного из своих приложений. Используйте имя приложения Inst ed из App_id.