web-dev-qa-db-fra.com

Facturation Google In-App, IllegalArgumentException: l'objectif du service doit être explicite après la mise à niveau vers Android L Dev Preview.

Mon code de facturation intégré à l'application fonctionnait correctement jusqu'à ce que je passe à l'Android L Dev Preview. Maintenant, je reçois cette erreur lorsque mon application démarre. Est-ce que quelqu'un sait ce qui a changé à propos de L qui cause ceci ou comment je dois changer mon code pour résoudre ce problème?

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

L'erreur au démarrage de l'application:

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

 

Ligne 709 dans InfoPanel.Java:

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

J'ai eu le même problème et régler explicitement le paquet l'a résolu. Similaire à la réponse d'Aleksey, mais plus simple:

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

Comme indiqué dans la réponse ci-dessous, les solutions consisteraient à créer une intention explicite manuellement:

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

Ici est le code dans les sources de prévisualisation L pour vérifier l'intention explicite. Il a commenté actuellement, mais sur le Nexus 5 avec aperçu L, il fonctionne toujours et lève une exception pour des intentions implicites .


Edit: @ alav's answer est bien mieux et plus simple. Il suffit d'ajouter 

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

Tous les crédits pour lui . Et ici est le code dans L sources de publication pour vérifier l’intention explicite.

42
Aleksey Masny

Solution claire trouvée ici: https://code.google.com/p/Android-developer-preview/issues/detail?id=1674

Dans le fichier LicenseChecker.Java de la bibliothèque de licences Google (LVL), remplacez l'appel "bindService" par ceci:

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

ET dans le jeu AndroidManifest.xml: Android: minSdkVersion = "4"

Le "setPackage" nécessite Android version 4.

6
Roy

Dans "L", la liaison à un service nécessite l'utilisation d'une intention explicite.

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

3
cketti

Il suffit de remplacer le code

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

avec le code suivant

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

dans la classeIabHelperque vous avez placés dans le dossier utils de inappbilling (si vous avez suivi les instructions du didacticiel Google InApp Billing).

2
Harpreet

La même erreur me venait de l'ancien code de configuration de Google Cloud Messaging. Le correctif le plus simple semble changer

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

dans

Intent registrationIntent = new Intent();
registrationIntent.setClassName("com.google.Android.c2dm.intent", "REGISTER");
1
Don Park

si vous avez une erreur ci-dessous, définissez targetSdkVersion 19 dans le fichier build.gradle . Lorsque j'ai défini 19, mon problème est résolu. Pour publier, définissez targetSdkVersion 27

sur com.google.Android.vending.licensing.LicenseChecker.checkAccess (LicenseChecker.Java:150) sur 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

Pour moi, cela a fonctionné d'utiliser l'actuel IabHelper des exemples:

N'oubliez pas de lancer d'abord le gestionnaire de mise à jour de sdk pour vous assurer que la version actuelle est installée.

0
Björn Kechel

Les réponses à ces problèmes spécifiques ont déjà été publiées, mais uniquement pour aider les autres à résoudre exactement le même problème, mais cette fois pour l'API de licence.

Vous obtenez la même erreur sur le message 5.0 que dans la bibliothèque IAP publiée ci-dessus, mais vous pouvez trouver un correctif (impliquant de modifier manuellement quelques lignes dans LicenseChecker.Java (code de Google), puis de recompiler votre projet qui inclura cette bibliothèque). 

Consultez: https://code.google.com/p/Android/issues/detail?id=78505 pour plus de détails . J'espère que tout le monde pourra l'utiliser.

0
zaifrun

Cela a fonctionné pour moi, mais j'aimerais savoir que c'est un moyen acceptable de le faire:

i.setClass (context, MyService.class);

0
Mike Ludwig