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?
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.
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 )
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
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:
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);
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:
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í:
Paso 4: Utilice los recursos de cadena en su proyecto y relájese:
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
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