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.