In-app-facturering van Google, IllegalArgumentException: service-intentie moet expliciet zijn, na upgrade naar Android L Dev Preview

Mijn in-app-factureringscode werkte prima totdat ik een upgrade naar Android L Dev Preview uitvoerde. Nu krijg ik deze foutmelding wanneer mijn app start. Weet iemand wat er is veranderd aan L dat dit veroorzaakt of hoe ik mijn code moet veranderen om dit op te lossen?

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

De fout wanneer de app start:

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

           

Regel 709 in InfoPanel.java:

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

Antwoord 1, autoriteit 100%

Ik had hetzelfde probleem en het expliciet instellen van het pakket loste het op. Vergelijkbaar met het antwoord van Aleksey, maar eenvoudiger:

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);

Antwoord 2, autoriteit 36%

Zoals aangegeven in het onderstaande antwoord, zouden de oplossingen erin bestaan ​​om handmatig een expliciete intentie te creëren:

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;
    }

Hieris de code in L preview-bronnen voor het controleren van de expliciete bedoeling. Het heeft momenteel opmerkingen, maar op Nexus 5 met L preview het wordt nog steeds uitgevoerd en genereert een uitzondering voor impliciete bedoelingen.

Bewerken: het antwoordvan @alav is veel beter en eenvoudiger. Voeg gewoon

. toe

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

Alle credits voor hem. En hieris de code in L release sources voor check expliciete bedoeling.


Antwoord 3, autoriteit 5%

Hier een duidelijke oplossing gevonden:
https://code.google.com/p/android-developer-preview/ issues/detail?id=1674

In de Google Licensing Library (LVL), het bestand LicenseChecker.java, vervangt u de aanroep “bindService” door dit:

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);

EN in de AndroidManifest.xml-set:
android:minSdkVersion=”4″

Het “setPackage” vereist Android-versie 4.


Antwoord 4, autoriteit 3%

In “L” vereist binding aan een service het gebruik van een expliciete intentie.

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


Antwoord 5, autoriteit 2%

Vervang gewoon de code

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

met de volgende 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 de klas IabHelperdie u in de utils-map van inappbilling heeft geplaatst (als u de instructies van de Google InApp Billing-tutorial hebt gevolgd).


Antwoord 6

Ik kreeg dezelfde fout van de oudere installatiecode van Google Cloud Messaging. De eenvoudigste oplossing lijkt te veranderen

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

in

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

Antwoord 7

Voor mij werkte het om de huidige IabHelper uit de voorbeelden te gebruiken:
sdk/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/util/IabHelper.java

Vergeet niet eerst de sdk update manager uit te voeren om er zeker van te zijn dat je de huidige versie hebt geïnstalleerd.


Antwoord 8

De antwoorden voor deze specifieke problemen zijn al gepost, maar alleen om anderen te helpen met exact hetzelfde probleem, maar deze keer voor de License API.

Je krijgt dezelfde foutmelding op 5.0-bericht als in de IAP-bibliotheek die hierboven is gepost, maar je kunt een oplossing vinden (door handmatig een paar regels te wijzigen in LicenseChecker.java (de code van Google) en vervolgens je project opnieuw te compileren dat deze bibliotheek zal bevatten ).

Bekijk: https://code.google.com/p /android/issues/detail?id=78505voor details.
Ik hoop dat iemand het kan gebruiken.


Antwoord 9

Dit werkte voor mij, maar ik zou graag willen weten of dit een acceptabele manier is om dit te doen:

i.setClass(context, MijnService.class);


Antwoord 10

Als je onderstaande fout hebt, stel dan targetSdkVersion 19 in in de build.gradle.
Toen ik 19 instelde, was mijn probleem opgelost. Voor publiceren stel ik targetSdkVersion 27 in

op com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150)
op com.google.android.vending.expansion.downloader.impl.DownloaderService$LVLRunnable.run

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

targetSdkVersion 19

Other episodes