MyTracksというアプリにGoogleのオープンソースコードを使用しています。
元のアプリが電話にインストールされていると、このエラーが発生します。
INSTALL_FAILED_CONFLICTING_PROVIDER
これはAndroid:authorities
マニフェスト内。
これがマニフェストの一部です:
<provider
Android:name="com.google.Android.apps.mytracks.content.MyTracksProvider"
Android:authorities="com.google.Android.maps.mytracks"
Android:exported="true"
Android:readPermission="com.google.Android.apps.mytracks.READ_TRACK_DATA"
Android:writePermission="com.google.Android.apps.mytracks.WRITE_TRACK_DATA" />
<!-- Search suggestion provider -->
<provider
Android:name="com.google.Android.apps.mytracks.content.SearchEngineProvider"
Android:authorities="com.google.Android.maps.mytracks.search"
Android:exported="false" />
だから、私の質問です:このアプローチで問題が解決するかどうかを知りたいのですが、すべてのパッケージ名を変更してアプリ全体が壊れるのを恐れているからです。
Android :authorities
valueはパッケージ名です。 Android:name
は、そのプロバイダーのクラスの名前です。私は正しいですか?パッケージ名をcom.google etxとは別の名前に変更し、そのパッケージのすべての参照/インポートの名前を変更した場合、問題は解消されますか?
Android:authoritiesの値はパッケージ名です。
この場合、パッケージ名はhappensになります。それは単にユニークでなければならない。
Android:nameは、そのプロバイダーのクラスの名前です。
正しい。
パッケージ名をcom.google etxとは別の名前に変更し、そのパッケージのすべての参照/インポートの名前を変更した場合、問題は解消されますか?
パッケージ名はそれとは関係ありません。ただし、アプリを通常の変更されていないアプリと一緒にインストールできるようにするには、それも変更する必要がある場合があります。
Android:authorities
には一意の値を設定する必要があり、これを使用するアプリのコードContentProvider
は適切なUri
(content://whatever.you.change.the.authority.to/...
)を使用する必要があります。
ライブラリプロジェクト内でGoogleマップとGoogle Play開発者サービスを使用している場合、同じライブラリを使用する別のアプリがすでにデバイスにインストールされているときに、ライブラリを使用するアプリを実行しようとすると、このエラーが発生する可能性があります。
修正:defaultConfig.applicationIdがAndroidのbuild.gradle
ファイルのセクションごとに定義されていることを確認してくださいライブラリを使用したプロジェクト
Android {
defaultConfig.applicationId = "com.company.appname"
}
特定のアプリのパッケージ名を使用することをお勧めします。この修正により、プロバイダー名が競合することはなくなり、アプリは期待どおりに実行されます。
症状
1.)Playストアからアプリをインストールすると、ユーザーに恐ろしい「-505」インストールエラーが表示されます。
2.)Android Studio:経由でライブラリを使用する2つ目のアプリをインストールしようとすると、このエラーメッセージが表示されます:
コンソールに、次のようなメッセージが表示されます。
Package couldn't be installed in /data/app/com.company.appname-1
com.Android.server.pm.PackageManagerException:
Can't install because provider name
com.google.Android.gms.measurement.google_measurement_service
(in package com.company.appname) is already used by
com.company.otherInstalledAppName
修正は、defaultConfig.applicationIdがライブラリを使用する各プロジェクトのbuild.gradle
ファイルのAndroidセクションに定義されていることを確認することです
Android {
defaultConfig.applicationId = "com.company.appname"
}
詳細については、元のバグレポートのこちらをご覧ください: 問題784:同じ権限プロバイダー名を使用する複数のアプリ
デバイスからhelloFacebooksampleアプリをアンインストールするだけです
ex facebook-sdkを使用する場合は、各アプリについて、マニフェストで一意のこの行が必要です
<provider Android:authorities="com.facebook.app.FacebookContentProviderxxxxxxxxxx"
Android:name="com.facebook.FacebookContentProvider"
Android:exported="true"/>
xxxxxxxxxx-各アプリで一意である必要があります。facebook-sdkの場合は、facebook_id番号です
アプリのマニフェストでパッケージ名を変更したときにも同じエラーが発生しました。これにより、(新しいパッケージ名で)アプリを再度インストールしようとすると競合が発生します。解決策は、古いバージョンのアプリ(古いパッケージ名を使用)を削除して、新しいバージョンをインストールできるようにすることです。
グラドルにもこれを含める必要があります
defaultConfig {
applicationId "com.example.app"
}
完全に省いていた
実行しようとしているデバイスからアプリケーションをアンインストールして、もう一度reinstallアプリケーションを試してください。既存のアプリケーションが新しいアプリケーションと競合しています。
CommonsWareにはそれがありますが、役立つ詳細情報があります。
私にとって、ソリューションには2つの重要な部分がありました。最初に$(applicationId)をマニフェストプロバイダーエントリに追加しました。
<provider
tools:replace="Android:authorities"
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="${applicationId}.files"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/fileprovider" />
</provider>
次に、ビルドバリアントを切り替えると、私はこれを「デバッグ」と「リリース」の間で切り替え、プロジェクトをGradleファイルと同期する必要があります。プロジェクトのクリーンとリビルドだけでは不十分でした。
Android Studioでは、AndroidManifest.xmlページの下部に2つのタブがあります。編集に使用する[テキスト]タブと[マージされたマニフェスト]タブには、ビルド後の結果のマニフェストが表示されます。私にとっては、プロバイダーのAndroid:authoritiesセクションにapplicationIdを適切に挿入していることがわかります。