proveedores proveedor nativos hacer ejemplos definicion contentresolver content contenido android android-contentprovider

android - nativos - proveedor de contenido ejemplos



Uso de @string para Android: autoridades en un ContentProvider (2)

Me enfrenté a un problema similar pero con el atributo android:versionCode . Cuando intenté definir el código de la versión en recursos y usar una referencia a él en el manifiesto de Android Market, incluso me prohibió publicar la aplicación. La razón de tal comportamiento resultó ser bastante simple. Los recursos pueden cambiar dependiendo de la configuración actual y este valor debe ser el mismo en cualquier caso.

Probablemente, esta es la razón por la que los proveedores de contenido con referencias de autoridad no funcionan también. Y me parece que no es una buena idea usar tal referencia porque no hay garantía de que haya un único valor para un recurso de autoridad en una aplicación. Entiendo que puede ser lo suficientemente cuidadoso para mantener una sola instancia de este recurso, pero no hay compilaciones especiales ni comprobaciones del sistema para que no se pueda confiar.

Tengo un ContentProvider en mi manifiesto, cuando los defino completamente con cadenas codificadas, funciona. P.ej

<provider android:name="com.myprovider" android:authorities="com.myprovider"/>

Funciona a la perfección, sin embargo, los proveedores de contenido están en una biblioteca que se usa en varios proyectos y no quiero conflictos de autoridad, por lo que intenté hacer lo siguiente.

<provider android:name="com.myprovider" android:authorities="@string/myProviderAuthority">

De esta manera, debería poder definir todas mis autorizaciones en un único archivo strings.xml y no tener conflictos entre las aplicaciones, ya que debería poder cambiarlas utilizando el sistema de anulación de recursos de cada aplicación.

Sin embargo, parece que cuando trato de construir con @string, me da un error de manifiesto mal formado y dice "El proveedor no INCUDE (sí, dice INCUDE) a las autoridades"

¿No puedo usar una cadena de recursos para el tributo a las autoridades? Me siento enfermo cada vez que necesito mantener constantes en dos ubicaciones. Los conflictos de autoridad pueden ser difíciles de detectar por nuestro departamento de control de calidad, y no quiero que las cosas se desincronicen o podrían causar confusión. ¿Alguien tiene alguna idea de por qué mi código no funciona?


Muchos atributos de manifiesto no se pueden especificar como una referencia a una cadena, se deben especificar como valores de cadena explícitos.

El código que analiza el manifiesto está en: frameworks / base / core / java / android / content / pm / PackageParser.java. Esa clase llama, entre otras, getNonConfigurationString () y getNonResourceString () (que se implementan en: frameworks / base / core / java / android / content / res / TypedArray.java).

getNonConfigurationString () se describe a sí mismo como:

Retrieve the string value of an attribute that is not allowed to change with the given configurations.

getNonResourceString () se describe a sí mismo como:

Retrieve the string value for an attribute, but only if that string comes from an immediate value in an XML file. That is, this does not allow references to string resources, string attributes, or conversions from other types. As such, this method will only return strings that come from attributes in an XML file.

A continuación se enumeran los atributos de manifiesto que PackageParser no permite que se tomen de los recursos o de diferentes configuraciones.

Estos atributos se definen en com.android.internal.R.styleable El nombre del atributo del elemento manifest.xml suele ser la parte del nombre después de la última ''_'' en el nombre formal. Por ejemplo, el atributo android: authority en un elemento en manifest.xml es AndroidManifestProvider_authorities, o com.android.internal.R.styleable.AndroidManifestProvider_authorities. (El número en las listas de nombres de atributos a continuación es el número de línea del código relevante en la versión 4.1.1 de PackageParser.java)

Atributos leídos por getNonConfigurationString:

917: AndroidManifest_versionName 922: AndroidManifest_sharedUserId 2057: AndroidManifestActivity_parentActivityName 2071: AndroidManifestActivity_permission 2079: AndroidManifestActivity_taskAffinity 2247: AndroidManifestActivityAlias_targetActivity 2330: AndroidManifestActivityAlias_permission 2336: AndroidManifestActivityAlias_parentActivityName 1672: AndroidManifestApplication_name 1683: AndroidManifestApplication_manageSpaceActivity 1697: AndroidManifestApplication_backupAgent 1795: AndroidManifestApplication_permission 1800: AndroidManifestApplication_taskAffinity 1815: AndroidManifestApplication_process 3005: AndroidManifestData_mimeType 3017: AndroidManifestData_scheme 3023: AndroidManifestData_host 3025: AndroidManifestData_port 3031: AndroidManifestData_path 3037: AndroidManifestData_pathPrefix 3043: AndroidManifestData_pathPattern 2527: AndroidManifestGrantUriPermission_path 2533: AndroidManifestGrantUriPermission_pathPrefix 2539: AndroidManifestGrantUriPermission_pathPattern 2579: AndroidManifestPathPermission_permission 2581: AndroidManifestPathPermission_readPermission 2586: AndroidManifestPathPermission_writePermission 2615: AndroidManifestPathPermission_path 2622: AndroidManifestPathPermission_pathPrefix 2629: AndroidManifestPathPermission_pathPattern 2434: AndroidManifestProvider_authorities 2441: AndroidManifestProvider_permission 2443: AndroidManifestProvider_readPermission 2454: AndroidManifestProvider_writePermission 2713: AndroidManifestService_permission 2832: AndroidManifestMetaData_name 1225: AndroidManifestOriginalPackage_name 1981: (parsePackageItemInfo -- I can''t tell list of all names) 3258: (Component constructor args.nameres -- I can''t tell list of all names)

Atributos leídos por getNonResourceString:

1806: AndroidManifestApplication_taskAffinity 1821: AndroidManifestApplication_process 1632: AndroidManifestInstrumentation_targetPackage 2891: AndroidManifestPackageVerifier_name 2894: AndroidManifestPackageVerifier_publicKey 1512: AndroidManifestPermission_permissionGroup 1200: AndroidManifestProtectedBroadcast_name 1927: AndroidManifestUsesLibrary_name 1054: AndroidManifestUsesFeature_name 1004: AndroidManifestUsesPermission_name 3308: (Component constructor args.processRes -- I can''t tell list of all names)

Por lo tanto, muchos atributos en el archivo manifest.xml deben especificarse como valores de cadena explícitos (es decir, entre comillas) en lugar de referencias a cadenas en cadenas.xml.