studio - ¿Cómo puedo acceder a un valor BuildConfig en mi archivo AndroidManifest.xml?
login con facebook android studio (6)
@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á que Android genere el recurso de cadena accesible a través de
R.string.FACEBOOK_APP_ID
¿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 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 eso posible usando BuildConfig? Si no, ¿cómo puedo lograr esto?
Acceda a las propiedades build.gradle en su manifiesto como en el siguiente ejemplo:
Por ejemplo, tiene una propiedad "applicationId" en su build.gradle y desea acceder a ella en su AndroidManifest:
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 ellos en archivos de código tan simples como:
context.getString(R.string.GCM_SENDER_ID);
Otra forma de acceder a los valores de configuración de Gradle Build desde 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 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 anterior solo como referencia: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger )
Otra opción: usar un archivo de recursos de cadena diferente para reemplazar todos los valores dependientes de Flavor:
Paso 1: Crea una nueva carpeta en la carpeta "src" con el nombre de tu sabor, en mi caso, "etapa"
Paso 2: cree archivos de recursos para todos los archivos que dependen del sabor, por ejemplo:
Paso 3: También estoy usando diferentes íconos, así que también puedes ver las carpetas mipmap. Para esta consulta, solo es importante el "strings.xml". Ahora puede sobrescribir todos los recursos de cadena importantes. Solo necesita incluir los que desea anular, todos los demás se usarán desde el "strings.xml" principal, se mostrará en Android Studio de la siguiente manera:
Paso 4: usa los recursos de cadena en tu proyecto y relájate:
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, que consisten 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 utilizando la sintaxis
@string/FACEBOOK_APP_ID
.
Esto significa que se puede usar tanto en el manifiesto como en el código.
nota: cuando usa
resValue
el valor puede ser anulado accidentalmente por el archivo de recursos de cadenas (por ejemplo, para otro idioma)
Para obtener un verdadero valor constante que pueda 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 en el archivo de manifiesto:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}"/>
de java:
BuildConfig.FACEBOOK_APP_ID
Si el valor constante debe ser específico de buildType, el auxiliar
addConstant
debe ajustarse (para trabajar con una semántica de cierre excelente), por ejemplo,
buildTypes {
def addConstantTo = {target, constantName, constantValue ->
target.manifestPlaceholders += [ (constantName):constantValue]
target.buildConfigField "String", "${constantName}", "/"${constantValue}/""
}
debug {
addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-debug")
}
release {
addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-release")
}