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


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

En mi constitución.archivo 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 mi gradle.archivos de propiedades:

# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX

Para usar Facebook connect 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, así:

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

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

Author: stkent, 2015-03-10

6 answers

Sustitúyase

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

Con

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

Luego reconstruye tu proyecto (Android Studio -> Build -> Rebuild Project).

Los dos comandos producen valores generados, consistentes en constantes de 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 string al que se puede acceder utilizando la sintaxis @string/FACEBOOK_APP_ID. Esto significa que puede ser utilizado en el manifiesto, así como en el código.

 136
Author: stkent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:05

Otra forma de acceder a los valores de configuración de Gradle Build desde tu 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 tu manifiesto:

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

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

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

 67
Author: GregoryK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-27 06:46:37

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

Para obtener un valor constante verdadero que puede usar en el manifiesto y en el código java, use manifestPlaceholders y buildConfigField: por ejemplo,

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

        addConstant("FACEBOOK_APP_ID", "xxxxx")
    }

Acceso al archivo de manifiesto:

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

De java:

BuildConfig.FACEBOOK_APP_ID
 14
Author: TmTron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-13 12:52:16

Compilación de acceso.propiedades de gradle en tu manifiesto como en el siguiente ejemplo:

Por ejemplo, tiene una propiedad "applicationId" en su compilación.gradle y quieres acceder a eso en tu AndroidManifest:

introduzca la descripción de la imagen aquí

Acceso 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 ellos en archivos de código tan simple como:

context.getString(R.string.GCM_SENDER_ID);
 5
Author: Vinay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-18 12:15:43

Otra opción: use un archivo de recursos de cadena diferente para reemplazar todos los valores dependientes del Tipo:

Paso 1: Cree una nueva carpeta en la carpeta" src "con el nombre de su sabor, im my case"stage"

Paso 2: Crear archivos fuente para todos los archivos que dependen del tipo por ejemplo:

introduzca la descripción de la imagen aquí

Paso 3: También estoy usando diferentes iconos, para que veas las carpetas mipmap también. Para esta pregunta, solo las " cadenas.xml" es importante. Ahora puedes sobrescribir todos los recursos de cadena importantes. Solo necesita incluir las que desea sobreescribir, todas las demás se usarán desde las cadenas "main".xml", se mostrará en Android Studio así:

introduzca la descripción de la imagen aquí

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

introduzca la descripción de la imagen aquí

 2
Author: Björn Kechel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-06 08:11:15

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

Sustitúyase

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

Con

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

Luego

Android Studio -> Build -> Rebuild Project

Esto permitirá a Android generar el recurso de cadena accesible a través de

R.string.FACEBOOK_APP_ID
 0
Author: F.O.O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-15 20:25:54