I'm attempting to make a free app upgradable to the "paid" version using in-app billing. I used code from this tutorial to handle the billing as the one on the official developer site is too complex and messy to follow for a simple flow like mine.
My code to do the upgrade works fine.
The problem comes when I try to add something to check if the user has already purchased but has lost their purchase data either by reinstalling or by clearing the data (I don't care which).
On app startup I check for a flag that's set after the first run. If that flag isn't there, the user is shown a dialog warning them that the app will check for previous purchases, and when they click ok, the restoreTransactionInformation method is called. This then causes the application to force close.
Because in-app billing doesn't work when debugging or on the emulator, I have to publish a signed version of the app each time I want to try the code. I have no way of knowing why the application exits when I try to make the restoreTransactionInformation request. Does anyone have a clue how I can diagnose it, or what might be causing my app to die? Or a working example of how to use the restoreTransactionInformation method?
EDIT: So it looks like the RESTORE_TRANSACTIONS request is getting a correct response, and returning details of my test purchase. Unfortunately before it can do anything with it, the app is forced closed. Here's a logcat (without obfuscated code) of what happens right after market responds to the RESTORE_TRANSACTIONS request:
I/BillingService( 6484): confirmTransaction()
D/Finsky ( 1884): [7] MarketBillingService.getPreferredAccount: com.hippypkg: Account from first account.
I/BillingService( 6484): current request is:**********
I/BillingService( 6484): RESTORE_TRANSACTIONS Sync Response code: RESULT_OK
D/WindowManagerImpl( 6484): finishRemoveViewLocked, mViews[0]: com.android.internal.policy.impl.PhoneWindow$DecorView@**********
W/InputManagerService( 1381): [unbindCurrentClientLocked] Disable input method client.
W/InputManagerService( 1381): [startInputLocked] Enable input method client.
D/NativeCrypto( 1884): returned from sslSelect() with result 1, error code 2
D/Finsky ( 1884): [1] MarketBillingService.sendResponseCode: Sending response RESULT_OK for request ********** to com.hippypkg.
I/BillingService( 6484): Received action: com.android.vending.billing.PURCHASE_STATE_CHANGED
I/BillingService( 6484): purchaseStateChanged got signedData: {"nonce":**********,"orders":[{"orderId":"**********","packageName":"com.hippypkg","productId":"hippy_upgrade_free_to_full","purchaseTime":1331476540000,"purchaseState":0}]}
I/BillingService( 6484): purchaseStateChanged got signature: **********==
I/BillingService( 6484): signedData: {"nonce":**********,"orders":[{"orderId":"**********","packageName":"com.hippypkg","productId":"hippy_upgrade_free_to_full","purchaseTime":1331476540000,"purchaseState":0}]}
I/BillingService( 6484): signature: **********==
I/BillingService( 6484): confirmTransaction()
I/BillingService( 6484): makerequestbundle success
I/BillingService( 6484): putstringarray success
D/Finsky ( 1884): [24] MarketBillingService.getPreferredAccount: com.hippypkg: Account from first account.
D/AndroidRuntime( 6484): Shutting down VM
W/dalvikvm( 6484): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
E/AndroidRuntime( 6484): FATAL EXCEPTION: main
E/AndroidRuntime( 6484): java.lang.RuntimeException: Unable to start receiver com.hippypkg.BillingReceiver: java.lang.NullPointerException
E/AndroidRuntime( 6484): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2144)
E/AndroidRuntime( 6484): at android.app.ActivityThread.access$2400(ActivityThread.java:135)
E/AndroidRuntime( 6484): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1114)
E/AndroidRuntime( 6484): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 6484): at android.os.Looper.loop(Looper.java:150)
E/AndroidRuntime( 6484): at android.app.ActivityThread.main(ActivityThread.java:4385)
E/AndroidRuntime( 6484): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 6484): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 6484): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
E/AndroidRuntime( 6484): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
E/AndroidRuntime( 6484): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 6484): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 6484): at android.os.Parcel.readException(Parcel.java:1328)
E/AndroidRuntime( 6484): at android.os.Parcel.readException(Parcel.java:1276)
E/AndroidRuntime( 6484): at com.android.vending.billing.IMarketBillingService$Stub$Proxy.sendBillingRequest(IMarketBillingService.java:100)
E/AndroidRuntime( 6484): at com.hippypkg.BillingHelper.confirmTransaction(BillingHelper.java:152)
E/AndroidRuntime( 6484): at com.hippypkg.BillingHelper.verifyPurchase(BillingHelper.java:250)
E/AndroidRuntime( 6484): at com.hippypkg.BillingReceiver.purchaseStateChanged(BillingReceiver.java:41)
E/AndroidRuntime( 6484): at com.hippypkg.BillingReceiver.onReceive(BillingReceiver.java:23)
E/AndroidRuntime( 6484): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2103)
E/AndroidRuntime( 6484): ... 10 more
W/ActivityManager( 1381): Force finishing activity com.hippypkg/.Hippy