onIabPurchaseFinished nunca ligou.

111

Tenho tentado configurar o faturamento no aplicativo para meu primeiro aplicativo e tenho usado o sku android.test.purchased. A compra foi concluída e eu consigo colocar o SKU em meu estoque, mas, como diz o título, onIabPurchaseFinished nunca é chamado.

Acho que pode ter algo a ver com este Log: "Não foi possível salvar qual visão está em foco porque a visão focada com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0 não tem id". Isso aparece antes de ir para o Google Play. Eu não tenho certeza do que isso significa embora ...

Compra de lançamento:

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

E o ouvinte:

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
fonte
Talvez eu deva acrescentar que estou tentando fazer isso em uma guia
AAAton de
Eu configurei o id programaticamente, mas nenhuma diferença.
AAAton

Respostas:

206

Tente adicionar isso à atividade que chama 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
fonte
16
teve o mesmo problema e funcionou perfeitamente. Mas o que eu quero saber é por que a chamada de volta não é executada como se supõe, por que temos que fazer a chamada para nós mesmos? Meio que torna o retorno de chamada inútil: /
Spider
4
Também me ajudou, thx. @Spider, o motivo pelo qual você precisa desse método em sua Activity é que, caso contrário, o método handleActivityResult () de mHelper não será chamado. Em outras palavras, este é o handleActivityResult () real / padrão necessário na Activity, e o mHelper's é na verdade apenas um método antigo regular.
gcl1
8
Obrigado por isso. É um bug na documentação (eles nunca mencionam a necessidade disso ou no IabHelper. O launchPurchaseFlow () do IabHelper invoca o startIntentSenderForResult - que chamará o onActivityResult () da sua atividade quando terminar.
Jerry Brady
3
Achei que tinha resolvido meu problema quando encontrei isso ... então percebi que já havia implementado essa função e ela ainda não funciona ... suspiro
Matt K
3
Observe que substituir onActivityResult () em um Fragment não funciona, deve ser feito em uma Activity
cprcrack
8

Acabei de descobrir outra coisa importante: o requestCode que é usado para iniciar o fluxo de compra deve ser> = 0!

Eu usei "new Random (). nextInt ()" para gerar um requestCode aleatório e às vezes funcionava, às vezes não. agora descobri na seguinte documentação, que o requestCode não deve ser um número negativo:

http://developer.android.com/reference/android/app/Activity.html#startActivityForResult%28android.content.Intent,%20int%29

drwuro
fonte
3

Eu tive o mesmo problema e o onActivityResult também não foi chamado.
Inspirado na resposta de @Ghulam, percebi que a atividade onActivityResult não chama o onActivityResult do fragmento automaticamente, então tive que fazer isso 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
fonte
No meu caso, essa resposta funcionou, mas eu tive que adicionar uma substituição OnActivityResult em minha atividade principal ( github.com/onepf/OpenIAB/issues/166 )
PayToPwn
1

Você precisa chamar protected void onActivityResult (); Em sua atividade principal em vez de MainActivity (Trivial Drive), de onde você está chamando sua MainActivity, que é atividade Trivial Drive.

você receberá valores de código de resultado -1 se a compra for bem-sucedida, caso contrário, 0.

Desenvolvedor de aplicativos móveis
fonte
0

Eu estava enfrentando o mesmo problema e a solução aceita já estava implementada, mas não sabia o que estava causando isso. Mudar para a nova Google Play Billing Library 1.0 (lançada em 19 de setembro de 2017) corrigiu o problema para mim!

Espero que os links a seguir ajudem alguém que deseja implementar a nova biblioteca:

Postagem do blog do Google sobre o lançamento

Vídeo do youtube do Google

Play Billing Library Training Class

Amostra do Trivial Drive v2 do Google

Codelab da Play Billing Library publicado durante o Google I / O 2017

Play Billing Library Docs

Referência oficial para classes e métodos

Notas de lançamentos

Mohit Singh
fonte