我是Android开发人员,但我刚刚进入应用内购买。我浏览了Google教程并获得了测试版本。但是,当我尝试实现购买的自定义项目时,它总是在OnIabPurchaseFinishedListener中失败。我现在想要的只是为不同级别的捐款添加3个按钮(1美元,5美元,10美元)。我已经在我的开发者控制台上创建了其中一个项目。
总是在这里失败:
if (result.isFailure()) {
Log.d("Money", "Error purchasing: " + result);
return;
}
这是我的代码:
package widowmaker110.productions.greenlink.pages;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import widowmaker110.productions.greenlink.R;
import widowmaker110.productions.greenlink.util.IabHelper;
import widowmaker110.productions.greenlink.util.IabResult;
import widowmaker110.productions.greenlink.util.Inventory;
import widowmaker110.productions.greenlink.util.Purchase;
/**
* Created by Alexander on 3/26/2015.
*/
public class MoneyActivity extends Activity{
//http://www.techotopia.com/index.php/An_Android_Studio_Google_Play_In-app_Billing_Tutorial
IabHelper mHelper;
// google's built in testing item
//static final String ITEM_SKU = "android.test.purchased";
private Button clickButton;
private Button buyButton;
static final String ITEM_SKU = "com.example.buttonclick";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_in_app_billing);
buyButton = (Button)findViewById(R.id.buyButton);
clickButton = (Button)findViewById(R.id.clickButton);
clickButton.setEnabled(false);
buyButton.setEnabled(false);
String base64EncodedPublicKey = "my_key";
buyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mHelper.launchPurchaseFlow(MoneyActivity.this, ITEM_SKU, 10001, mPurchaseFinishedListener, "");
clickButton.setEnabled(false);
buyButton.setEnabled(true);
}
});
mHelper = new IabHelper(this, base64EncodedPublicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
Log.d("inappbilling", "In-app Billing setup failed: " + result);
Toast.makeText(MoneyActivity.this, "In-app purchasing set up failed", Toast.LENGTH_LONG).show();
} else {
buyButton.setEnabled(true);
Log.d("inappbilling", "In-app Billing is set up OK");
}
mHelper.queryInventoryAsync(mGotInventoryListener);
}
});
}
boolean verifyDeveloperPayload(Purchase p) {
String payload = p.getDeveloperPayload();
return true;
}
// Listener that's called when we finish querying the items and
// subscriptions we own
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result,
Inventory inventory) {
Log.d("", "Query inventory finished.");
if (result.isFailure()) {
Log.d("Money","Failed to query inventory: " + result);
return;
}
Log.d("Money", "Query inventory was successful.");
/*
* Check for items we own. Notice that for each purchase, we check
* the developer payload to see if it's correct! See
* verifyDeveloperPayload().
*/
// // Check for gas delivery -- if we own gas, we should fill up the
// tank immediately
Purchase gasPurchase = inventory.getPurchase(ITEM_SKU);
if (gasPurchase != null && verifyDeveloperPayload(gasPurchase)) {
Log.d("Money", "We have gas. Consuming it.");
mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
mConsumeFinishedListener);
return;
}
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (mHelper == null) return;
if (!mHelper.handleActivityResult(requestCode, resultCode, data))
{
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
protected void onStart() {
super.onStart();
}
// Callback for when a purchase is finished
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.d("Money", "Purchase finished: " + result + ", purchase: "
+ purchase);
if (result.isFailure()) {
Log.d("Money", "Error purchasing: " + result);
return;
}
if (!verifyDeveloperPayload(purchase)) {
Log.d("Money","Error purchasing. Authenticity verification failed.");
return;
}
Log.d("Money", "Purchase successful.");
if (purchase.getSku().equals(ITEM_SKU)) {
// remove query inventory method from here and put consumeAsync() directly
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
}
}
};
public void consumeItem() {
mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result,Inventory inventory) {
if (result.isFailure())
{
// Handle failure
Toast.makeText(MoneyActivity.this, "mReceivedInventoryListener failed", Toast.LENGTH_LONG).show();
}
else
{
mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU), mConsumeFinishedListener);
Toast.makeText(MoneyActivity.this, "mReceivedInventoryListener worked", Toast.LENGTH_LONG).show();
}
}
};
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase, IabResult result) {
if (result.isSuccess())
{
clickButton.setEnabled(true);
Toast.makeText(MoneyActivity.this, "purchasing button worked", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(MoneyActivity.this, "Error 20: purchase failed.", Toast.LENGTH_LONG).show();
}
}
};
@Override
public void onDestroy() {
super.onDestroy();
if (mHelper != null) mHelper.dispose();
mHelper = null;
}
}