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

? elliptic1 @ | Original: StackOverFlow
---

Мой In-App биллинг код работает отлично, пока я обновится в Android л 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.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)
        ...

           

Линия 709 в InfoPanel.java :

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

Top 5 ответ

1cketti @

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

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

2Aleksey Masny @

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

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

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.L_preview/android/app/ContextImpl.java#1472 этокод в источниках L Превью для проверки явного умысла. Он получил https://android.googlesource.com/platform/frameworks/base/+/fd6c7b1%5E!/ в настоящее время, но на Nexus 5 с L просмотра он по-прежнему работает и бросает исключение для неявных намерений .

Изменить: @ http://stackoverflow.com/a/27027371/1213197 ALAV является гораздо более лучше и проще. Просто добавьте

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

Все кредиты для http://stackoverflow.com/a/27027371/1213197 . и http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/app/ContextImpl.java#1675 этокод в источниках L -релиза для проверки явного умысла.

3Jared Burrows @

Она также может помочь взглянуть на то, как Chrome (и большинство приложений Google ) обрабатывает их обслуживание " Отправить отзыв" с Google Play Services :

Перед (по аналогии с ) :

Intent intent = new Intent(Intent.ACTION_BUG_REPORT);

После (явные ) :

Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
intent.setComponent(new ComponentName(FEEDBACK_PACKAGE, FEEDBACK_CLASS));
if (getPackageManager().resolveService(intent, 0) == null) {
    Log.e("help", "Unable to resolve Feedback service.");
    return;
}

Полный исходный метода :

private void sendFeedback() {
    Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
    intent.setComponent(new ComponentName(FEEDBACK_PACKAGE, FEEDBACK_CLASS));
    if (getPackageManager().resolveService(intent, 0) == null) {
        Log.e("help", "Unable to resolve Feedback service.");
        return;
    }

    ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            try {
                Parcel parcel = Parcel.obtain();
                if (sScreenshot != null) {
                    sScreenshot.writeToParcel(parcel, 0);
                }
                service.transact(SEND_FEEDBACK_INFO, parcel, null, 0);
                parcel.recycle();
            } catch (RemoteException ex) {
                Log.e("help", "Unexpected error sending feedback: ", ex);
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    };

    bindService(intent, conn, BIND_AUTO_CREATE);
}

Источник: http://src.chromium.org/viewvc/chrome/trunk/src/remoting/android/java/src/org/chromium/chromoting/HelpActivity.java

4Don Park @

Я получаю ту же ошибку с пожилой Google Cloud Messaging ввода кода . Простейший исправление, похоже, меняется

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

into

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

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

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