Студия Android: INSTALL_FAILED_CONFLICTING_PROVIDER facebook sdk

У меня возникла странная проблема с Android Studio. У меня есть два приложения для 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, это единственный элемент внутри моего приложения. Таким образом, два моих приложения не могут быть установлены одновременно на одном устройстве? Я хотел бы, есть ли способ использовать того же провайдера и избежать этой ошибки.


person giozh    schedule 27.04.2015    source источник
comment
Вам нужно будет создать другое приложение в консоли разработчика Facebook и назначить идентификатор другого приложения своему приложению и интегрировать его с вашей записью поставщика манифеста, и вы сможете это сделать.   -  person Rajan Bhavsar    schedule 27.04.2015
comment
Два приложения принадлежат одному и тому же приложению Facebook. Невозможно создать два разных приложения   -  person giozh    schedule 27.04.2015
comment
Вы когда-нибудь находили обходной путь для этого? Думал, можно ли отключить ContentProvider в Debug версиях. Еще изучаю проблему. Конечно, это отключит возможности обмена для этой версии.   -  person The Nomad    schedule 30.05.2015


Ответы (5)


Я знаю, что это старый вопрос, но я не мог найти на него четкого ответа. Решил написать, как я это сделал.

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

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

    manifestPlaceholders = [ facebook_app_id:"" ]

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

    manifestPlaceholders = [ facebook_app_id:"<the_debug_app_id_you_kept_handy>"]

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

    manifestPlaceholders = [ facebook_app_id:"<the_original_app_id_you_had>" ]

Теперь измените файл AndroidManifest.xml. Изменять:

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

to:

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

и изменить:

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

to:

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

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

person Simon    schedule 22.02.2016
comment
Спасибо помогло мне решить мою проблему с приложением с разными идентификаторами приложения. - person Dokuzov; 06.04.2016
comment
Спасибо за решение. Вы сэкономили довольно много времени. - person Jatin Jha; 05.07.2016

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

Правильный.

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

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

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

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

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

person CommonsWare    schedule 27.04.2015
comment
Это конкретная ситуация, когда два приложения предназначены для двух разных типов физических пользователей (одно приложение выполняет подмножество операций другого), но никогда не бывает, чтобы пользователь мог одновременно установить оба приложения на одном устройстве. . Это раздражает только на этапе тестирования на физическом устройстве (мне нужно удалить одно приложение, если я попробую другое). - person giozh; 27.04.2015
comment
@giozh: Тогда ваш текущий подход, вероятно, ваш лучший ответ. Вы можете написать себе задачу Gradle, которая удаляет другое приложение и устанавливает то, с которым вы пытаетесь работать, которую вы можете вызывать для быстрого переключения между ними. Или используйте два физических устройства. И, насколько я знаю, у Facebook есть другое решение этой проблемы, специфичное для того, как они требуют, чтобы эти authorities были настроены. - person CommonsWare; 27.04.2015
comment
Я знаю, что этому обсуждению уже год, но похоже, что собственная документация Facebook предполагает, что разработчик должен иметь возможность использовать один и тот же идентификатор приложения в нескольких приложениях Android (developers.facebook.com/docs/android/), они просто не объясняют, как обойти эту проблему. (То же самое для iOS: developers.facebook.com/docs/ios/troubleshooting#sharedappid) - person Keith; 15.04.2016
comment
но как насчет этого: вы можете использовать один идентификатор приложения Facebook в нескольких приложениях Android. Просто используйте тот же идентификатор приложения в другом приложении для входа в систему, обмена и т. д. Для создания глубоких ссылок и открытия вашего приложения с помощью уведомлений и других средств мы поддерживаем только одну комбинацию имени пакета и имени класса. Если вам нужна поддержка нескольких приложений для внешних ссылок, см. раздел Ссылки на приложения. - person Tushar Pandey; 04.10.2016

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

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

Внутри вашего manifest

  <provider
                android:name="com.facebook.FacebookContentProvider"
                android:authorities="@string/authority"
                android:exported="true" />

Внутри вашего градиента

 productFlavors {
 appStore{
            applicationId "store_app"
            resValue "string", "authority", "com.facebook.app.FacebookContentProviderStoreApp"
        }
       }
person Hossam Hassan    schedule 25.11.2018

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

person AmmY    schedule 01.08.2015
comment
AppId — это идентификатор, полученный из консоли разработчика facebook, и он должен соответствовать этому идентификатору. - person Martin Mlostek; 03.12.2015