一年以来,我开发了 android 应用程序。我认为现在是进行下一步并实施计费系统的时候了。在我的主应用程序中实现这个新功能之前,我认为最好对其进行测试。
上周我开发了一个测试应用程序,与我的主应用程序(没有 v3 计费系统)相同的应用程序(使用 v3 计费系统)。我通过 Google Play 发布并安装在我的三星 Note 上。我能够购买和订阅。而且效果很好。所以我停用了测试应用程序,在我的主应用程序中复制了整个计费方法,更改了 Base64 编码的公共 RSA 密钥并发布了它。
安装并启动后,应用程序每次都崩溃。原因只是计费系统,因为最近的版本在没有计费系统的情况下运行良好。当然,我可以用一个与我的主应用程序相同的新应用程序替换我的主应用程序,但直到现在我都会失去我所有的用户、我的统计数据和评论。你知道为什么我的应用程序无法使用 RSA 密钥安装计费系统吗?还有哪些其他原因可能导致这种情况?
onCreate 会发生什么:
mHelper = new IabHelper(this, base64EncodedPublicKey);
// enable debug logging (for a production application, you should set this to false).
mHelper.enableDebugLogging(false);
// Start setup. This is asynchronous and the specified listener
// will be called once setup completes.
Log.d(TAG, "Starting setup.");
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "Setup finished.");
if (!result.isSuccess()) {
// Oh noes, there was a problem.
complain("Problem setting up in-app billing: " + result);
return;
}
// Hooray, IAB is fully set up. Now, let's get an inventory of stuff we own.
Log.d(TAG, "Setup successful. Querying inventory.");
mHelper.queryInventoryAsync(mGotInventoryListener);
}
});
以及第 960 行会发生什么:
public IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
Log.d(TAG, "Query inventory finished .");
if (result.isFailure()) {
complain("Failed to query inventory: " + result);
return;
}
Log.d(TAG, "Query inventory was successful.");
// Purchase premium monthly
Purchase purchase = inventory.getPurchase(Constants.PREMIUM);
if(purchase.getPurchaseState() == Purchase.PURCHASED_SUCCESSFULLY && verifyDeveloperPayload(purchase)){
isPremium = true;
}else{
isPremium = false;
updatePremium(purchase.getPurchaseState());
}
Log.d(TAG, "User " + (isPremium ? "HAS" : "DOES NOT HAVE") + " premium surebets for 32 days.");
Log.d(TAG, "Initial inventory query finished; enabling main UI.");
}
};