2

InAppBilling API の v3 で IAP を使用する方法をようやく見つけました。ユーザーは、いつでも好きなだけ製品を消費できるようになりました。

ここで、購入が完了したことを確認したら、ユーザーの GUI を更新したいと考えています。以下のコード全体にトーストを配置して、GUI を更新する場所を見つけようとしましたが、まだトーストが表示されていません。ただし、IAP の消費は機能することを忘れないでください。

ユーザーの GUI を更新するスニペットの下のコードを特定しました。そのコードのスニペットは、購入が正常に完了した後に実行したいものです。

だから私の質問は、購入が成功した後にユーザーのために GUI が更新されるように、コードのスニペットをどこに置くかということです。

public class Levels extends SwarmActivity {

    //static final String SKU_BUYLIVES = "buy5lives";
    static final String SKU_BUYLIVES = "android.test.purchased";

    IabHelper mHelper;
    IInAppBillingService mService;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        moreLives = (Button)findViewById(R.id.moreLives);

        moreLives.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                buyLives();
            }
        });
     }

    public void buyLives() {

        final Dialog dialog = new Dialog(c);
        dialog.setContentView(R.layout.buylives);

        String base64EncodedPublicKey = a + b + d + e + f + g + h + i + j + k;

        TextView title = (TextView)dialog.findViewById(R.id.question);
        Button no = (Button)dialog.findViewById(R.id.no);
        Button yes = (Button)dialog.findViewById(R.id.yes);

        title.setText(c.getResources().getString(R.string.buyLivesQuestion));
        no.setText(c.getResources().getString(R.string.maybelater));
        yes.setText(c.getResources().getString(R.string.buy));

        // Create the helper, passing it our context and the public key to verify signatures with
        mHelper = new IabHelper(Levels.this, base64EncodedPublicKey);

        // start setup. this is asynchronous and the specified listener will be called once setup completes.
        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result) {

                if (!result.isSuccess()) {
                    // there was a problem.
                    complain("An error has occurred.  We apologize for the inconvenience.    " + c.getResources().getString(R.string.problem1) + " " + result);
                    return;
                }

                // IAB is fully set up. Now, let's get an inventory of stuff we own.
                mHelper.queryInventoryAsync(mGotInventoryListener);                
            }
        });

        yes.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {                
                mHelper.launchPurchaseFlow(Levels.this, SKU_BUYLIVES, 10001, mPurchaseFinishedListener, "payload");
                dialog.dismiss();

// the below ~14 lines is the code that I want to call to update the GUI for the user.  this block of code has been all over the place.  this is just the last spot I tested it at.
                SharedPreferences settings = getSharedPreferences("level_SP", 0);
                livesCount = settings.getInt("livesTotal1", 0);
                remainderTimeStamp = settings.getLong("remainderTimeStamp1", 0);

                livesCount = 5;
                remainderTimeStamp = 0;

                SharedPreferences.Editor editor = settings.edit();
                editor.putInt("livesTotal1", livesCount);
                editor.putLong("remainderTimeStamp1", remainderTimeStamp);
                editor.commit();

                livesCountTV.setText(c.getResources().getString(R.string.livesCount) + "  " + livesCount);
                livesCounterTV.setText(c.getResources().getString(R.string.livesCounter) + "  FULL!");
            }
        });

        no.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                dialog.dismiss();
            }
        });
        dialog.show();
    }

    // listener that's called when we finish querying the items and subscriptions we own.
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            if(result.isFailure()) {

                complain(c.getResources().getString(R.string.sorryerror) + c.getResources().getString(R.string.failedtoquery) + " " + result);
                return;
            } else if(inventory.hasPurchase(SKU_BUYLIVES)) {
                mHelper.consumeAsync(inventory.getPurchase(SKU_BUYLIVES), null);
            }
        }
    };

    // callback for when a purchase is finished
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {

            // this appears to the user immediately after purchasing.
            if(result.isFailure()) {

                complain(c.getResources().getString(R.string.sorryerror) + result);

            } else if(purchase.getSku().equals(SKU_BUYLIVES)) {

                alert(c.getResources().getString(R.string.livesbought));

                try {
                    Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);
                    int response = ownedItems.getInt("RESPONSE_CODE");

                    if (response == 0) {
                        // success
                        Toast.makeText(Levels.this, "SUCCESS", Toast.LENGTH_LONG).show();

                        try {
                            mService.consumePurchase(3, getPackageName(), SKU_BUYLIVES);

// this Toast is never seen.
                            Toast t = Toast.makeText(Levels.this, "PURCHASE CONSUMED", Toast.LENGTH_LONG);
                            t.setGravity(Gravity.CENTER, 0, 0);
                            t.show();
                        } catch (RemoteException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }                       
                    } else {
                        // error
// this Toast is never seen.
                        Toast.makeText(Levels.this, "ERROR", Toast.LENGTH_LONG).show();
                    }

                } catch (RemoteException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }       
            }
            return;
        }
    };

    void complain(String message) {
        alert("Error: " + message);
    }

    void alert(String message) {
        AlertDialog.Builder bld = new AlertDialog.Builder(this);
        bld.setMessage(message);
        bld.setNeutralButton("OK", null);
        bld.create().show();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if(mHelper != null) mHelper.dispose();
        mHelper = null;
    }
}
4

1 に答える 1