Следующий способ может быть использован для упаковки 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 будет вызываться с помощью ProviderInfo, который почерпнут из AndroidManifest. Это произойдет до того, как будут сделаны любые возможные запросы, скорее всего, во время начальной настройки класса приложения. Используйте эту возможность, чтобы сбросить значения 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 фактически экземпляр вместе с классом Application, поэтому он будет иметь доступ ко всей необходимой информации пакета. объект 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