2

(最終的には) Google Play アプリ内課金の v2 実装を出荷した後、ローンチ後は問題しかありませんでした。トランザクションのドロップ、クラッシュ、復元できない、「ダウンロードできません、このアイテムは既に所有しています」などのクレイジーなエラー、その他あらゆる種類のばかげたこと。正直なところ、私は IAB を iOS、Amazon App Store、Samsung Apps、Blackberry 10 に統合しましたが、Google Play のコードは他のすべてを合わせたよりも時間がかかりました。10倍。それはただひどいです。

とにかく、私は自分のアプリに v3 を実装しようと決めました。統合プロセスははるかに簡単でした。Google のおかげです。また、以前のトランザクションの復元が期待どおりに機能するようになったので、これはすばらしいことです。ただし、表示を停止する問題がいくつかあります。

  1. ユーザーが IAB ダイアログを閉じたとき (つまり、ダイアログの境界線の外側をタップしたとき)、私はこれに関する通知を受け取りません。ある種の「ユーザーがキャンセルした」失敗イベントを受け取ることを期待しますが、onIabPurchaseFinished、onConsumeFinished、または onQueryInventoryFinished には何も発生しません。その結果、私のアプリはこれに応答せず、画面に汚れた素晴らしい未使用のアクティビティが残っています。ある種の「dialogIsFinished」イベントがありませんか?
  2. ユーザーが既に所有しているアイテムを購入しようとすると、アプリがクラッシュします。信じられないことに、これは意図された動作のように見えます。これをほのめかす何かがコンソールに出力されているためです (「アプリ内課金エラー: アイテムを購入できません。エラー応答: 7: アイテムは既に所有されています」)。起動時に復元可能なトランザクションを照会することになっていることは理解していますが、復元操作が完了する前にユーザーが UI の購入フローに移動できる可能性があるため、これは解決策ではありません。確かに、これはダイアログ ボックスなどのハード ストップではないはずですか? ここで何か間違ったことをしていますか?Google の誰かが、この状況はハード クラッシュに値すると考えていることを理解できません...

(事前に)ご協力いただきありがとうございます。私の質問は、何よりも機能設計に関するものであるように思われますが、コードが必要であると思われる場合は喜んでコードを共有します。Google のような有能な会社がこのシステム全体を書き直して、そこらじゅうにこれほど大きな穴があるとは考えられないので、ここで何か間違ったことをしていることを願っています... :-/

再度、感謝します、

ベン

4

2 に答える 2

2

同じエラーが発生しました。購入後に誤ってアイテムを消費するのを忘れていました。しかし、同じアイテムを別のものを購入しようとすると、アプリがクラッシュしました。

Google IabHelper クラスを調べたところ、このステートメントが正しく処理されていないことがわかりました。小さな変更を加えたところ、動作するようになりました。クラッシュする代わりに、リスナーでエラー メッセージを送り返します。

コードの変更部分は次のとおりです。launchPurchaseFlow()方法中です。必要と思われるコードを変更して何か良いことをしたかどうかはわかりません。それが役に立てば幸い。

try {
        logDebug("Constructing buy intent for " + sku);
        Bundle buyIntentBundle = mService.getBuyIntent(3, mContext.getPackageName(), sku, ITEM_TYPE_INAPP, extraData);
        int response = getResponseCodeFromBundle(buyIntentBundle);
        if (response != BILLING_RESPONSE_RESULT_OK) {
            logError("Unable to buy item, Error response: " + getResponseDesc(response));

            result = new IabResult(response, "Unable to buy item");
            if (listener != null) listener.onIabPurchaseFinished(result, null);

            /* Finish Current Async Task*/
            flagEndAsync();

        } else {
            PendingIntent pendingIntent = buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT);
            logDebug("Launching buy intent for " + sku + ". Request code: " + requestCode);
            mRequestCode = requestCode;
            mPurchaseListener = listener;
            act.startIntentSenderForResult(pendingIntent.getIntentSender(),
                                           requestCode, new Intent(),
                                           Integer.valueOf(0), Integer.valueOf(0),
                                           Integer.valueOf(0));

        }
于 2013-02-14T16:11:18.813 に答える