La actualización en la aplicación proporciona InstallException (ERROR_API_NOT_AVAILABLE)

12

Se implementó la función de actualización en la aplicación, utilizando el siguiente fragmento de código:

private void showInAppUpdateDialog(boolean isMandatoryUpdate) {
    Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();

    appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
                || appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {

            int appUpdateType = isMandatoryUpdate ? IMMEDIATE : AppUpdateType.FLEXIBLE;
            int requestCode = isMandatoryUpdate ? REQUEST_APP_UPDATE_IMMEDIATE : REQUEST_APP_UPDATE_FLEXIBLE;

            if (appUpdateInfo.isUpdateTypeAllowed(appUpdateType)) {
                // start the app update
                try {
                    appUpdateManager.startUpdateFlowForResult(appUpdateInfo, appUpdateType, targetActivity, requestCode);
                } catch (IntentSender.SendIntentException e) {
                    e.printStackTrace();
                }
            }
        }
    }).addOnFailureListener(e -> {
        e.printStackTrace();
    });
}

Estoy probando la actualización en la aplicación en el dispositivo que tiene Android 9. Aún así, me está dando un error siguiente (ERROR_API_NOT_AVAILABLE):

com.google.android.play.core.install.InstallException: Install Error(-3): The API is not available on this device. (https://developer.android.com/reference/com/google/android/play/core/install/model/InstallErrorCode#ERROR_API_NOT_AVAILABLE)
        at com.google.android.play.core.appupdate.i.a(Unknown Source:24)
        at com.google.android.play.core.internal.o.a(Unknown Source:13)
        at com.google.android.play.core.internal.j.onTransact(Unknown Source:22)
        at android.os.Binder.execTransact(Binder.java:731)

Está diciendo que revise el siguiente enlace: https://developer.android.com/reference/com/google/android/play/core/install/model/InstallErrorCode#ERROR_API_NOT_AVAILABLE )

Usando la versión de la biblioteca principal de Play: 1.6.5

Última versión de la biblioteca central:

implementation 'com.google.android.play:core:1.7.0'

Sin embargo, no puedo entender por qué dice que ERROR_API_NOT_AVAILABLE. ¡Cualquier ayuda sería apreciada!

Umang Kothari
fuente
tienes alguna respuesta?
Ankur_009
Todavía no, pero puedes usar este uso compartido interno de aplicaciones para probar la actualización de InApp: support.google.com/googleplay/android-developer/answer/…
Umang Kothari
tienes alguna respuesta?
moDev
¿Tienes alguna respuesta válida para esto?
Dhaval Kansara
¿Tienes alguna respuesta, cómo resolver esto? Estoy recibiendo el mismo error.
Ashish Agrawal

Respuestas:

5

En primer lugar , compruebe que está utilizando la última versión de la biblioteca de reproducción.

En segundo lugar , hecho discreto: compruebe que la aplicación que está probando tiene el mismo nombre de paquete que está disponible en Play Store.

Ejemplo:

Tiene una aplicación en Play Store con el nombre del paquete, com.example.apppero está probando su aplicación con el nombre del paquete com.example.app.debug. Obtendrá este error: ERROR_API_NOT_AVAILABLE

Nota: debe tener al menos una versión de su aplicación en Play Store cuando realice la prueba.

Vipul Asri
fuente
1. Usando la última versión de la biblioteca de reproducción 2. Los nombres de los paquetes son los mismos Aún, frente a este problema :(
Umang Kothari
Funciona bien para la compilación de lanzamiento, pero se ejecuta una vez en la versión de depuración solo si borra la memoria caché y el almacenamiento de Play Store. Para ejecutarlo nuevamente, debe borrar el caché y el almacenamiento de Play Store nuevamente.
Abdul Mateen
1
Oh, esto realmente funcionó para mí. Limpié el caché y almacené datos de Play Store. Gracias @AbdulMateen
gmartinsnull
Creo que el problema también está relacionado con el certificado cargado para jugar en la consola. La versión de depuración tiene un certificado diferente y no coincide con el de "producción". Por lo tanto, es imposible probar la API incluso con FakeUpdateManager
Nicola Gallazzi
2

Mi aplicación funcionaba bien antes de hoy, pero hoy comencé a recibir este error. Una solución temporal es borrar la memoria caché y el almacenamiento de Google Play Store y luego intentar iniciar la aplicación. Para mí, funciona solo la primera vez, pero falla después. Antes de volver a iniciar la aplicación, tengo que borrar el caché y el almacenamiento nuevamente. Creo que hay algo mal en el lado de Google Play Store debido a que este problema está sucediendo porque todo estaba bien para mí antes de hoy.

Abdul Mateen
fuente
2

Además de lo que sugirió Vipal, el problema puede deberse a una falta de coincidencia de firma entre la versión que instaló en el dispositivo y la que ofrecería Play Store (este es un problema común si intenta probarlo con versiones de depuración). Ver https://developer.android.com/guide/playcore/in-app-updates#troubleshoot

Recientemente, la API de Play Core comenzó a devolver un API_NOT_AVAILABLEerror si la aplicación no es propiedad del usuario o las firmas no coinciden, mientras que antes solía devolver una UPDATE_NOT_AVAILABLETarea exitosa .

La recomendación es:

  • si usa la extensión de Kotlin, asegúrese de detectar la excepción lanzada por requestAppUpdateInfo
  • si usa PlayCore Java, asegúrese de tener una onFailureListenerque maneje las fallas degetAppUpdateInfo
  • Para probar una compilación de depuración, puede usar el uso compartido interno de aplicaciones, como se explica aquí: https://developer.android.com/guide/playcore/in-app-updates#internal-app-sharing

Fuente: trabajo en el equipo de Play Core

Alessandro Dovis
fuente
El uso compartido de aplicaciones internas me ayudó mucho. Puedo recomendarlo Un poco engorroso, pero asegura que ninguno de esos mensajes de error "no tengo sentido" aparezca.
MartinJH
0

La solución temporal por el momento es rodear el OnCompleteListenercon:

try {...} catch(e: RuntimeExecutionException) {...}

Solo para evitar tener que borrar el caché de PlayStore cada vez que reinicio la aplicación

Nicolas Ducom
fuente
1
¿Quizás podrías hacer esto en addOnFailureListener ? Porque esto se llama en un error. Tengo el proceso InAppUpdate en BaseActivity y uso una interfaz para devolver el resultado a cualquier actividad que lo necesite.
Sceada
0

Después de mucho tiempo de depuración. Descubrí que esto se debe a que estamos probando la aplicación directamente en el móvil. Aunque generamos y usamos apk firmado, se producirá este error. La única forma de deshacerse de este error es que necesitamos descargar la aplicación desde Google Play.

Podemos usar el uso compartido interno de aplicaciones para probar o simplemente publicar nuestra aplicación.

Vimal
fuente