My in-app billing code was working fine until I upgraded to the Android L Dev Preview. Now I get this error when my app starts. Does anyone know what's changed about L that causes this or how I should change my code to fix this?
android {
compileSdkVersion 'android-L'
buildToolsVersion '20'
defaultConfig {
minSdkVersion 13
targetSdkVersion 'L'
...
...
compile 'com.google.android.gms:play-services:5.+'
compile 'com.android.support:support-v13:21.+'
compile 'com.android.support:appcompat-v7:21.+'
...
...
The error when the app starts:
06-29 16:22:33.281 5719-5719/com.tbse.wnswfree D/AndroidRuntime﹕ Shutting down VM
06-29 16:22:33.284 5719-5719/com.tbse.wnswfree E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.tbse.wnswfree, PID: 5719
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tbse.wnswfree/com.tbse.wnswfree.InfoPanel}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.billing.InAppBillingService.BIND }
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
at android.app.ActivityThread.access$800(ActivityThread.java:143)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5070)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.billing.InAppBillingService.BIND }
at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1603)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1702)
at android.app.ContextImpl.bindService(ContextImpl.java:1680)
at android.content.ContextWrapper.bindService(ContextWrapper.java:528)
at com.tbse.wnswfree.util.IabHelper.startSetup(IabHelper.java:262)
at com.tbse.wnswfree.InfoPanel.onStart(InfoPanel.java:709)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1217)
at android.app.Activity.performStart( Activity.java:5736)
at android.app.ActivityThread.performLaunchActivity( ActivityThread.java:2218)
at android.app.ActivityThread.handleLaunchActivity( ActivityThread.java:2317)
at android.app.ActivityThread.access$800( ActivityThread.java:143)
at android.app.ActivityThread$H.handleMessage( ActivityThread.java:1258)
...
Line 709 in InfoPanel.java:
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
...
For me it worked to use the current IabHelper from the samples: sdk/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/util/IabHelper.java
Don't forget to run the sdk update manager first to make sure that you have the current version installed.
In "L" binding to a service requires using an explicit intent.
See http://commonsware.com/blog/2014/06/29/dealing-deprecations-bindservice.html
I was getting the same error from older Google Cloud Messaging setup code. The simplest fix appears to be changing
into
This worked for me but I'd like to know of it's an acceptable way to do this:
i.setClass(context, MyService.class);
I had the same problem and explicitly setting the package solved it. Similar to Aleksey's answer, but simpler:
Just replace the code
with the following code
in the class
IabHelper
which you have placed in the inappbilling's utils folder (if you have followed the instruction of Google InApp Billing tutorial).