2013-01-11 97 views
2

我剛剛在市場上推出了一款應用程序,該應用程序使用應用程序內購買,該應用程序內購買是從我幾乎不瞭解的其他人的示例代碼拼湊而成的。代碼似乎在大多數情況下都能正常工作,但我每次都有一臺設備在其上崩潰。這似乎有些「生成的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' 

我不知道在哪裏可以從這裏走,因爲我爲正在發生的事情完全糊塗了。我對這個代碼甚至被「生成」的方式或原因感到困惑......據推測,即使我在這裏看到了一個bug,我仍然無法編輯它!此代碼是Android操作系統的一部分嗎?也許真正的錯誤是在傳遞的束中?..所有提示都歡迎。

+0

我不太熟悉應用程序購買。但希望你已經閱讀了[readException()']的文檔(http://developer.android.com/reference/android/os/Parcel.html#readException())。 –

+1

BillingHelper的第64行是什麼?和sendBillingRequest'附近捕獲什麼catch – Blundell

+0

你可以從Logcat trace中看到BillingHelper的第64行是'Bundle response = mService.sendBillingRequest(request)'。我的猜測是,它捕獲'android.os.RemoteException',正如'sendBillingRequest'拋出的一樣 –

回答

2

看起來好像android.os.Parcel.obtain()命令返回null,這會導致上的NPE。

會發生什麼,如果你嘗試:

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

編輯

看到,因爲沒有工作,我有一個小挖過來,發現這個線程: http://code.google.com/p/marketbilling/issues/detail?id=25 這似乎建議這是一個答案:

這發生在設備未接受許可協議並嘗試調用此行我遇到這個問題時,我的客戶剛剛購買了一個新的設備,並嘗試運行我的應用程序,使用inApp,所以他沒有在他的設備中打開市場應用程序,因此從未接受協議,一旦你接受它不會出現這個錯誤

+0

使用調試器進行調試,發現_reply不爲null。但是我不能編輯這段代碼,因爲它是自動生成的(我不知道如何)。我在問題中包含的代碼只是暫時重新格式化,並添加了評論。 – Mick

+0

啊,對。對不起,它沒有點擊你說它是一個gen文件 –

+0

嗯...所以這看起來像是對發生了什麼事情的解釋,但它仍然不是很令人滿意的程序崩潰:-( – Mick