onIabPurchaseFinishedが呼び出されることはありません。


111

最初のアプリのアプリ内課金を設定しようとして、android.test.purchased skuを使用しています。購入が完了したので、なんとかSKUを在庫に入れましたが、タイトルにあるように、onIabPurchaseFinishedが呼び出されることはありません。

私はそれがこのログと関係があると思う:「フォーカスされたビューcom.android.internal.policy.impl.PhoneWindow$DecorView@406743d0にIDがないため、どのビューにフォーカスがあるかを保存できませんでした」。これは、Google Playに進む直前に表示されます。それがどういう意味かよくわかりません...

購入を開始しています:

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

そしてリスナー:

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

プログラムでIDを設定しましたが、違いはありません。
AAAton 2013

回答:


206

これを呼び出すアクティビティにこれを追加してみてください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.");
    }
}

16
同じ問題があり、それは完璧に機能しました。しかし、私が知りたいのは、なぜコールバックが想定されたように実行されないのか、なぜそれを自分自身に呼び出さなければならないのですか?一種のコールバックは役に立たなくなります:/
Spider

4
thx、私も助けてくれました。@Spider、アクティビティでこのメソッドが必要な理由は、それ以外の場合はmHelperのhandleActivityResult()メソッドが呼び出されないためです。言い換えると、これはアクティビティで必要な実際の/標準のhandleActivityResult()であり、mHelperは実際には通常の古いメソッドです。
gcl1 2013

8
これをありがとう。これはドキュメントのバグです(これが必要か、IabHelperで言及されていることは決してありません。IabHelperのlaunchPurchaseFlow()はstartIntentSenderForResultを呼び出します
Jerry Brady

3
私はこれを見つけたときに問題を解決したと思いました...その後、私はすでにこの機能を実装していても機能しないことに気づきました... ため息
Matt K

3
FragmentでのonActivityResult()のオーバーライドは機能しないことに注意してください。アクティビティで実行する必要があります
cprcrack

8

私は別の重要なことを見つけました:購入フローを開始するために使用されるrequestCodeは> = 0でなければなりません!

「new Random()。nextInt()」を使用してランダムなrequestCodeを生成しました。今、私は次のドキュメントで、requestCodeが負の数であってはならないことを発見しました:

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


3

同じ問題があり、onActivityResultも呼び出されませんでした。 @Ghulamの回答
触発されて、アクティビティonActivityResultがフラグメントのonActivityResultを自動的に呼び出さないため、手動で実行する必要があることに気付きました。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(mCurrentFragment!= null){
            mCurrentFragment.onActivityResult(requestCode, resultCode, data);
        }
    }

私の場合、この答えは機能しましたが、メインアクティビティ(github.com/onepf/OpenIAB/issues/166)にOnActivityResultオーバーライドを追加する必要がありました
PayToPwn 2018年

1

protected void onActivityResult();を呼び出す必要があります。MainActivity(Trivial Drive)ではなく親アクティビティで、MainActivityをトリビアルドライブアクティビティと呼びます。

購入が成功した場合は結果コード値-1を受け取り、それ以外の場合は0を受け取ります。


0

私は同じ問題に直面しており、受け入れられたソリューションはすでに実装されていますが、これを引き起こしている原因を特定できませんでした。新しいGoogle Play Billing Library 1.0 (2017年9月19日にリリース)に移行すると、問題が解決しました!

以下のリンクが新しいライブラリを実装したい人に役立つことを願っています:

リリースに関するGoogleのブログ投稿

GoogleのYouTubeビデオ

Play Billing Libraryトレーニングクラス

GoogleのTrivial Drive v2サンプル

Google I / O 2017中に公開されたPlay Billing Libraryコードラボ

Billing Library Docsを再生する

クラスとメソッドの公式リファレンス

リリースノート

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.