Google In-App-Abrechnung, IllegalArgumentException: Service Intent muss explizit sein, nach dem Upgrade auf Android L Dev Vorschau

Mein In-App-Abrechnungscode funktionierte gut, bis ich auf die Android L Dev Vorschau aktualisiert habe. Jetzt bekomme ich diesen Fehler, wenn meine App startet. Weiß jemand, was sich über L verändert hat, das das verursacht oder wie ich meinen Code ändern soll, um das zu beheben?

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.+' ... ... 

Der Fehler beim Start der App:

  • Emulator zum Testen von APK
  • Automatisches Versions-Android-Projekt von git beschreiben mit Android Studio / Gradle
  • Warum akzeptiert AlertDialog.Builder (Kontextkontext) nur Aktivität als Parameter?
  • Warum bekomme ich Fehler "Kanal ist unerklärlich gebrochen und wird entsorgt!"
  • View onDraw (Canvas c) versus draw (Canvas c) in android?
  • Zugänglichkeit Fehlende InhalteDescription Attribut auf Bild, wie diese Warnung zu entfernen?
  •  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) ... 

    Zeile 709 in InfoPanel.java:

      mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { @Override public void onIabSetupFinished(IabResult result) { ... 

  • Wie man Toast benutzt, wenn ich das nicht als Kontext verwenden kann
  • Wie man UI in einem BroadcastReceiver aktualisiert
  • Erweiterung einer Klasse, die Parcelable implementiert
  • So implementiere ich Android Pull-to-Refresh
  • Benutzerdefinierte Benachrichtigungslayouts und Textfarben
  • Wie animieren Burger zu Arrow mit Appcompat v7 21, Toolbar und DrawerLayout
  • 9 Solutions collect form web for “Google In-App-Abrechnung, IllegalArgumentException: Service Intent muss explizit sein, nach dem Upgrade auf Android L Dev Vorschau”

    Ich hatte das gleiche Problem und explizit Einstellung der Paket gelöst es. Ähnlich wie bei Alekseys Antwort, aber einfacher:

     Intent intent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); // This is the key line that fixed everything for me intent.setPackage("com.android.vending"); getContext().bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); 

    Wie in der nachstehenden Antwort hervorgehoben, wäre es die Lösung, eine manuelle Absicht zu ermitteln:

     private Intent getExplicitIapIntent() { PackageManager pm = mContext.getPackageManager(); Intent implicitIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); List<ResolveInfo> resolveInfos = pm.queryIntentServices(implicitIntent, 0); // Is somebody else trying to intercept our IAP call? if (resolveInfos == null || resolveInfos.size() != 1) { return null; } ResolveInfo serviceInfo = resolveInfos.get(0); String packageName = serviceInfo.serviceInfo.packageName; String className = serviceInfo.serviceInfo.name; ComponentName component = new ComponentName(packageName, className); Intent iapIntent = new Intent(); iapIntent.setComponent(component); return iapIntent; } 

    Hier ist der Code in L Vorschau Quellen für die Prüfung explizite Absicht. Es ist aktuell kommentiert , aber auf Nexus 5 mit L Vorschau läuft es noch und wirft Ausnahmen für implizite Intents.

    Bearbeiten: @ alav's Antwort ist viel besser und einfacher. Einfach hinzufügen

     intent.setPackage("com.android.vending"); 

    Alle Credits für ihn . Und hier ist der Code in L Release-Quellen für die Prüfung explizite Absicht.

    Gefundene Lösung hier: https://code.google.com/p/android-developer-preview/issues/detail?id=1674

    In der Google Licensing Library (LVL), LizenzChecker.java Datei, ersetzen Sie "bindService" Aufruf mit diesem:

      Intent serviceIntent = new Intent( new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))); serviceIntent.setPackage("com.android.vending"); boolean bindResult = mContext .bindService( serviceIntent, this, // ServiceConnection. Context.BIND_AUTO_CREATE); 

    UND in der AndroidManifest.xml set: android: minSdkVersion = "4"

    Das "setPackage" erfordert Android Version 4.

    In "L" Bindung an einen Dienst erfordert eine explizite Absicht.

    Siehe http://commonsware.com/blog/2014/06/29/dealing-deprecations-bindservice.html

    Ersetzen Sie einfach den Code

     boolean attempt = mContext.bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE); 

    Mit dem folgenden Code

     Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); serviceIntent.setPackage("com.android.vending"); boolean attempt = mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE); 

    In der Klasse IabHelper die du in den Utapp-Ordner des Inappbilling gelegt hast (wenn du die Anweisung des Google InApp Billing Tutorials befolgt hast).

    Ich bekam den gleichen Fehler von älteren Google Cloud Messaging Setup-Code. Die einfachste Korrektur scheint sich zu ändern

     Intent registrationIntent = new Intent( "com.google.android.c2dm.intent.REGISTER"); 

    in

     Intent registrationIntent = new Intent(); registrationIntent.setClassName("com.google.android.c2dm.intent", "REGISTER"); 

    Für mich hat es gearbeitet, um den aktuellen IabHelper aus den Samples zu verwenden: sdk / extras / google / play_billing / samples / TrivialDrive / src / com / example / android / trivialdrivesample / util / IabHelper.java

    Vergessen Sie nicht, den sdk Update Manager zuerst auszuführen, um sicherzustellen, dass Sie die aktuelle Version installiert haben.

    Die Antworten auf diese spezifischen Probleme wurden bereits veröffentlicht, aber nur um anderen mit dem gleichen Problem zu helfen, aber diesmal für die Lizenz-API.

    Sie erhalten den gleichen Fehler auf 5.0-Nachricht wie in der IAP-Bibliothek, die oben veröffentlicht wurde, aber Sie können eine Korrektur finden (mit manueller Änderung ein paar Zeilen in LicenseChecker.java (Google-Code) und dann Neukompilierung Ihres Projekts, die diese Bibliothek enthalten wird).

    Weitere Informationen finden Sie unter https://code.google.com/p/android/issues/detail?id=78505 . Hoffe, jeder kann es benutzen.

    Das hat für mich gearbeitet, aber ich würde gerne wissen, dass es eine akzeptable Möglichkeit ist, dies zu tun:

    I.setClass (Kontext, MyService.class);

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.