17

Android ライブラリ プロジェクトには、コントラクト クラスで次のように権限が定義されているいくつかのプロバイダーが含まれています。

public static final String CONTENT_AUTHORITY = "my.com.library.providers.tester";
private static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);

現在、このライブラリ プロジェクトを使用する多くのアプリ プロジェクトがあります。私が現在抱えている問題は、アプリ プロジェクトごとに、独自のコンテンツ権限を持つためだけに、アプリごとにライブラリ プロジェクトに個別のブランチを用意する必要があることです。これにより、いくつかのバージョン管理の問題が発生しています (機能/バグ修正をあるブランチから他のすべてのブランチに伝播するなど)。代わりに、コンテンツの権限を定義する責任をアプリ プロジェクトに委任したいと考えています。これを達成する方法はありますか?

4

2 に答える 2

22

アプリは、属性<provider>を使用してマニフェストでを宣言するアプリであるため、機関について絶対に知る必要がある唯一のアプリです。android:authorities

したがって、原則として、次のような機関固有のロジックをすべてプロバイダーから削除する限り、「正常に機能する」はずです。

  • これらの静的データ メンバー (現在はホスティング アプリに移動しています)
  • UriMatcher(権限を調べずに、残りの部分に焦点を当てたものを自分で転がしますUri

何らかの理由で、プロバイダーがその権限を知る必要があると確信している場合、プロバイダーが実際の作業に使用される前に、アプリはその権限をプロバイダーに提供する必要があります。そのために考えられる方法は次のとおりです。

  • aContentProviderは自然なシングルトンであるため、それを静的データ メンバーに割り当ててから、カスタム クラスのカスタム メソッドによって権限文字列をそれに供給しますApplication(プロバイダーは最初に初期化されるため、これは機能するはずです)。

  • API レベル 11+ のみをサポートしている場合は、カスタムApplicationクラスをcall()onに使用しContentResolverて権限をContentProvider

  • query()実際の呼び出し (たとえば、 to 、 ) のみが有効であると仮定し、最初に表示insert()されたものに基づいて権限を遅延初期化します。Uri

于 2012-05-28T22:39:24.713 に答える