2017-03-13 12 views
4

多くの異なるアプリケーションで使用されているライブラリプロジェクトに対して、private(exported = false)のContentProviderを使用できますか?アンドロイドライブラリプロジェクトのContentProvider

CPがエクスポートされていない場合でも、CPには独自の権限が必要です。一意でない場合は、同じライブラリの複数のアプリを同じ電話(INSTALL_FAILED_CONFLICTING_PROVIDER)にインストールすることはできません。

私は、このようなAndroidManifestでプロバイダを定義するためのアプリケーションIDを使用することができることを知っている:

<provider 
    android:authorities="${applicationId}.provider.test" 
    android:name=".storage.db.MyContentProvider" 
    android:exported="false" /> 

が、私はきちんとUriMatcherを初期化するために、実行時にコード内で権限を生成するための解決策を見つけることができません。

BuildConfig.APPLICATION_IDは、アプリケーションではなくライブラリプロジェクトのIDを返します。 アプリのコンテキストからpackageIdを取得しようとする可能性がありますが、アプリが異なるappIdsのフレーバーを使用する場合は最適な解決策ではありません。

だから、これを解決するために、私のアイデアは、次のとおりです。(異なるアプリケーションIDと味が使用されている場合も)

  • は、実行時に自分のライブラリコード内の適切appplicationIdを見つける
  • 適切にURIを一致させる方法を見つけます私のUriMatcher権限の知識なし。
+0

に見え、ここhttp://stackoverflow.com/を見ます質問/ 6120025 /制限する方法 - コンテンツプロバイダデータ - アプリケーション全体 - ここではhttp://stackoverflow.com/questions/23281860/how-do-i-restrict-access-to-my-contentprovider-to -only-my-apps、私は詳細を使用したり読んだりしませんでしたが、主なアイデアは、同じ鍵で署名されたアプリケーションだけがプロバイダにアクセスできるようにすることです – Yazan

+0

私は自分のライブラリを使用するアプリケーションを所有していないので、アプリのデベロッパーにとって透明でなければなりません。 – LR89

答えて

3

回答はhereに基づいて実行時に権限を取得できました。解決策は、(APIを9+)以下のようにすべてのアプリが同じ鍵で署名されている場合は、 `のProtectionLevel = signature`と呼ばれるものを探しているかもしれない

private static String getAuthority(final Context appContext) throws PackageManager.NameNotFoundException { 
    final ComponentName componentName = new ComponentName(appContext, MyContentProvider.class.getName()); 
    final ProviderInfo providerInfo = appContext.getPackageManager().getProviderInfo(componentName, 0); 
    return providerInfo.authority; 
} 
0

残念なことに、唯一の方法は、ライブラリを使用したアプリケーションの開発者に、独自の権限でAndroidManifest.xmlにタグを追加するようリクエストすることです。

関連する問題