Google in-App billing, IllegalArgumentException: намерение службы должно быть явным, после обновления до Android L Dev Preview



мой биллинг-код в приложении работал нормально, пока я не обновился до Android L Dev Preview. Теперь я получаю эту ошибку, когда мое приложение запускается. Кто-нибудь знает, что изменилось в L, что вызывает это или как я должен изменить свой код, чтобы исправить это?



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


ошибка при запуске приложения:



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.access0(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.access0( ActivityThread.java:143)
at android.app.ActivityThread$H.handleMessage( ActivityThread.java:1258)
...




строка 709 в инфопанели.java:



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

10 ответов:

У меня была такая же проблема и явная установка пакета решили. Похоже на ответ Алексея, но проще:

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

как указано в ответе ниже, решения будут заключаться в создании явного намерения вручную:

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

здесь - это код в источниках предварительного просмотра L для проверки явного намерения. У него есть прокомментировал в настоящее время, но на Nexus 5 с L preview он все еще работает и выдает исключение для неявных намерений.


Редактировать: @алав по ответ гораздо лучше и проще. Просто добавить

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

все кредиты для его. И здесь - это код в источниках выпуска L для проверки явного намерения.

найдено четкое решение здесь: https://code.google.com/p/android-developer-preview/issues/detail?id=1674

в библиотеке лицензий Google (LVL), LicenseChecker.java-файл, замените вызов "bindService" следующим:

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

и в AndroidManifest.набор xml: android: minSdkVersion= "4"

для "setPackage" требуется Android версии 4.

в "L" привязка к службе требует использования явного намерения.

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

просто замените код

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

следующий код

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

в классе IabHelper который вы разместили в папке utils inappbilling (если вы следовали инструкции Google iNAPP Billing tutorial).

Я получал ту же ошибку из старого кода Настройки Google Cloud Messaging. Самое простое исправление, кажется, меняется

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

на

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

для меня это сработало, чтобы использовать текущий IabHelper из образцов: sdk/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/util/IabHelper.java

Не забудьте сначала запустить Диспетчер обновлений sdk, чтобы убедиться, что у вас установлена текущая версия.

ответы на эти конкретные проблемы уже были опубликованы, но только чтобы помочь другим с той же самой проблемой, но на этот раз для API лицензии.

вы получаете ту же ошибку в сообщении 5.0, что и в библиотеке IAP, опубликованной выше, но вы можете найти исправление (включая ручное изменение нескольких строк в LicenseChecker.java (код Google), а затем перекомпиляция вашего проекта, который будет включать эту библиотеку).

проверить: https://code.google.com/p/android/issues/detail?id=78505 для деталей. Надеюсь, что кто-то может использовать его.

Это сработало для меня, но я хотел бы знать, что это приемлемый способ сделать это:

i. setClass (context, MyService.класс);

если у вас есть ниже ошибка, пожалуйста, установите targetSdkVersion 19 в сборке.градля. Когда я поставил 19 моя проблема решена. Для публикации я установил targetSdkVersion 27

на com.гуглить.андроид.продажа.лицензирование.LicenseChecker.checkAccess (LicenseChecker.java: 150) на ком.гуглить.андроид.продажа.расширение.загрузчик.осущ.DownloaderService$LVLRunnable.беги

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

targetSdkVersion 19

Comments

    Ничего не найдено.