可以使用以下方法將ContentProvider打包到庫中,並在運行時設置ContentProvider的權限,以便在沒有ContentProvider權限衝突的情況下將其包含到多個項目中。這是有效的,因爲真正的'權威'來自AndroidManifest ...而不是ContentProvider類。
先從基本的ContentProvider implementation..AUTHORITY,CONTENT_URI和UriMatcher是靜態的,而不是 '最終' ....
public class MyContentProvider extends ContentProvider {
public static String AUTHORITY = "com.foo.bar.content";
public static Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
protected static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
然後,重寫 'attachInfo' 的方法,這樣當的ContentProvider首先被初始化,你的ContentProvider將被從AndroidManifest收集到的ProviderInfo調用。這將在進行任何可能的查詢之前發生,很可能在初始應用程序類設置期間進行。使用此機會將AUTHORITY,CONTENT_URI和UriMatcher重置爲其「真實」值,如使用ContentProvider庫的應用程序所提供的。
@Override
public void attachInfo(Context context, ProviderInfo info) {
super.attachInfo(context, info);
AUTHORITY = info.authority;
CONTENT_URI = Uri.parse("content://" + AUTHORITY);
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, AlarmTable.TABLENAME, ALARMS);
uriMatcher.addURI(AUTHORITY, AttributeTable.TABLENAME, ATTRIBUTES);
uriMatcher.addURI(AUTHORITY, DeepLinkTable.TABLENAME, DEEPLINKS);
uriMatcher.addURI(AUTHORITY, NotificationTable.TABLENAME, NOTIFICATIONS);
uriMatcher.addURI(AUTHORITY, MetaDataTable.TABLENAME, RESOURCE_METADATA);
uriMatcher.addURI(AUTHORITY, ResourceTable.TABLENAME, RESOURCES);
uriMatcher.addURI(AUTHORITY, ResourceAttributeTable.TABLENAME, RESOURCES_ATTRIBUTES);
uriMatcher.addURI(AUTHORITY, ResourceTagTable.TABLENAME, RESOURCES_TAGS);
uriMatcher.addURI(AUTHORITY, TagTable.TABLENAME, TAGS);
uriMatcher.addURI(AUTHORITY, UserTagTable.TABLENAME, USER_TAGS);
uriMatcher.addURI(AUTHORITY, UserTable.TABLENAME, USERS);
uriMatcher.addURI(AUTHORITY, CUSTOM, RAW);
}
當應用程序啓動時,ContentProvider的實際上是與應用類一起實例化,所以將有機會獲得所有所需的程序包信息。 ProviderInfo對象將包含AndroidManifest中提供的信息...包含在最終應用程序中的列表。
<provider android:authorities="com.foo.barapp.content"
android:name="com.foo.bar.MyContentProvider"/>
管理局現將「com.foo.barapp.content」,而不是默認值改寫,而UriMatcher將被更新到應用程序的價值,而不是默認。依賴於「AUTHORITY」的類現在將訪問更新的值,並且UriMatcher將正確區分傳入的查詢「com.foo.barapp.content」。
我已經同時測試了這兩個示例應用程序和androidTest包,並發現它能正常工作。
你可以嘗試申請我的解決方案爲類似的任務:http:// stackoverflow。com/a/15964372/1220237 – Sash0k 2013-04-12 06:19:11