2015-06-12 108 views
13

我正在開發一個應用程序(至少)有兩種不同的包名 - 因此實際上是兩個不同的應用程序,只要android系統有關。該應用程序使用Facebook的分享,所以我在清單中聲明的​​供應商:Android的Facebook內容提供商權威

<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}" 
      android:name="com.facebook.FacebookContentProvider" 
      android:exported="true"/> 

這是根據Facebook的指示做的:https://developers.facebook.com/docs/sharing/android

這正常工作與一個應用程序,但要安裝第二應用在同一個設備上失敗,錯誤爲INSTALL_FAILED_CONFLICTING_PROVIDER。這是清單中唯一定義的提供者,所以我很確定這是問題所在。如果我將提供程序字符串更改爲不同的內容,則嘗試打開Facebook共享對話框時會崩潰。

我見過說可以在多個android應用程序中使用相同的Facebook應用程序,但在Facebook的文檔中找不到任何有關它的內容。有沒有人這樣做,你是如何解決提供者權限問題的?謝謝。

+0

如果每個味道都有不同的applicationID,那麼你可以做這樣的事情:HTTP://計算器.com/a/30791242/1426565並在清單中的提供者聲明中注入正確的applicationId,因爲$(applicationId)實際返回包名,而不是您在gradle中定義的applicationId – Guardanis

+0

最後回到此 - 我要去嘗試它,但似乎像這樣會遇到同樣的問題,因爲應用程序結束時只有來自構建過程的權限字符串,而不是直接在清單中。 – nasch

+0

您應該看看在構建時基於applicationId注入不同的值。這裏實際上是我上週的答案,應該可以幫助你做到這一點:http://stackoverflow.com/a/30791242/1426565 – Guardanis

回答

8

我能夠解決這個問題,通過爲我的調試和發佈風格分開清單,並在我的調試風格清單中,我爲提供程序添加了片段,但將導出的值設置爲false。在我的發佈風格清單中,我有導出設置爲true的原始提供程序片段。

我這樣做後,我不再有INSTALL_FAILED_CONFLICTING_PROVIDER錯誤。

<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}" 
      android:name="com.facebook.FacebookContentProvider" 
      android:exported="false"/> 
+0

謝謝,我會看看我是否可以嘗試。 – nasch

+0

@nasch所以你能解決這個問題,請發表一個簡單的答案,你如何解決這個問題。創建多個清單文件不是一個明智的解決方案。 – Min2

+1

@ Min2爲什麼? Android Studio將在構建時將清單合併到單個文件中。 https://developer.android.com/tools/building/manifest-merge.html – nasch

2
<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}" 
      android:name="com.facebook.FacebookContentProvider" 
      android:exported="false"/> 

出口可以是「真實的」

6

一個我已經找到了可能的解決方案是在這裏

http://gradlewhy.ghost.io/overcoming-install-failed-conflicting-provider/

我已經使用這個描述(調試一個/發佈變體)android.support.v4.content.FileProvider,並且至今我測試過的也適用於com.facebook.app.FacebookContentProvider。

只需添加到應用中的build.gradle

debug { 
     applicationIdSuffix '.debug' 
     versionNameSuffix '-DEBUG' 

     resValue "string", "fb_provider_id", "com.facebook.app.FacebookContentProvider{app_id_1}" 
    } 

    release { 
     minifyEnabled true 
     shrinkResources true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

     resValue "string", "fb_provider_id", "com.facebook.app.FacebookContentProvider{app_id_2}" 
    } 

然後在AndroidManifest

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