当前位置: 首页 > 知识库问答 >
问题:

重新安装应用后的谷歌应用内购买请求

童华池
2023-03-14

我在App中实现了谷歌。它的工作良好后,发布了应用程序。但我正面临一个问题。当用户安装应用程序,然后购买项目,然后卸载应用程序,重新安装,并前往购买的项目,然后应用agian锁定购买的项目,并提出购买请求。OnRestoreTransaction有问题吗?我使用的代码从谷歌在应用程序购买网站。代码如下:

 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);
                    }
            }
            }
        });

我在应用程序内java文件的onCrearte中将其称为:这首先检查当前用户是否购买了他所要求的物品,如果没有,则发出购买请求。在OnPurchesStateChanged中,我只检查了状态是否已购买。

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个答案

沈俊明
2023-03-14

为了还原所有购买的项目,您必须显式调用MBillingService.RestoreTransactions()。那么您将收到每个先前购买的项目的OnPurchaseStateChange回调。

将此代码放在oncreate方法中,它应该可以很好地工作:

if (!getPreferences(Context.MODE_PRIVATE).getBoolean(DB_INITIALIZED, false)) {
    mBillingService.restoreTransactions();
}
 类似资料:
  • 准备工作 付费应用协议 如果你还没有,你需要在 iTunes Connect 签署付费应用协议, 并设置您的银行和税务信息。 iTunes Connect 开发人员帮助: 协议、税务和银行概述 创建您的应用内购买 然后,您需要在iTunes Connect中配置您的应用内购买,并包含名称,定价和说明等详细信息,以突出显示您的应用内购买的功能。 iTunes Connect开发人员帮助:创建应用程序

  • 这个问题(Android应用内计费动态产品列表)是3年前问过的。动态的应用内购买项目在Android上还是不可用的吗? 我之所以要实现这种功能,是因为我的应用程序提供了一种让某些用户创建自己的应用内购买的方式,供其他人购买。

  • 我正在开发一个应用内购买。我已将该应用程序放在 Play 商店进行封闭测试。在帐户设置中使用测试人员电子邮件和添加的测试人员电子邮件。我在 Play 商店中有 2 个托管产品。我在调试模式下测试了 android.test.purchased 并且工作正常。但是在我购买 SKU 时从 Play 商店安装的发布版本中,它成功完成了购买,但由于某种原因我收到了失败响应。我试图弄清楚这一点。此外,我在购

  • 我在google play store中有一个应用程序,在添加计费3V以处理订阅时遇到了一些问题。任何新的订阅者在付款和付款完成并出现在谷歌控制台后都无法访问我的应用程序。 我希望能在我的应用程序中帮助我处理应用程序内购买,代码如下: public static void isUserHasSubscription(Context Context,onCheck onCheck){BillingC

  • 问题内容: 我在应用程序购买中玩了几天,直到我尝试在应用程序商店验证收据之前一切正常,因为我一直在找回无效状态。 我将收据数据传递到我的PHP服务器,然后从那里转发到应用商店,一旦收到有效的响应,我打算将收据数据添加到我的数据库中。 商店工具包编程指南和类引用对于这个特定领域并没有什么用,因为它们并没有真正给您提供任何示例,我确实找到了一篇有用的文章,对我有所帮助,但是仍然有些错误。 基本上,我想

  • 我有应用程序,它在谷歌播放商店发布了一个工作不错。我想在华为商店发布这个应用。但在我的应用程序中,我有谷歌计费的应用程序内购买。华为允许在他们商店发布应用吗?还是我需要实施华为采购然后发布?