android - 与应用内购买相关的崩溃

标签 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 操作系统的一部分吗?也许真正的错误在传递的包中?...欢迎所有提示。

最佳答案

看起来 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 这似乎表明这是一个答案:

This happens when the device has not accepted the License Agreement and try to call this line I encountered this problem when my client just bought a new device and try run my app which make use of inApp so he didnt ever opened market app in his device and so had never accepted the Agreement once you accept the it this error will not be there

关于android - 与应用内购买相关的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14276783/

相关文章:

android - 使用 TabLayout 时如何禁用选择某些选项卡?

android - 如何将onClick,onLongClick和onTouch实现到一个 View

objective-c - 应用内购买的奇怪行为

ios - 应用内购买不起作用

iphone - 在 iphone 的应用程序购买中对不可续订订阅类型的新拒绝感到沮丧吗?

Android 第三方 GUI 小部件供应商

android - 事件未显示在 firebase 上

c# - Xamarin 无法调试 (Android)

Android In-App Billing v3 在各种设备上的可用性

ios - 在 iOS 应用程序中销售实体产品