我正在为某个应用程序进行Google应用内购买。我创建了一个ID为“ app.test.item”的被管理产品项目。我遵循了Google文档中指定的所有其他步骤。首次购买的应用程序运行正常。但是,当我尝试取消安装应用程序并再次安装时。该应用程序运行还原交易请求。在我根据从市场返回的RESULT_OK使购买状态为true的情况下调用onRestoreTransactionsResponse()方法。我的疑问是,应用程序如何知道仅购买了名为“ app.test.item”的项目并因此将其还原。我也有其他一些项目,例如“ app.test.second.item”。应用内结算如何看清两者之间的区别。我已经使用了Google提供的应用内结算代码。刚刚提到了一些用于存储购买状态的共享首选项。我在这里做错什么吗?请指导我。
我也想在调试模式下测试此应用程序,以便可以跟踪工作流程。但是,应使用发布版本对应用程序进行签名。有什么办法可以在调试版本中完全运行此应用程序(以测试还原事务)。我了解了使用保留的productId作为“ android.test.purchased”进行常规购买的常规工作流程。但是我需要测试restoreTransactions()。任何帮助表示赞赏。
我将在此处发布PurchaseObserver示例代码。
谢谢,
private class DungeonsPurchaseObserver extends PurchaseObserver {
public DungeonsPurchaseObserver(Handler handler) {
super(Dungeons.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 (developerPayload == null) {
logProductActivity(itemId, purchaseState.toString());
} else {
logProductActivity(itemId, purchaseState + "\n\t" + developerPayload);
}
if (purchaseState == PurchaseState.PURCHASED) {
mOwnedItems.add(itemId);
logProductActivity("APPLICATION", ": STATE PURCHASED");
SharedPreferences pref = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString(PURCHASE_STATUS, "ITEM PURCHASED");
editor.commit();
}
if(purchaseState == PurchaseState.CANCELED)
{
logProductActivity("APPLICATION", ": STATE CANCELLED");
SharedPreferences pref = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString(PURCHASE_STATUS, "ITEM CANCELLED");
editor.commit();
}
if(purchaseState == PurchaseState.REFUNDED)
{
logProductActivity("APPLICATION", ": STATE REFUNDED");
SharedPreferences pref = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString(PURCHASE_STATUS, "ITEM REFUNDED");
editor.commit();
}
}
@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");
}
logProductActivity(request.mProductId, "sending purchase request");
} else if (responseCode == ResponseCode.RESULT_USER_CANCELED) {
if (Consts.DEBUG) {
Log.i(TAG, "user canceled purchase");
}
logProductActivity(request.mProductId, "dismissed purchase dialog");
} else {
if (Consts.DEBUG) {
Log.i(TAG, "purchase failed");
}
logProductActivity(request.mProductId, "request purchase returned " + responseCode);
}
}
@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 = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean(DB_INITIALIZED, true);
edit.putString(PURCHASE_STATUS, "ITEM PURCHASE RESTORED");
edit.commit();
logProductActivity("onRestoreTransactionsResponse() method in PurchaseObserver", "ITEM PURCHASE RESTORED");
} else {
if (Consts.DEBUG) {
Log.d(TAG, "RestoreTransactions error: " + responseCode);
}
}
logProductActivity("onRestoreTransactionsResponse() method in PurchaseObserver", responseCode.toString());
}
}
最佳答案
调试被管理产品可能很困难,因为除非使用发布密钥对应用进行签名,否则您将无法使用它们。因此,在测试IAB时,我用发布密钥对调试版本进行签名。
对于多种产品,您需要检查商品编号。每个产品都会调用onPurchaseStateChange
。
例如
public void onPurchaseStateChange(PurchaseState purchaseState, String itemId, int quantity, long purchaseTime, String developerPayload) {
if (itemId.equals("app.test.item") {
switch (purchaseState) {
case PURCHASED:
Log.i("Billing","Purchased app.test.item");
break;
default:
Log.i("Billing","Something else");
break;
}
}
关于android - Google应用内结算:restoreTransactions()行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10547077/