10

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

<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 и назначить идентификатор другого приложения для вашего приложения и интегрировать его с помощью своей записи поставщика теневого манифеста, и вы сможете это сделать. –

+2

Два приложения относятся к одному и тому же приложению Facebook. Невозможно создать два разных приложения. – giozh

+0

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

ответ

4

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

Исправить.

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

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

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

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

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

+0

Это особая ситуация, когда два приложения предназначены для двух разных типов физических пользователей (одно приложение выполняет подмножество операции другого), но никогда не бывает, что пользователь может одновременно устанавливать оба приложения на одном и том же устройство. Это только раздражает во время фазы тестирования на физическом устройстве (мне нужно удалить одно приложение, если я попробую другой). – giozh

+0

@giozh: Тогда ваш нынешний подход, вероятно, ваш лучший ответ. Вы можете подумать о том, чтобы написать себе задачу Gradle, которая удаляет другое приложение и устанавливает тот, с которым вы пытаетесь работать, что вы можете использовать для быстрого переключения между ними. Или используйте два физических устройства. И, насколько мне известно, у Facebook есть другое решение этой проблемы, которое специфично для того, как они требуют, чтобы эти «полномочия» были настроены. – CommonsWare

+0

отличный ответ .... это работает – sonida

-1

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

+0

AppId - это идентификатор, указанный в консоли разработчика facebook, и должен соответствовать указанному идентификатору. –

16

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

У вас не может быть два разных приложения (или одно и то же приложение с двумя разными идентификаторами приложения), используя тот же идентификатор приложения 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>" 

к:

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

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

+0

Спасибо, помогло мне решить мою проблему с приложением с различными приложениями. – Dokuzov

+0

Спасибо за решение. Вы спасли довольно много времени. –

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^