onIabPurchaseFinished nunca llamado.

111

He intentado configurar la facturación en la aplicación para mi primera aplicación y he estado usando el sku android.test.purchased. La compra se realiza y me las arreglo para incluir el SKU en mi inventario, pero, como dice el título, nunca se llama a onIabPurchaseFinished.

Creo que puede tener algo que ver con este registro: "No se pudo guardar qué vista tiene el foco porque la vista enfocada com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0 no tiene id". Eso aparece, justo antes de ir a Google Play. Aunque no estoy muy seguro de lo que eso significa ...

Compra de lanzamiento:

mHelper.launchPurchaseFlow(this, sku, 10001, mPurchaseFinishedListener, "");

Y el Oyente:

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {

    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase info) {
        System.out.println("Purchase Finish heard something");

        if (result.isFailure()) {
             Log.d(TAG, "Error purchasing: " + result);
             return;
        } else{
                Log.d(TAG,"Success!");
             }


    }
};
AAAton
fuente
Tal
He configurado la identificación mediante programación, pero no hay diferencia.
AAAton

Respuestas:

206

Intente agregar esto a la actividad que llama mHelper.launchPurchaseFlow(..):

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);

    // Pass on the activity result to the helper for handling
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        // not handled, so handle it ourselves (here's where you'd
        // perform any handling of activity results not related to in-app
        // billing...
        super.onActivityResult(requestCode, resultCode, data);
    }
    else {
        Log.d(TAG, "onActivityResult handled by IABUtil.");
    }
}
bugzy
fuente
16
tenía el mismo problema y funcionó perfecto. Pero lo que quiero saber es por qué la devolución de llamada no se ejecuta como se supondría, ¿por qué tenemos que hacer la llamada a eso nosotros mismos? Algo que hace que la devolución de llamada sea inútil: /
Spider
4
También me ayudó, gracias. @Spider, la razón por la que necesita este método en su actividad es que, de lo contrario, no se llamará al método handleActivityResult () de mHelper. En otras palabras, este es el handleActivityResult () real / estándar que se necesita en la actividad, y mHelper es en realidad un método antiguo normal.
gcl1
8
Gracias por esto. Es un error en la documentación (nunca mencionan la necesidad de esto o en IabHelper. El launchPurchaseFlow () de IabHelper invoca startIntentSenderForResult, que llamará a su actividad onActivityResult () cuando haya terminado.
Jerry Brady
3
Pensé que había resuelto mi problema cuando encontré esto ... luego me di cuenta de que ya había implementado esta función y todavía no funciona ... suspiro
Matt K
3
Tenga en cuenta que anular onActivityResult () en un Fragmento no funciona, debe hacerse en una Actividad
cprcrack
3

Tuve el mismo problema y tampoco se llamó a onActivityResult .
Inspirado por la respuesta de @ Ghulam, me di cuenta de que la actividad onActivityResult no llama automáticamente al onActivityResult del fragmento, así que tuve que hacerlo manualmente.

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(mCurrentFragment!= null){
            mCurrentFragment.onActivityResult(requestCode, resultCode, data);
        }
    }
Abdelalim Hassouna
fuente
En mi caso, esta respuesta funcionó, pero tuve que agregar una anulación de OnActivityResult en mi actividad principal ( github.com/onepf/OpenIAB/issues/166 )
PayToPwn
1

Debe llamar a protected void onActivityResult (); En su Actividad principal en lugar de MainActivity (Trivial Drive) desde donde está llamando a su MainActivity que es Trivial Drive Activity.

recibirá valores de código de resultado -1 si la compra se realiza correctamente, de lo contrario 0.

Desarrollador de aplicaciones móviles
fuente
0

Estaba enfrentando el mismo problema y la solución aceptada ya estaba implementada, pero no podía decir qué estaba causando esto. El cambio a la nueva Biblioteca de facturación de Google Play 1.0 (lanzada el 19 de septiembre de 2017) solucionó el problema.

Espero que los siguientes enlaces ayuden a alguien que quiera implementar la nueva biblioteca:

Publicación del blog de Google sobre el lanzamiento

Video de youtube de Google

Play Billing Library Training Class

Ejemplo de Trivial Drive v2 de Google

Codelab de Play Billing Library publicado durante Google I / O 2017

Documentos de la biblioteca de facturación de Play

Referencia oficial para clases y métodos.

Notas de publicación

Mohit Singh
fuente