¿Cómo puedo acceder a un valor BuildConfig en mi archivo AndroidManifest.xml?

¿Es posible acceder a un valor BuildConfig desde AndroidManifest.xml?

En mi archivo build.gradle, tengo:

defaultConfig { applicationId "com.compagny.product" minSdkVersion 16 targetSdkVersion 21 versionCode 1 versionName "1.0" // Facebook app id buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID } 

FACEBOOK_APP_ID se define en mis archivos gradle.properties:

 # Facebook identifier (app ID) FACEBOOK_APP_ID=XXXXXXXXXX 

Para usar Facebook conecta en mi aplicación, debo agregar esta línea a mi AndroidManifest.xml:

 <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/applicationId"/> 

Quiero reemplazar @string/applicationId por el campo BuildConfig FACEBOOK_APP_ID definido en gradle, como esto:

 <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="FACEBOOK_APP_ID"/> 

¿Es posible usar BuildConfig? Si no, ¿cómo puedo lograr esto?

Reemplazar

 buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID 

con

 resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID 

Luego reconstruya su proyecto (Android Studio -> Build -> Rebuild Project).

Los dos comandos producen valores generados – consistentes en constantes Java en el primer caso y recursos de Android en el segundo – durante las compilaciones del proyecto, pero el segundo método generará un valor de recurso de string que se puede acceder mediante la sintaxis @string/FACEBOOK_APP_ID . Esto significa que se puede utilizar en el manifiesto, así como en el código.

Otra forma de acceder a Gradle Build Config valores de su AndroidManifest.xml es a través de marcadores de posición como este:

 android { defaultConfig { manifestPlaceholders = [ facebookAppId:"someId..."] } productFlavors { flavor1 { } flavor2 { manifestPlaceholders = [ facebookAppId:"anotherId..." ] } } } 

Y luego en su manifiesto:

 <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebookAppId}"/> 

Vea más detalles aquí: https://developer.android.com/studio/build/manifest-build-variables.html

(Enlace antiguo sólo para referencia: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger )

Acceda a las propiedades build.gradle en su manifiesto como en el siguiente ejemplo:

Por ejemplo, tienes una propiedad "applicationId" en tu build.gradle y quieres acceder a ella en tu AndroidManifest:

Introduzca aquí la descripción de la imagen

Acceda a "applicationId" en AndroidManifest:

 <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="${applicationId}" /> </intent-filter> </receiver> 

Del mismo modo, podemos crear recursos de cadena para otras constantes y acceder a ellas en archivos de código tan simples como:

 context.getString(R.string.GCM_SENDER_ID); 

Otra opción: utilizar un archivo de recursos de cadena diferente para reemplazar todos los valores dependientes de Sabor:

Paso 1: Crear una nueva carpeta en la carpeta "src" con el nombre de su sabor, im mi caso "stage"

Paso 2: Crear archivos de recursos para todos los archivos que dependen del sabor por ejemplo:

Introduzca aquí la descripción de la imagen

Paso 3: También estoy usando iconos diferentes, así que usted ve las carpetas mipmap también. Para esta pregunta, sólo el "strings.xml" es importante. Ahora puede sobrescribir todos los recursos importantes de la cadena. Solo necesitas incluir los que quieras anular, todos los demás se usarán desde el principal "strings.xml", aparecerá en Android Studio como este:

Introduzca aquí la descripción de la imagen

Paso 4: Utilice los recursos de cadena en su proyecto y relájese:

Introduzca aquí la descripción de la imagen

Nota: cuando se utiliza resValue el valor puede ser resValue accidentalmente por el archivo de recursos de cadenas (por ejemplo, para otro idioma)

Para obtener un verdadero valor constante que puede utilizar en el manifiesto y en java-code, use manifestPlaceholders y buildConfigField : eg

 android { defaultConfig { def addConstant = {constantName, constantValue -> manifestPlaceholders = [ (constantName):constantValue] buildConfigField "String", "${constantName}", "\"${constantValue}\"" } addConstant("FACEBOOK_APP_ID", "xxxxx") } 

Acceso en el archivo de manifiesto:

 <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}"/> 

De java

 BuildConfig.FACEBOOK_APP_ID 

@stkent es bueno, pero olvida agregar que necesita reconstruir su proyecto después

Reemplazar

 buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID 

con

 resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID 

entonces

 Android Studio -> Build -> Rebuild Project 

Esto permitirá a android generar el recurso de cadena accesible vía

 R.string.FACEBOOK_APP_ID 
  • Tamaño de la barra de navegación de Android en xml
  • Android windowSoftInputMode = "adjustPan" desplazarse un poco más
  • ¿Vista de lista con título, imagen y texto?
  • Línea vertical XML
  • ? Android: attr / selectableItemBackground
  • Android: diferencia entre invisible y ido?
  • ¿Cuál es la diferencia entre @android: and? Android:
  • ¿Cómo puedo crear una barra de herramientas (como una barra de acción secundaria) en Android?
  • Diseño XML de Android para todos los dispositivos (pequeño / normal / grande / XLarge, etc.)
  • String.xml o clase Constantes
  • Diseño de Android: apila dos TextViews verticalmente, dentro de una fila ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.