与应用内购买相关的崩溃

时间:2013-01-11 11:03:01

标签: android in-app-purchase

我有一个刚刚在市场上推出的应用程序,该应用程序采用应用内购买,这些应用程序是从其他人的示例代码中拼凑而成的,我几乎无法理解。代码似乎确实在大多数时间都有效,但我每次都有一台设备崩溃。它似乎在gen目录中的一些“生成的java文件”中崩溃,我跟踪崩溃之前的最后几个步骤,如下所示:

protected static boolean isBillingSupported()
{
    if (amIDead())
    {
        return false;
    }
    Bundle request = makeRequestBundle("CHECK_BILLING_SUPPORTED");

    if (mService != null && request != null)
    {
        try
        {
            Bundle response = mService.sendBillingRequest(request);

然后我进入这个方法并执行以下行...(见注释)

public android.os.Bundle sendBillingRequest(android.os.Bundle bundle) throws android.os.RemoteException
{
    android.os.Parcel _data = android.os.Parcel.obtain();
    android.os.Parcel _reply = android.os.Parcel.obtain();
    android.os.Bundle _result;
    try 
    {
        _data.writeInterfaceToken(DESCRIPTOR); // DESCRIPTOR was "com.android.vending.billing.IMarketBillingService"
        if ((bundle!=null))
        {
            _data.writeInt(1); // GOT HERE OK
            bundle.writeToParcel(_data, 0);
        }
        else 
        {
            _data.writeInt(0);
        }
        mRemote.transact(Stub.TRANSACTION_sendBillingRequest, _data, _reply, 0); // GOT HERE OK
        _reply.readException(); // GOT HERE OK  ... BUT THEN JUMPS TO XXXX
        if ((0!=_reply.readInt())) // WE NEVER REACH THIS LINE!
        {
            _result = android.os.Bundle.CREATOR.createFromParcel(_reply);
        }
        else
        {
            _result = null;
        }
    }
    finally // XXXX
    {
        _reply.recycle(); // THIS GETS EXECUTED
        _data.recycle(); // THIS GETS EXECUTED
    }
    return _result; // WE REACH HERE, BUT THAT'S THE LAST LINE I SEE BEFORE THE EXCEPTION APPEARS IN THE LOG OUTPUT
}

日志文件显示以下内容:

01-10 22:54:00.730: W/dalvikvm(1292): threadid=1: thread exiting with uncaught exception (group=0x401cb760)
01-10 22:54:00.740: E/AndroidRuntime(1292): FATAL EXCEPTION: main
01-10 22:54:00.740: E/AndroidRuntime(1292): java.lang.NullPointerException
01-10 22:54:00.740: E/AndroidRuntime(1292):     at android.os.Parcel.readException(Parcel.java:1327)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at android.os.Parcel.readException(Parcel.java:1275)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at com.android.vending.billing.IMarketBillingService$Stub$Proxy.sendBillingRequest(IMarketBillingService.java:100)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at com.mycompany.mygame.BillingHelper.isBillingSupported(BillingHelper.java:64)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at com.mycompany.mygame.Shop.onClick(Shop.java:174)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at android.view.View.performClick(View.java:3122)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at android.view.View$PerformClick.run(View.java:11942)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at android.os.Handler.handleCallback(Handler.java:587)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at android.os.Looper.loop(Looper.java:132)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at android.app.ActivityThread.main(ActivityThread.java:4028)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at java.lang.reflect.Method.invokeNative(Native Method)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at java.lang.reflect.Method.invoke(Method.java:491)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
01-10 22:54:00.740: E/AndroidRuntime(1292):     at dalvik.system.NativeStart.main(Native Method)
01-10 22:54:02.770: I/dalvikvm(1292): threadid=4: reacting to signal 3
01-10 22:54:02.770: I/dalvikvm(1292): Wrote stack traces to '/data/anr/traces.txt'

我不知道从哪里开始,因为我对发生了什么完全感到困惑。我很困惑这个代码甚至可以“生成”的方式或原因......大概即使我在这里看到一个错误,我也无法编辑它!此代码是Android操作系统的一部分吗?也许真正的错误是在传递的包内?所有提示都欢迎。

1 个答案:

答案 0 :(得分:2)

看起来android.os.Parcel.obtain()命令返回null,这将导致_reply.readException()上的NPE。

如果你尝试会发生什么:

if ((_reply!=null)) {
    _reply.readException();
} else {
    Log.d(TAG, "_reply is null");
}

修改

看到这不起作用,我有一点挖掘,发现这个线程: http://code.google.com/p/marketbilling/issues/detail?id=25 这似乎表明这是一个答案:

  

当设备未接受许可协议并尝试拨打此线路时,当我的客户刚刚购买新设备并尝试运行使用inApp的应用程序时遇到此问题,这种情况就会发生这种情况,因此他没有打开市场应用程序他的设备一旦你接受它就没有接受该协议,这个错误将不存在