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:

 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) { ... 

  • Android "Die Zahlungsmethode wurde für jede Zahlungsmethode abgelehnt
  • Kreditkarte für Google Play Test
  • In-App-Abrechnung funktioniert nicht: "IAB Helper ist nicht eingerichtet"
  • Android InApp Billing: Das gewünschte Artikel ist nicht zum Kauf verfügbar. Inkonsistent auf einem anderen Google-Konto
  • Android-In-App-Abrechnung Fehler: Dieses Element konnte nicht gekauft werden. (Fehlercode: IAB-DPTL)
  • Wie zu beheben - "Diese Version der Anwendung ist nicht für Market Billing konfiguriert"?
  • Aidl.exe Fehler beim Erstellen von Verzeichnissen: Ungültiges Argument
  • Konvertieren einer Android-Anwendung von einem kostenlosen / bezahlten Modell in In-App bezahlt Entriegelung
  • 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.