La siguiente forma se puede utilizar para empaquetar un ContentProvider dentro de una biblioteca y establecer la autoridad del proveedor de contenido en tiempo de ejecución, de modo que se pueda incluir en varios proyectos sin conflicto de la autoridad ContentProvider. Esto funciona porque la 'autoridad' real proviene del AndroidManifest ... no de la clase ContentProvider.
Comience con lo básico ContentProvider implementation..AUTHORITY, CONTENT_URI y UriMatcher son estáticos, pero no 'final' ....
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);
A continuación, reemplazar el método 'AttachInfo', de modo que cuando el ContentProvider primero se inicializa, se llamará a su ContentProvider con ProviderInfo que se obtuvo de AndroidManifest. Esto ocurrirá ANTES de que se realicen las posibles consultas, muy probablemente durante la configuración inicial de la clase de aplicación. Aproveche esta oportunidad para restablecer AUTHORITY, CONTENT_URI y UriMatcher a sus valores "reales", tal como lo proporciona la Aplicación que está utilizando la biblioteca 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);
}
Cuando se inicia la aplicación, el ContentProvider es en realidad una instancia junto con la clase de aplicaciones, por lo que tendrá acceso a toda la información del paquete requerido. el objeto ProviderInfo contendrá la información proporcionada en el AndroidManifest ... La lista incluida en la Aplicación final.
<provider android:authorities="com.foo.barapp.content"
android:name="com.foo.bar.MyContentProvider"/>
La Autoridad de ahora será reescrito con "com.foo.barapp.content" en lugar del valor por defecto, y el UriMatcher se actualizará con el valor de la aplicación en lugar del predeterminado. Las clases que dependen de la "AUTORIDAD" ahora accederán al valor actualizado, y el UriMatcher distinguirá correctamente las consultas entrantes para el 'com.foo.barapp.content'.
He probado esto con una aplicación de muestra y un paquete androidTest simultáneamente y he encontrado que funciona correctamente.
Puede tratar de aplicar mi solución para una tarea similar: http: // stackoverflow.com/a/15964372/1220237 – Sash0k