web-dev-qa-db-ja.com

Android Facebookコンテンツプロバイダー機関

私は(少なくとも)2つのフレーバーが異なるパッケージ名でアプリを開発しています-したがって、Androidシステムに関する限り、実際には2つの異なるアプリです。アプリは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

これは1つのアプリで正常に機能しますが、同じデバイスに2番目のアプリをインストールしようとすると、エラーINSTALL_FAILED_CONFLICTING_PROVIDERで失敗します。これはマニフェストで定義されている唯一のプロバイダーなので、問題だと確信しています。プロバイダーの文字列を別のものに変更すると、Facebookの共有ダイアログを開こうとするとクラッシュします。

同じFacebookアプリを複数のAndroidアプリで使用することは可能ですが、Facebookのドキュメントでそれを見つけることができないという主張を目にしました。プロバイダーの権限の問題についてはどうですか?.

20
nasch

これを解決するには、デバッグフレーバーとリリースフレーバーに別々のマニフェストを用意し、デバッグフレーバーマニフェストにプロバイダーのスニペットを追加しましたが、エクスポートされた値をfalseに設定しました。私のリリースフレーバーマニフェストには、exportedがtrueに設定された元のプロバイダースニペットがあります。

これを行った後、INSTALL_FAILED_CONFLICTING_PROVIDERエラーは発生しなくなりました。

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

私が見つけた可能な解決策の1つは、ここで説明されているものです

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"/>
12
borko
<provider Android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
            Android:name="com.facebook.FacebookContentProvider"
            Android:exported="false"/>

エクスポートは「true」にすることができます

2
Arkady Sladkoff

私のように1つのプロジェクトと複数の flavors (means:複数の微調整を伴う複数のアプリ)がある場合、次のことができます

1.複数のFacebookアプリを作成します( https://developers.facebook.com/apps/ から)

2.対応するフレーバーのコードを追加する

3.対応するフレーバーのフォルダーにfacebook_app_id文字列値を追加します。

例:

app/build.gradle

...
flavorDimensions "regular"

productFlavors {
    flavour_name {
        dimension "regular"
        resValue "string", "authority", "com.facebook.app.FacebookContentProvider123456789"
    }

app/src/main/AndroidManifest.xml

  <meta-data Android:name="com.facebook.sdk.ApplicationId"
        Android:value="@string/facebook_app_id"/>

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

app/src/flavour_name/res/values/string.xml

<string name="facebook_app_id" translatable="false">123456789</string>
1
Touhidul Islam