我写了一个应用内购买测试应用,以了解如何在我已经制作的应用程序中实现它。 我修改了谷歌提供的TrivialDrive示例中的代码。 但它不起作用,在我的朋友付款后应用程序崩溃。 代码看起来像这样
public class MainActivity extends Activity {
String TAG = "AppPurchaseTest";
IabHelper mHelper;
boolean mIsPremium = false;
static final String SKU_PREMIUM = "premium";
static final int RC_REQUEST = 10001;
// User clicked the "Upgrade to Premium" button.
public void onUpgradeAppButtonClicked(View arg0) {
Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
// setWaitScreen(true);
mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST, mPurchaseFinishedListener);
}
//this is not working
// Callback for when a purchase is finished
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
int duration = Toast.LENGTH_SHORT;
if (result.isFailure()) {
// Oh noes!
// complain("Error purchasing: " + result);
// setWaitScreen(false);
Toast.makeText(getBaseContext(), "Fail :(", duration).show();
return;
}
Log.d(TAG, "Purchase successful.");
if (purchase.getSku().equals(SKU_PREMIUM)) {
// bought the premium upgrade!
Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
// alert("Thank you for upgrading to premium!");
mIsPremium = true;
Toast.makeText(getBaseContext(), "Successo: adesso sei premium", duration).show();
Button test = (Button) findViewById(R.id.test);
test.setVisibility(View.INVISIBLE);
// updateUi();
// setWaitScreen(false);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String base64EncodedPublicKey = null;
// compute your public key and store it in base64EncodedPublicKey
mHelper = new IabHelper(this, base64EncodedPublicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
// Oh noes, there was a problem.
Log.d(TAG, "Problem setting up In-app Billing: " + result);
}
// Hooray, IAB is fully set up!
}
});
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if (mHelper != null) {
Log.d(TAG, "mHelper doesn't = null ");
mHelper.dispose();
mHelper = null;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
}
else {
Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
你能发现错误吗?我忘了什么?
此教程https://developer.android.com/google/play/billing/billing_integrate.html 看起来更简单,但我不明白如何实现它,是否有一个样本或东西,我可以看到它是如何实现的?我只需要简单升级到高级购买
很难让它工作,因为我不能亲自测试它,每次我测试它我都会亏钱:(
答案 0 :(得分:1)
花了很长时间才弄清楚我的项目,但你必须明白你的mPurchaseFinishedListener是在非渲染线程上调用的,而且你的应用程序onResume()被调用之前(只需检查IabHelper代码。
因此,如果您尝试进行任何渲染,那么它会崩溃,因为渲染上下文尚未恢复。
在你的情况下,很可能是:
Toast.makeText(getBaseContext(), "Successo: adesso sei premium", duration).show();
将崩溃,同样适用于
Button test = (Button) findViewById(R.id.test);
如果检查琐事示例,textButton可见性设置为true,但按钮本身是在onCreate()方法中指定的类属性。
如果这有帮助,请告诉我。
答案 1 :(得分:0)
每个TrivialDrive您还需要(它将解决此问题):
// We're being destroyed. It's important to dispose of the helper here!
@Override
public void onDestroy() {
super.onDestroy();
// very important:
if (mBroadcastReceiver != null) {
unregisterReceiver(mBroadcastReceiver);
}
// very important:
Log.d(TAG, "Destroying helper.");
if (mHelper != null) {
mHelper.disposeWhenFinished();
mHelper = null;
}
}