onIabPurchaseFinished tidak pernah dipanggil.

111

Saya telah mencoba menyiapkan penagihan dalam aplikasi untuk aplikasi pertama saya, dan telah menggunakan sku android.test.purchased. Pembelian berhasil, dan saya berhasil memasukkan SKU ke dalam inventaris saya, tetapi, seperti judulnya, onIabPurchaseFinished, tidak pernah dipanggil.

Saya pikir itu mungkin ada hubungannya dengan Log ini: "Tidak dapat menyimpan tampilan mana yang memiliki fokus karena tampilan terfokus com.android.internal.policy.impl.PhoneWindow$DecorView@406743d0 tidak memiliki id". Itu muncul, tepat sebelum pergi ke Google Play. Saya tidak begitu yakin apa artinya itu ...

Meluncurkan pembelian:

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

Dan Pendengar:

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
sumber
Saya mungkin harus menambahkan bahwa saya mencoba melakukan ini dari dalam tab
AAAton
Saya telah menetapkan id secara terprogram, tetapi tidak ada perbedaan.
AAAton

Jawaban:

206

Coba tambahkan ini ke Aktivitas yang memanggil 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
sumber
16
memiliki masalah yang sama dan itu bekerja dengan sempurna. Tapi yang ingin saya ketahui adalah mengapa panggilan balik tidak dieksekusi seperti yang diasumsikan, mengapa kita harus menelepon itu sendiri? Jenis membuat panggilan balik tidak berguna: /
Spider
4
Juga membantu saya, thx. @Spider, alasan Anda memerlukan metode ini dalam Aktivitas Anda adalah karena jika tidak, metode handleActivityResult () mHelper tidak akan dipanggil. Dengan kata lain, ini adalah handleActivityResult () real / standar yang dibutuhkan dalam Activity, dan mHelper sebenarnya hanyalah metode lama biasa.
gcl1
8
Terima kasih untuk ini. Ini adalah bug dalam dokumentasi (mereka tidak pernah menyebutkan membutuhkan ini atau di IabHelper. IabHelper's launchPurchaseFlow () memanggil startIntentSenderForResult - yang akan memanggil aktivitas Anda onActivityResult () ketika selesai.
Jerry Brady
3
Saya pikir saya telah menyelesaikan masalah saya ketika saya menemukan ini ... kemudian saya menyadari bahwa saya telah menerapkan fungsi ini dan masih tidak berhasil ... sigh
Matt K
3
Perhatikan bahwa mengganti onActivityResult () pada Fragmen tidak berfungsi, itu harus dilakukan pada Aktivitas
cprcrack
8

saya baru saja menemukan hal penting lainnya: kode permintaan yang digunakan untuk meluncurkan aliran pembelian harus> = 0!

saya menggunakan "new Random (). nextInt ()" untuk menghasilkan requestCode acak, dan terkadang berhasil, terkadang tidak. sekarang saya menemukan dalam dokumentasi berikut, bahwa requestCode tidak boleh berupa angka negatif:

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

drwuro
sumber
3

Saya memiliki masalah yang sama dan onActivityResult juga tidak dipanggil.
Terinspirasi dari jawaban @ Ghulam, saya menyadari bahwa aktivitas onActivityResult tidak memanggil onActivityResult fragmen secara otomatis, jadi saya harus melakukannya secara manual.

@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
sumber
Dalam kasus saya, jawaban ini berhasil, tetapi saya harus menambahkan penggantian OnActivityResult di aktivitas utama saya ( github.com/onepf/OpenIAB/issues/166 )
PayToPwn
1

Anda perlu memanggil onActivityResult () yang dilindungi void; Di Aktivitas orang tua Anda, bukan MainActivity (Trivial Drive) di mana dari Anda memanggil MainActivity Anda yaitu Aktivitas Drive Trivial.

Anda akan menerima nilai kode hasil -1 jika pembelian berhasil jika tidak 0.

Pengembang Aplikasi Seluler
sumber
0

Saya menghadapi masalah yang sama dan solusi yang diterima sudah diterapkan tetapi tidak tahu apa yang menyebabkan ini. Pindah ke Library Layanan Penagihan Google Play 1.0 yang baru (dirilis pada 19 September 2017) telah memperbaiki masalah saya!

Saya berharap tautan berikut akan membantu seseorang yang ingin menerapkan perpustakaan baru:

Entri blog Google tentang rilis tersebut

Video youtube Google

Mainkan Kelas Pelatihan Perpustakaan Penagihan

Contoh Trivial Drive v2 Google

Codelab Play Billing Library yang dipublikasikan selama Google I / O 2017

Mainkan Dokumen Perpustakaan Penagihan

Referensi resmi untuk kelas dan metode

Merilis catatan

Mohit Singh
sumber