wake-up-neo.com

Google-In-App-Abrechnung, IllegalArgumentException: Die Serviceabsicht muss nach dem Upgrade auf Android L Dev Preview explizit sein

Mein In-App-Abrechnungscode funktionierte einwandfrei, bis ich ein Upgrade auf die Android L Dev-Vorschau durchgeführt habe. Jetzt bekomme ich diese Fehlermeldung, wenn meine App startet. Weiß jemand, was sich an L geändert hat und wie ich meinen Code ändern sollte, um das Problem 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) {
            ...
56
elliptic1

Ich hatte das gleiche Problem und das explizite Einstellen des Pakets löste es. Ähnlich wie bei Aleksey, 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);
116
alav

Wie in der Antwort unten ausgeführt, besteht die Lösung darin, die explizite Absicht manuell zu erstellen:

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-Vorschauquellen zur Prüfung der expliziten Absicht. Es hat kommentiert zur Zeit, aber auf Nexus 5 mit L preview läuft es immer noch und wirft eine Ausnahme für implizite Absichten .


Edit: @ alav's answer ist viel besser und einfacher. Einfach hinzufügen 

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

Alle Kredite für ihn . Und hier ist der Code in L-Release-Quellen zur Prüfung der expliziten Absicht.

42
Aleksey Masny

Hier finden Sie eine klare Lösung: https://code.google.com/p/Android-developer-preview/issues/detail?id=1674

Ersetzen Sie in der Datei "LicenseChecker.Java" der LVL (Google Licensing Library) den Aufruf "bindService" durch Folgendes:

 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-Einstellung: Android: minSdkVersion = "4"

Das "setPackage" erfordert Android-Version 4.

6
Roy

In "L" erfordert die Bindung an einen Dienst die Verwendung einer expliziten Absicht.

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

3
cketti

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 KlasseIabHelper, die Sie im utils-Ordner von inappbilling abgelegt haben (wenn Sie den Anweisungen des Google InApp Billing-Lernprogramms gefolgt sind).

2
Harpreet

Ich habe dieselbe Fehlermeldung aus einem älteren Code für die Einrichtung von Google Cloud Messaging erhalten. Der einfachste Fix 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");
1
Don Park

wenn Sie einen Fehler haben, setzen Sie bitte targetSdkVersion 19 in build.gradle . Wenn ich 19 eingestellt habe, wurde mein Problem gelöst. Für die Veröffentlichung habe ich targetSdkVersion 27 gesetzt

unter com.google.Android.vending.licensing.LicenseChecker.checkAccess (LicenseChecker.Java:150) unter com.google.Android.vending.expansion.downloader.impl.DownloaderService $ LVLRunnable.run

defaultConfig {
    applicationId "com.brain.math.game.free"
    minSdkVersion 15
    targetSdkVersion 19 

targetSdkVersion 19

0
ethemsulan

Für mich funktionierte es, den aktuellen IabHelper aus den Samples zu verwenden: Sdk/extras/google/play_billing/samples/TrivialDrive/src/de/example/Android/trivialdrivesample/util/IabHelper.Java

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

0
Björn Kechel

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

Bei der 5.0-Meldung wird dieselbe Fehlermeldung angezeigt wie in der oben angegebenen IAP-Bibliothek. Sie können jedoch ein Update finden, bei dem einige Zeilen in LicenseChecker.Java (Google-Code) manuell geändert und das Projekt anschließend neu kompiliert wird, das diese Bibliothek enthält. 

Check out: https://code.google.com/p/Android/issues/detail?id=78505 für Details . Ich hoffe, jeder kann es verwenden.

0
zaifrun

Das hat für mich funktioniert, aber ich würde gerne wissen, dass dies eine akzeptable Methode ist:

i.setClass (Kontext, MyService.class);

0
Mike Ludwig