如何使用Android Studio对多个商品实施应用内购买

问题描述

我正在使用应用内购买库针对3个具有不同价格标签的商品创建一个android应用。我可以在点击项目时调用应用内结算过程,但仅显示剩余2个点击项目的第一个项目的结算流程。下面是我实现的代码,但到目前为止还算不上运气。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        setupBillingClient();
        }

private void setupBillingClient() {
        billingClient = BillingClient.newBuilder(this)
                .enablePendingPurchases()
                .setListener(this)
                .build();
        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
                if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
                    Toast.makeText(TinyCompassthemePackage.this,"SUCCESS",Toast.LENGTH_SHORT).show();
                    loadAllSKUs();
                } else {
                    Toast.makeText(this,"Failed.!",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onBillingServicedisconnected() {
                Toast.makeText(this,"disconnected.",Toast.LENGTH_SHORT).show();
            }
        });
    }
    private void loadAllSKUs() {
        if (billingClient.isReady()) {
            SkuDetailsParams params = SkuDetailsParams.newBuilder()
                    .setSkusList(Arrays.asList(skuproduct_itemone,skuproduct_itemtwo,skuproduct_itemthree))
                    .setType(BillingClient.SkuType.INAPP)
                    .build();
            billingClient.querySkuDetailsAsync(params,new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(@NonNull BillingResult billingResult,List<SkuDetails> skuDetailsList) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {
                        for (Object skuDetailsObject : skuDetailsList) {
                            skuDetails = (SkuDetails) skuDetailsObject; if(skuDetails.getSku().equals(item1_id)) {
                                mySkuDetails = skuDetails;
                                itemOne.setonClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        BillingFlowParams params = BillingFlowParams
                                                .newBuilder()
                                                .setSkuDetails(skuDetails)
                                                .build();
                                        billingClient.launchBillingFlow(this,params);
                                    }
                                });
                            } else if(skuDetails.getSku().equals(item2_id)) {
                                mySkuDetails = skuDetails;
                                itemTwo.setonClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        BillingFlowParams params = BillingFlowParams
                                                .newBuilder()
                                                .setSkuDetails(skuDetails)
                                                .build();
                                        billingClient.launchBillingFlow(this,params);
                                    }
                                });
                            } else if(skuDetails.getSku().equals(item3_id)) {
                                mySkuDetails = skuDetails;
                                itemThree.setonClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        BillingFlowParams params = BillingFlowParams
                                                .newBuilder()
                                                .setSkuDetails(skuDetails)
                                                .build();
                                        billingClient.launchBillingFlow(this,params);
                                    }
                                });
                            }
                            }
                            }
                            });
        } else {
            Toast.makeText(MainActivity.this,"Not ready!",Toast.LENGTH_SHORT).show();
        }
    }
    @Override
    public void onPurchasesUpdated(@NonNull BillingResult billingResult,@Nullable List<Purchase> purchases) {
        int responseCode = billingResult.getResponseCode();
        if (responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
            for (Purchase purchase : purchases) {
                handlePurchase(purchase);
            }
        } else if (responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
            Toast.makeText(this,"Canceled.!",Toast.LENGTH_SHORT).show();
        } else if (responseCode == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
          
            if(skuDetails.getSku().equals(item1_id)) {
                skuDetails = mySkuDetails;
                itemOne.setonClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        unLockItemOne();
                        Toast.makeText(MainActivity.this,"Item 1 already purchased.",Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(MainActivity.this,MainActivity.class));
                        finish();
                    }
                });
            } else if(skuDetails.getSku().equals(item2_id)) {
                skuDetails = mySkuDetails;
                itemTwo.setonClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        unLockItemTwo();
                        Toast.makeText(MainActivity.this,"Item 2 already purchased.",MainActivity.class));
                        finish();
                    }
                });
            } else if(skuDetails.getSku().equals(item3_id)) {
                skuDetails = mySkuDetails;
                itemThree.setonClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        unLockItemThree();
                        Toast.makeText(MainActivity.this,"Item 3 already purchased.",MainActivity.class));
                        finish();
                    }
                });
            }
        } else if (responseCode == BillingClient.BillingResponseCode.SERVICE_TIMEOUT){
            Toast.makeText(MainActivity.this,"Timeout.!",Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(MainActivity.this,"Unable to process.! ResponseCode :: " + responseCode,Toast.LENGTH_LONG).show();
        }
    }
    
    private void handlePurchase(Purchase purchase) {
        if ((purchase.getSku().equals(item1_id)) && (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED)) {
            if (!purchase.isAckNowledged()) {
                AckNowledgePurchaseParams ackNowledgePurchaseParams = AckNowledgePurchaseParams
                        .newBuilder()
                        .setPurchasetoken(purchase.getPurchasetoken())
                        .build();
                billingClient.ackNowledgePurchase(ackNowledgePurchaseParams,new AckNowledgePurchaseResponseListener() {
                    @Override
                    public void onAckNowledgePurchaseResponse(@NonNull BillingResult billingResult) {
                        if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK) {
                            Toast.makeText(MainActivity.this,"Thank You,Item 1 is unlocked.",Toast.LENGTH_LONG).show();
                            unLockItemOne();
                            startActivity(new Intent(MainActivity.this,MainActivity.class));
                            finish();
                        }else{
                            Toast.makeText(MainActivity.this,"AckNowledge Error.!",Toast.LENGTH_LONG).show();
                        }
                    }
                });
            }
        } else if ((purchase.getSku().equals(item2_id)) && (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED)) {
            if (!purchase.isAckNowledged()) {
                AckNowledgePurchaseParams ackNowledgePurchaseParams = AckNowledgePurchaseParams
                        .newBuilder()
                        .setPurchasetoken(purchase.getPurchasetoken())
                        .build();
                billingClient.ackNowledgePurchase(ackNowledgePurchaseParams,Item 2 is unlocked.",Toast.LENGTH_LONG).show();
                            unLockItemTwo();
                            startActivity(new Intent(MainActivity.this,Toast.LENGTH_LONG).show();
                        }
                    }
                });
            }
        } else if ((purchase.getSku().equals(item3_id)) && (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED)) {
            if (!purchase.isAckNowledged()) {
                AckNowledgePurchaseParams ackNowledgePurchaseParams = AckNowledgePurchaseParams
                        .newBuilder()
                        .setPurchasetoken(purchase.getPurchasetoken())
                        .build();
                billingClient.ackNowledgePurchase(ackNowledgePurchaseParams,Item 3 is unlocked.",Toast.LENGTH_LONG).show();
                            unLockItemThree();
                            startActivity(new Intent(MainActivity.this,Toast.LENGTH_LONG).show();
                        }
                    }
                });
            }
        }
        } else {
            Toast.makeText(MainActivity.this,"Unable to handle.!",Toast.LENGTH_SHORT).show();
        }
    }

我没弄错我在哪里。预先感谢。.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)