【问题标题】:Android in-app purchase crashing after payment付款后Android应用内购买崩溃
【发布时间】:2013-02-09 04:43:37
【问题描述】:

我已经在我的应用程序中实现了应用程序购买我已经使用“TrivialDrive”示例进行第 3 版的应用程序内计费,我已经使用静态响应测试了应用程序,所有工作都按预期工作。

但是当我从市场下载应用程序时,应用程序在成功购买时崩溃,

我的代码购买成功

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);
    }
    }
}
};

我已设置成功购买消息,但我看不到此消息,(意味着那些 linse 未执行)当我成功购买时,成功付款后应用程序崩溃。

当重新启动应用并尝试购买商品时,它显示已购买。

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

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,这个错误是用户在尝试购买应用程序时报告的,而且我们的开发人员在尝试从市场购买时也遇到了同样的错误,他们有最新版本的谷歌玩。此外,我们在测试时无法产生相同的感觉。

标签: android in-app-purchase google-play in-app-billing


【解决方案1】:

我通过简单地将我的 IabHelper 成员变量 (mHelper) 设为静态来解决此问题

【讨论】:

    【解决方案2】:

    我面临着完全相同的问题。然后,我意识到整个活动有时会在购买过程中重新创建(无缘无故)。我没有单独测试 Trivia 示例以检查它是否也发生在该应用程序中,但我希望它发生,因为它似乎与计费过程有关(或与我在自己的应用程序中使用的该示例的辅助方法有关也)。

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

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

    【讨论】:

    • 是的,我知道这听起来很奇怪,但它确实有效,而且它绝对是问题的根源。我很确定问题与 Trivia 示例的库有关,而不是与应用内计费本身有关,因此您在原始问题中的评论“我认为应用内 v3 还不稳定”没有任何意义。我希望提出问题的人 @Mac 发布他是否将 mHelper 实例的创建移出 onCreate 方法,就像我最初所做的那样......
    • 好的,是的,有一些错误,不应该重新创建活动。显然我已经为应用内 v3(意味着应用内 v3 库)发表了评论,而不是整个应用内谷歌的购买功能。
    【解决方案3】:

    我遇到了同样的问题。 我发现当显示应用内购买框时,在我的应用程序活动中执行 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();
    }
    

    而且效果很好。 我希望它会对某人有所帮助。

    【讨论】:

      【解决方案4】:

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

      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()”方法。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-26
          • 1970-01-01
          • 2012-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-30
          相关资源
          最近更新 更多