Android内购故障:购买后未加9枚金币且无法重复购买
内购功能问题排查与修复
一、购买后金币未增加的问题
错误点分析
- SharedPreferences存储逻辑错误:在
onProductPurchased方法中,你已经计算出累加后的金币数coins = coins + 9,但最终存储的是硬编码的9,而非累加后的变量值,导致每次购买后金币都会被重置为9,无法实现“增加9枚”的效果。 - TextView文本设置错误:
tvCoin.setText(coins)直接传入int类型参数,系统会将其解析为资源ID而非数字文本,导致显示异常。
修正后的onProductPurchased方法
@Override public void onProductPurchased(String productId, TransactionDetails details) { int coins = sharedpreferences.getInt("coins", 0); coins += 9; // 计算累加后的金币数 tvCoin.setText(String.valueOf(coins)); // 转换为字符串后设置文本 sharedpreferences.edit().putInt("coins", coins).apply(); // 存储正确的金币数值 startActivity(new Intent(BuyActivity.this, ProcessingActivity.class)); finish(); Log.d("MainActivity", "onProductPurchased: 金币已成功增加"); }
二、无法重复购买的问题
错误点分析
你当前使用bp.subscribe(this, premium)调用订阅功能,订阅属于周期性付费服务,本身不支持重复购买(仅支持升级/降级)。而你需要的是一次性购买的金币商品,应该使用bp.purchase()方法,同时要确保Google Play后台将该商品设置为消耗型商品。
修正后的购买触发代码
在onBillingInitialized的两个点击事件中,替换订阅方法为购买方法:
tvBuy.setOnClickListener(v1 -> { // 替换subscribe为purchase,调用一次性商品购买接口 bp.purchase(BuyActivity.this, premium); }); // 弹窗内的购买按钮同步修改 dialogView.findViewById(R.id.buttonOk).setOnClickListener(v1 -> { alertDialog.dismiss(); bp.purchase(BuyActivity.this, premium); });
补充消耗逻辑(关键)
消耗型商品购买后必须调用消耗接口,才能允许用户再次购买,在onProductPurchased中补充消耗逻辑:
@Override public void onProductPurchased(String productId, TransactionDetails details) { int coins = sharedpreferences.getInt("coins", 0); coins += 9; tvCoin.setText(String.valueOf(coins)); sharedpreferences.edit().putInt("coins", coins).apply(); // 消耗已购买的商品,开启下一次购买权限 if (bp.isPurchased(productId)) { bp.consumePurchase(productId); } startActivity(new Intent(BuyActivity.this, ProcessingActivity.class)); finish(); Log.d("MainActivity", "onProductPurchased: 金币已增加,商品已完成消耗"); }
内容的提问来源于stack exchange,提问作者shvy banlin
相关产品推荐
相关产品推荐

