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) {
...
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);
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.
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.
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
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 classeIabHelper
que vous avez placés dans le dossier utils de inappbilling (si vous avez suivi les instructions du didacticiel Google InApp Billing).
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");
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
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.
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.
Cela a fonctionné pour moi, mais j'aimerais savoir que c'est un moyen acceptable de le faire:
i.setClass (context, MyService.class);