在我的测试应用程序中,用户点击一个购买按钮,然后购买一个物品。当购买完成时,一个textview会显示为“购买完成”。都很好。:)。然而,当我杀死应用程序,并再次打开它,购买按钮再次出现....:/。为什么会发生这种情况?谷歌对此不是很清楚。下面是代码。
public class MainActivity extends Activity {
IInAppBillingService mService;
ServiceConnection connection;
String inappid = "victory.walkto.testingpaymentsd.productid"; //replace this with your in-app product id
Button purchaseBtn;
Button clickBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
// first this
connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IInAppBillingService.Stub.asInterface(service);
}
};
// then this
bindService(serviceIntent,connection, Context.BIND_AUTO_CREATE);
purchaseBtn = (Button) findViewById(R.id.purchase);
clickBtn = (Button) findViewById(R.id.clickButton);
clickBtn.setVisibility(View.GONE);
purchaseBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList skuList = new ArrayList();
skuList.add(inappid);
Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
Bundle skuDetails;
try {
Bundle ownedItems = mService.getPurchases(3,
getPackageName(), "inapp", null);
// Check response
int responseCode =
ownedItems.getInt("RESPONSE_CODE");
if (responseCode != 0) {
throw new Exception("Error");
}
// Get the list of purchased items
ArrayList<String> purchaseDataList =
ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
for (String purchaseData : purchaseDataList) {
JSONObject o = new JSONObject(purchaseData);
String purchaseToken = o.optString("token", o.optString("purchaseToken"));
// Consume purchaseToken, handling any errors
mService.consumePurchase(3, getPackageName(), purchaseToken);
}
skuDetails = mService.getSkuDetails(3, getPackageName(),
"inapp", querySkus);
int response = skuDetails.getInt("RESPONSE_CODE");
if (response == 0) {
ArrayList<String> responseList = skuDetails
.getStringArrayList("DETAILS_LIST");
for (String thisResponse : responseList) {
JSONObject object = new JSONObject(thisResponse);
String sku = object.getString("productId");
String price = object.getString("price");
if (sku.equals(inappid)) {
System.out.println("price " + price);
Bundle buyIntentBundle = mService
.getBuyIntent(3, getPackageName(), sku,
"inapp",
"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
PendingIntent pendingIntent = buyIntentBundle
.getParcelable("BUY_INTENT");
startIntentSenderForResult(
pendingIntent.getIntentSender(), 1001,
new Intent(), Integer.valueOf(0),
Integer.valueOf(0), Integer.valueOf(0));
purchaseBtn.setVisibility(View.GONE);
clickBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"I am clicked",Toast.LENGTH_SHORT).show();
}
});
}
}
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IntentSender.SendIntentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1001) {
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
if (resultCode == RESULT_OK) {
clickBtn.setVisibility(View.VISIBLE);
try {
JSONObject jo = new JSONObject(purchaseData);
String sku = jo.getString(inappid);
Toast.makeText(
MainActivity.this,
"You have bought the " + sku
+ ". Excellent choice,adventurer!",
Toast.LENGTH_LONG).show();
} catch (JSONException e) {
System.out.println("Failed to parse purchase data.");
e.printStackTrace();
}
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (connection != null) {
unbindService(connection);
}
}
}
固定
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = settings.edit();
editor.putString("productId", sku);
editor.putString("purchaseToken", purchaseToken);
editor.putString("orderId", orderId);
editor.commit();
SharedPreferences spreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
productId = spreferences.getString("productId", "");
purchaseToken = spreferences.getString("purchaseToken", "");
orderId = spreferences.getString("orderId", "");
最后使用if条件使视图可见或不可见
if(orderId.isEmpty()) {
entryFee.setVisibility(View.VISIBLE);
paymentButton.setVisibility(View.VISIBLE);
paymentText.setVisibility(View.VISIBLE);
teamTextField.setVisibility(View.GONE);
btn.setVisibility(View.GONE);
paymentButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList skuList = new ArrayList();
skuList.add(inappid);
querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
checkPayment();
}
});
}else{
entryFee.setVisibility(View.GONE);
paymentButton.setVisibility(View.GONE);
paymentText.setVisibility(View.GONE);
teamTextField.setVisibility(View.VISIBLE);
btn.setVisibility(View.VISIBLE);
}
解决方案并不难,但我必须大量阅读文档,使用调试器点,就是这样:)。
当你杀死你的应用程序时,它会再次运行,从头开始设置。您需要检查是否适合在onCreate中显示您的按钮,或者使用payment Api进行检查(如果可能的话),或者将您的状态存储在本地的SharedPreference中并进行检查。
那么在应用计费v3 API中如何处理退款呢?我假设对于一个非消耗品,退款被处理,然后google通过他们的后端处理这个处理,然后当getPurchaseState()被执行时,它将返回值2(退款)。如果是这样的话,这对于一个非消耗性产品来说是非常有效的。 当对可消费购买进行getPurchaseState()调用时,它返回null。这是假设购买之前是成功的,并且该项目被消费和供应。我想我可以在应用
为了测试Android应用内计费v3,我实现了一个对话框,其中添加了一个选项适配器。我添加了测试SKU,“Android.测试.购买”,“Android.测试.取消”,“Android.测试.退款”,“Android.测试.项目不可用”。 当我使用该对话框启动购买流时,一切正常,我能够购买该商品,并且该商品是绝对购买的。然而,当我的应用程序尝试刷新UI时,我会收到一个nullpointerexce
启动购买流后,onActivityResult方法需要什么? 来自平凡的驱动器示例: msgstr"在这里,您可以对与应用内计费无关的活动结果执行任何处理" 这是否意味着您需要更新用户的清单或显示警报框?如果是这样,我已经在OnConsumeFinishedListener中这样做了。我已经测试了我的代码,留下了上面的onActivityResult方法,看起来没问题。这可能会导致任何问题吗? 或
我正在学习应用内计费,但我有一个问题,谷歌的应用内计费的例子,地下城的一个。 我已经设置了应用程序,添加了我的公钥,并将makeRequestBundle()中的API_VERSION更改为1。 我甚至尝试了一个不同的设备,以确保这不是因为开发者不能购买他们自己的产品,我得到了相同的信息在两个设备上。 我错过了什么?
也许我做错了什么,但如果是这样的话,我就想不出来了。我正在尝试购买一种产品,无论出于何种原因,购买过程都不正常。当我点击购买一件物品时,它会给我账单流程。然后在付款后,我必须再次点击它才能收到我购买的芯片。任何帮助都会很棒,谢谢!如果你不熟悉这个工具,这里有一个链接https://github.com/anjlab/android-inapp-billing-v3如果你需要更多细节,请告诉我。