web-dev-qa-db-ja.com

onIabPurchaseFinishedは呼び出されません。

私は最初のアプリのアプリ内課金を設定しようとしており、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!");
             }


    }
};
110
AAAton

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.");
    }
}
203
bugzy

私はちょうど別の重要なことを見つけました:購入フローを起動するために使用されるrequestCodeは0以上でなければなりません!

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

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

8
drwuro

同じ問題があり、onActivityResultも呼び出されませんでした。
インスピレーション @ Ghulam's answer アクティビティ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);
        }
    }
3

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

リンクをたどると、新しいライブラリを実装したい人に役立つと思います。

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

Googleのyoutubeビデオ

課金ライブラリトレーニングクラスをプレイ

GoogleのTrivial Drive v2サンプル

Google I/O 2017の間に公開されたPlay Billing Library codelab

課金ライブラリドキュメントの再生

クラスおよびメソッドの公式リファレンス

リリースノート

0
Mohit Singh

Protected void onActivityResult();を呼び出す必要があります。 MainActivity(Trivial Drive)の代わりに親Activityで、Trivial DriveアクティビティであるMainActivityを呼び出しています。

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