Android应用内购买在付款后崩溃

6

我在我的应用中实现了应用内购买。我使用了in-app billing版本3的"TrivialDrive"示例,并使用静态响应测试应用程序,一切都按预期工作。

但是当我从市场下载应用程序并成功购买后,应用程序会崩溃。

我的代码是处理成功购买的。

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {

    Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
    if (result.isFailure()) {
    complain("Error purchasing: " + result);
    }

    if (purchase != null) {
    if (purchase.getSku().equals(Constants.IN_APP_PURCHASE_PRODUCT_ID)) {
        // bought the premium upgrade!
        String message = getResources().getString(R.string.app_purchase_successful_msg);
        mIsPremium = true;
        updateUi(mIsPremium);
        successAlert(message);
    }
    }
}
};

我已经设置了成功购买的消息,但是当我成功购买后,我看不到这个消息(也就是说那些代码没有执行),应用程序在成功付款后崩溃。

当重新启动应用程序并尝试购买商品时,它会显示已经购买过了。

我从开发者控制台得到了崩溃报告。

02-09 02:01:13.181: E/AndroidRuntime(11530): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=10001, result=-1, data=Intent { (has extras) }} to activity {com.eknathkadam.grammaruplite/com.webrich.base.ui.GoogleInAppPurchaseActivity}: java.lang.NullPointerException
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3141)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.access$1100(ActivityThread.java:130)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.os.Looper.loop(Looper.java:137)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.main(ActivityThread.java:4745)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at java.lang.reflect.Method.invokeNative(Native Method)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at java.lang.reflect.Method.invoke(Method.java:511)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at dalvik.system.NativeStart.main(Native Method)
**02-09 02:01:13.181: E/AndroidRuntime(11530): Caused by: java.lang.NullPointerException
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.google.billing.Base64.decode(Base64.java:434)**
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.google.billing.Security.generatePublicKey(Security.java:87)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.google.billing.Security.verifyPurchase(Security.java:66)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.google.billing.IabHelper.handleActivityResult(IabHelper.java:437)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at com.webrich.base.ui.GoogleInAppPurchaseActivity.onActivityResult(GoogleInAppPurchaseActivity.java:238)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.Activity.dispatchActivityResult(Activity.java:5192)
02-09 02:01:13.181: E/AndroidRuntime(11530):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
02-09 02:01:13.181: E/AndroidRuntime(11530):    ... 11 more
02-09 02:02:20.610: E/JavaBinder(250): !!! FAILED BINDER TRANSACTION !!!
02-09 02:02:20.638: E/MountService(250): Listener dead
02-09 02:02:20.638: E/MountService(250): Listener dead
02-09 02:02:22.028: E/InputDispatcher(250): channel '41f313f0 com.android.vending/com.android.vending.AssetBrowserActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
02-09 02:03:59.884: E/PowerManagerService(250): Excessive delay setting brightness: 198ms, mask=2 

在这行代码中,onActivityResult()方法抛出了空指针异常。

if (!mHelper.handleActivityResult(requestCode, resultCode, data))

方法就是这样。
 @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.");
}
}

这段代码在静态响应时运行良好,但在从市场购买时崩溃。


我们没有测试APK,这个漏洞是由用户报告的,当他试图购买应用程序时发现的。同时,我们的开发人员在尝试从市场购买时也遇到了同样的漏洞,他们拥有最新版本的Google Play。而且我们在测试时无法产生相同的情况。 - Mac
5个回答

1

我通过将我的IabHelper成员变量(mHelper)设置为静态来解决了这个问题。


0

我遇到了同样的问题。 我发现当应用内购买框显示时,我的应用活动会执行onPause方法,当框关闭时,则会执行onResume方法。 以下是这些方法的代码:

@Override
public void onPause()
{
   mWakeLock.release();
   super.onPause();
}

@Override
public void onResume()
{
   super.onResume();
   mWakeLock.acquire();
}

最后我删除了执行mWaveLock的行。

@Override
public void onPause()
{
   super.onPause();
}

@Override
public void onResume()
{
   super.onResume();
}

它运行良好。 我希望它能帮助到某些人。


0

我知道这个帖子很旧了,但我可能遇到了同样的问题。 你的方法是什么?

complain("Error purchasing: " + result);

做什么?

我打了电话。

Toast.makeText(getParent(), "Premium purchased successfully", Toast.LENGTH_LONG)
                    .show();

在完全相同的位置,这给我带来了以下错误:
06-26 14:02:54.229: E/AndroidRuntime(25681): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=10001, result=0, data=Intent { (has extras) }} to activity {sf.com.flightBook/sf.com.flightBook.ui.configuration.ConfigurationMain}: java.lang.NullPointerException

如果这对您仍然有意义,您应该检查您的“complain()”方法。

0

我曾经遇到过完全相同的问题。后来,我意识到在购买过程中整个活动有时会被重新创建(没有任何原因)。我还没有单独测试Trivia示例以检查它是否也会发生,但我预计会发生,因为它似乎与计费过程(或该示例中使用的辅助方法,我也在自己的应用程序中使用)有关。

我自己代码中计费部分和Trivia示例之间唯一的区别是,我是从某个事件启动的方法中实例化mHelper,而在Trivia示例中则是从onCreate中实例化的。所以我做了这个改变(现在我从onCreate中创建mHelper的新实例),然后一切都开始正常工作了。问题是,当活动被重新创建时,在onCreate中再次实例化mHelper,因此在随后调用onActivityResult时,它不可能为空。

老实说,我不知道为什么会重新创建活动,以及为什么会调用新实例的Activity的onActivityResult方法,但现在一切似乎都正常工作了。


是的,我知道这听起来很奇怪,但它确实有效,并且绝对是问题的根源。我相当确定问题与Trivia示例的库有关,而不是In App Billing本身,因此您在原始问题中的评论“我认为in-app v3还不稳定”没有意义。我希望提出问题的人@Mac能够发布他是否像我一样将mHelper实例的创建移出了onCreate方法... - thelawnmowerman
好的,是的,有一些bug,该活动不应该被重新创建。显然,我是为了in-app v3(即in-app v3库)而做出评论的,而不是针对Google的整个in-app购买功能。 - Mehul Joisar

0

当我遇到这个问题时,我发现我的应用程序中的公钥与 Google Play 为我的应用生成的许可证密钥不对应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接