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

时间:2013-02-09 04:43:37

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

我已经在我的应用程序中实现了应用程序购买我已经使用“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);
    }
    }
}
};

我在成功购买时设置了消息,但是当我成功购买时,我无法看到此消息(意味着这些消息未执行),应用程序在成功付款后崩溃。

重新启动应用并尝试购买已经购买过的商品。

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

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

它在静态响应方面表现非常好,但在我从市场购买时会崩溃。

5 个答案:

答案 0 :(得分:1)

我通过使我的IabHelper成员变量(mHelper)静态

来解决这个问题

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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();
}

它工作正常。 我希望它会对某人有所帮助。

答案 3 :(得分: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

如果这仍然与您相关,您应该检查您的"抱怨()"方法

答案 4 :(得分:0)

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