tutorial studio obtener invalid hashes español con clave android android-gradle android-xml android-facebook

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") }