首页 文章

谷歌In-APP购买请求重新安装APP后

提问于
浏览
1

我在App中实现了Google . 发布应用程序后,它的工作正常 . 但我面临一个问题 . 当用户安装应用程序然后购买项目然后卸载应用程序并重新安装它并转到购买的项目然后应用程序锁定已购买的项目并询问购买请求 . OnRestoreTransaction有什么问题吗?我使用了Google In app Purchse网站的代码 . 这是代码:

private class DungeonsPurchaseObserver extends PurchaseObserver {
        public DungeonsPurchaseObserver(Handler handler) {
            super(in_app.this, handler);
        }

        @Override
        public void onBillingSupported(boolean supported) {
            if (Consts.DEBUG) {
                Log.i(TAG, "supported: " + supported);
            }
            if (supported) {
                restoreDatabase();  

            } else {
                showDialog(DIALOG_BILLING_NOT_SUPPORTED_ID);
            }
        }

        @Override
        public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
                int quantity, long purchaseTime, String developerPayload) {
            if (Consts.DEBUG) {
                Log.i(TAG, "onPurchaseStateChange() itemId: " + itemId + " " + purchaseState);
            }

            if (purchaseState == PurchaseState.PURCHASED ) {
                finish();
            }
        }


        @Override
        public void onRequestPurchaseResponse(RequestPurchase request,
                ResponseCode responseCode) {
            if (Consts.DEBUG) {
                Log.d(TAG, request.mProductId + ": " + responseCode);
            }
            if (responseCode == ResponseCode.RESULT_OK) {
                if (Consts.DEBUG) {
                    Log.i(TAG, "purchase was successfully sent to server");
                }
            } else if (responseCode == ResponseCode.RESULT_USER_CANCELED) {
                if (Consts.DEBUG) {
                    Log.i(TAG, "user canceled purchase");
                }
            } else {
                if (Consts.DEBUG) {
                    Log.i(TAG, "purchase failed");
                }
            }
        }

        @Override
        public void onRestoreTransactionsResponse(RestoreTransactions request,
                ResponseCode responseCode) {
            if (responseCode == ResponseCode.RESULT_OK) {
                if (Consts.DEBUG) {
                    Log.d(TAG, "completed RestoreTransactions request");
                }
                // Update the shared preferences so that we don't perform
                // a RestoreTransactions again.
                SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
                SharedPreferences.Editor edit = prefs.edit();
                edit.putBoolean(DB_INITIALIZED, true);
                edit.commit();
            } else {
                if (Consts.DEBUG) {
                    Log.d(TAG, "RestoreTransactions error: " + responseCode);
                }
            }
        }
    }


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.in_app);

        mHandler = new Handler();
        mDungeonsPurchaseObserver = new DungeonsPurchaseObserver(mHandler);
        mBillingService = new BillingService();
        mBillingService.setContext(this);

        mPurchaseDatabase = new PurchaseDatabase(this);
        //setupWidgets();

        // Check if billing is supported.
        ResponseHandler.register(mDungeonsPurchaseObserver);
        if (!mBillingService.checkBillingSupported()) {
            showDialog(DIALOG_CANNOT_CONNECT_ID);
        }



        purchase=(Button) findViewById(R.id.purchase);
        cancel=(Button) findViewById(R.id.cancel);

        purchase.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(!ownedItems.contains("android.test.refunded")){      
                    if (Consts.DEBUG) {
                        Log.d(TAG, "buying: " + "  product" + " Product Name: " + "Product");
                    }

                    if (!mBillingService.requestPurchase("android.test.refunded", mPayloadContents)) {
                        showDialog(DIALOG_BILLING_NOT_SUPPORTED_ID);
                    }
            }
            }
        });

Edited:

我在应用程序内java文件的onCrearte中调用它:这首先检查当前用户是否购买了他要求的项目,如果没有,那么请求购买 . 在onPurchsestateChanged我只检查过该州是否已购买 .

public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow() . setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);的setContentView(R.layout.in_app);

mHandler = new Handler();
    mDungeonsPurchaseObserver = new DungeonsPurchaseObserver(mHandler);
    mBillingService = new BillingService();
    mBillingService.setContext(this);

    mPurchaseDatabase = new PurchaseDatabase(this);
    //setupWidgets();

    // Check if billing is supported.
    ResponseHandler.register(mDungeonsPurchaseObserver);
    if (!mBillingService.checkBillingSupported()) {
        showDialog(DIALOG_CANNOT_CONNECT_ID);
    }
    System.out.println("for check"+getPreferences(Context.MODE_PRIVATE).getBoolean(DB_INITIALIZED, false));

    if (getPreferences(Context.MODE_PRIVATE).getBoolean(DB_INITIALIZED, false)) {
        System.out.println(mBillingService.restoreTransactions());
    }
    else{
    purchase=(Button) findViewById(R.id.purchase);
    cancel=(Button) findViewById(R.id.cancel);

    purchase.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(!ownedItems.contains("android.test.refunded")){      
                if (Consts.DEBUG) {
                    Log.d(TAG, "buying: " + " product" + " Product Name: " + "i");
                }


                if (!mBillingService.requestPurchase("android.test.refunded", mPayloadContents)) {
                    showDialog(DIALOG_BILLING_NOT_SUPPORTED_ID);
                }
        }
        }
    });


    cancel.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            finish();
            startActivity(new Intent(in_app.this, Main.class));
            overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
        }
    });
    }
}

OnPurchaseStateChanged:

public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
            int quantity, long purchaseTime, String developerPayload) {

        if (Consts.DEBUG) {
            Log.i(TAG, "onPurchaseStateChange() itemId: " + itemId + " " + purchaseState);
        }
        System.out.println("here for new fun");
        if (purchaseState == PurchaseState.PURCHASED ) {

            finish();
            Intent intent1 = new Intent(context,BodyParts1.class);
            context.startActivity(intent1);
        }


    }

1 回答

  • 1

    要恢复所有购买的商品,您必须明确调用 mBillingService.restoreTransactions() . 然后,您将收到每个先前购买的项目的 onPurchaseStateChange 回调 .

    将此代码放在 onCreate 方法中,它应该运行良好:

    if (!getPreferences(Context.MODE_PRIVATE).getBoolean(DB_INITIALIZED, false)) {
        mBillingService.restoreTransactions();
    }
    

相关问题