我在Google Play商店发布了一个Android应用程序,上周发布了一个新的更新版本,只是为了修复一些小问题。从我将更新版本添加到Play商店开始,我就可以在Firebase Crashlytics上看到当有人尝试购买应用程序功能时存在问题。
在将更新版本发布到生产之前,我将该应用程序添加到Alpha测试中,以确保InAppPurchase正常工作,结果也是正常的。
当其他人尝试购买应用程序功能时,我会看到抛出了这个致命异常:
SKU仍在我的“管理产品”列表中处于活动状态。
这是我在片段中使用的代码来初始化计费客户端:
为了启动计费流程,用户必须在对话框内点击一个按钮。以下是代码:
在我应用的旧版本中,从未发生过这种情况,只是在新升级后才开始发生。我只需要知道可能是什么导致了这个问题,可能是我的代码出了问题还是Google Play服务方面的问题?我需要指出,这在不同设备和不同Android版本上都发生了。
非常感谢您提前的帮助。
在将更新版本发布到生产之前,我将该应用程序添加到Alpha测试中,以确保InAppPurchase正常工作,结果也是正常的。
当其他人尝试购买应用程序功能时,我会看到抛出了这个致命异常:
Fatal Exception: java.lang.IllegalArgumentException: SKU cannot be null.
at com.android.billingclient.api.BillingFlowParams$Builder.build(com.android.billingclient:billing@@3.0.0:23)
SKU仍在我的“管理产品”列表中处于活动状态。
这是我在片段中使用的代码来初始化计费客户端:
billingClient = BillingClient.newBuilder(getActivity())
.enablePendingPurchases()
.setListener(purchasesUpdatedListener)
.build();
这是我用来启动连接的代码:
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
Log.d(TAG, "Connection finished");
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
// The BillingClient is ready. You can query purchases here.
List<String> skuList = new ArrayList<>();
skuList.add("unlock_keyboard");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(@NonNull BillingResult billingResult,
List<SkuDetails> skuDetailsList) {
// Process the result.
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {
for (Object skuDetailsObject : skuDetailsList) {
skuDetails = (SkuDetails) skuDetailsObject;
sku = skuDetails.getSku();
}
Log.d(TAG, "i got response");
Log.d(TAG, String.valueOf(billingResult.getResponseCode()));
Log.d(TAG, billingResult.getDebugMessage());
}
}
});
}
}
这是我用来处理购买的代码:
PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null) {
for (Purchase purchase : list) {
handlePurchase(purchase);
Log.d(TAG, "Purchase completed" + billingResult.getResponseCode());
}
} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
Log.d(TAG, "User Canceled" + billingResult.getResponseCode());
} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
if ("unlock_keyboard".equals(sku)) {
KeyboardAlreadyPurchasedConfirmation();
}
Log.d(TAG, "Item Already owned" + billingResult.getResponseCode());
}
}
};
为了启动计费流程,用户必须在对话框内点击一个按钮。以下是代码:
builder.setPositiveButton(
getString(R.string.purchase_keyboard),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
sku = "unlock_keyboard";
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetails)
.build();
billingClient.launchBillingFlow(Objects.requireNonNull(getActivity()), flowParams);
}
});
在我应用的旧版本中,从未发生过这种情况,只是在新升级后才开始发生。我只需要知道可能是什么导致了这个问题,可能是我的代码出了问题还是Google Play服务方面的问题?我需要指出,这在不同设备和不同Android版本上都发生了。
非常感谢您提前的帮助。