Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Crashlytics encontró una clave de API no válida

Cuando estoy intentando construir el proyecto con el value de meta-data etiqueta del meta-data como referencia de la secuencia, los crashlytics fallan con el siguiente error:

 Crashlytics found an invalid API key: @string/crashlytics. Check the Crashlytics plugin to make sure that the application has been added successfully! Contact support@crashlytics.com for assistance. 

No funciona

  • Cómo agregar un servicio de sistema a Android Framework
  • Aplicación de Android que se conecta a un servicio web - no funciona
  • Error al crear una aplicación Codename One grande durante la fase Dex
  • Android: adbd no se puede ejecutar como root en compilaciones de producción
  • ¿Cómo lees el ID único de una etiqueta NFC en android?
  • Cómo implementar un botón en un Widget de Android
  •  <meta-data android:name="com.crashlytics.ApiKey" android:value="@string/crashlytics"/> 

    Trabajos

     <meta-data android:name="com.crashlytics.ApiKey" android:value="1234567890..."/> 

    Quiero definir diferentes claves dentro de string.xml para diferentes productFlavors de mi proyecto android.

    Actualizar

    Después de escribir en el soporte de crashlytics:

    Actualmente solo podemos evaluar el AndroidManifest.xml en el momento de la compilación para que no veamos los recursos de las cadenas, por lo que solo soportamos una cadena codificada. Definitivamente voy a compartir esto con el equipo que usted está interesado por lo que puede buscar en apoyar esto en un futuro lanzamiento.

  • ¿Cuántos elementos puede almacenar un ListView?
  • Fragmento de carga de hiladora / diálogo en Honeycomb
  • Cómo combinar el cajón de navegación y Spinner
  • Android: ¿Cómo puedo detectar si el botón Volver saldrá de la aplicación (es decir, ésta es la última actividad que queda en la pila)?
  • ¿Permiso de notificaciones push (GCM) en tiempo de ejecución?
  • ¿Qué herramientas están disponibles para probar JobScheduler?
  • 2 Solutions collect form web for “Crashlytics encontró una clave de API no válida”

    Editar: La solución aceptada está funcionando sólo si está utilizando una versión antigua de Crashlytics (estaba utilizando v1.1.11). Si está usando el SDK de la tela usted notará que las tareas del complemento han cambiado considerablemente y el guión abajo no trabajará. Además, el secreto API no es necesario, por lo tanto, sólo puede utilizar el <meta> en el manifiesto para especificar la clave de la API junto con un marcador de posición de manifiesto definido en su sabor:

    • En build.gradle :

       flavor1 { ... manifestPlaceholders = [crashlyticsApiKey: CRASHLYTICS_API_SECRET_HERE] ... } 
    • En AndroidManifest.xml :

       ... <meta-data android:name="com.crashlytics.ApiKey" android:value="${crashlyticsApiKey}" /> ... 

    Hay otra forma indocumentada de especificar la clave de Crashlytics como se señala aquí , y es usar las crashlytics.properties (en la raíz de tu proyecto) para especificar ese valor junto con el secreto de la API:

     apiKey=YOUR_API_KEY apiSecret=YOUR_API_SECRET 

    Desafortunadamente esto no le permitirá simplemente especificar una diferente crashlytics.properties para cada sabor, ya que necesita estar en la raíz de su proyecto para ser elegido correctamente por el complemento gradle. Eso significa que necesita generar ese archivo dinámicamente . La idea es agregar los valores de clave / secreto en tu sabor como propiedades personalizadas y generar los crashlytics.properties en buildtime, usando los valores del sabor actual para llenar el archivo.

    El build.gradle dentro de tu módulo android debería tener este aspecto:

     ... productFlavors { flavor1 { ... set("crashlyticsApiKey", CRASHLYTICS_API_KEY_HERE) set("crashlyticsApiSecret", CRASHLYTICS_API_SECRET_HERE) ... } ... } File crashlyticsProperties = new File("${project.projectDir.absolutePath}/crashlytics.properties") applicationVariants.all { variant -> variant.productFlavors.each { flavor -> def variantSuffix = variant.name.capitalize() def generateResourcesTask = project.tasks.getByName("crashlyticsGenerateResources${variantSuffix}") def generatePropertiesTask = task("crashlyticsGenerateProperties${variantSuffix}") << { Properties properties = new Properties() println "...copying apiSecret for ${variant.name}" properties.put("apiSecret", flavor.crashlyticsApiSecret) println "...copying apiKey for ${variant.name}" properties.put("apiKey", flavor.crashlyticsApiKey) properties.store(new FileWriter(crashlyticsProperties), "") } generateResourcesTask.dependsOn generatePropertiesTask def cleanResourcesTask = project.tasks.getByName("crashlyticsCleanupResourcesAfterUpload${variantSuffix}") cleanResourcesTask.doLast { println "...removing crashlytics.properties" crashlyticsProperties.delete() } } } ... 

    Básicamente, la secuencia de comandos engancha en el proceso de construcción y genera / rellena el archivo de propiedades justo antes de que el complemento gradle de Crashlytics haga su magia.

    Con Fabric's Crashlytics 2.6.6. Soy capaz de seleccionar simplemente una variante de construcción en el menú (normalmente ubicado a la izquierda en Android Studio) y ejecutar la aplicación. Se tarda un minuto para propagarse hasta el panel de tela, pero no tenía ninguna necesidad de una solución.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.