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) {
...
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);
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.
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.
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
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).
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");
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
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.
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.
Das hat für mich funktioniert, aber ich würde gerne wissen, dass dies eine akzeptable Methode ist:
i.setClass (Kontext, MyService.class);