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 IabHelper
die 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