web-dev-qa-db-ja.com

Googleアプリ内課金、IllegalArgumentException:Android L Dev Previewにアップグレードした後、サービス意図は明示的に指定する必要があります

Android L Dev Previewにアップグレードするまで、アプリ内課金コードは正常に機能していました。今ではアプリの起動時にこのエラーが表示されます。これを修正するためにコードを変更する必要がありますか?

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

InfoPanel.Javaの709行目:

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

同じ問題があり、明示的にパッケージを設定すると解決しました。アレクセイの答えに似ていますが、より簡単です:

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

以下の回答で指摘したように、解決策は明示的な意図を手動で作成することです。

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プレビューソースのコードです。 コメント付き が現在ありますが、Lプレビュー付きのNexus 5では、暗黙のインテントに対して引き続き実行され、例外がスローされます。


編集:@alavの answer は、はるかに優れたシンプルなものです。追加するだけ

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

him のすべてのクレジット。 here は、明示的な意図をチェックするためのLリリースソースのコードです。

42
Aleksey Masny

ここで明確な解決策を見つけました: https://code.google.com/p/Android-developer-preview/issues/detail?id=1674

Google Licensing Library(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);

AND AndroidManifest.xmlセット:Android:minSdkVersion = "4"

「setPackage」にはAndroidバージョン4が必要です。

6
Roy

サービスへの「L」バインディングでは、明示的な意図を使用する必要があります。

http://commonsware.com/blog/2014/06/29/dealing-deprecations-bindservice.html を参照してください

3
cketti

コードを置き換えるだけです

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 inappbillingのutilsフォルダーに配置しました(Google InApp Billingチュートリアルの指示に従った場合)。

2
Harpreet

古い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");
1
Don Park

以下のエラーがある場合は、build.gradleでtargetSdkVersion 19を設定してください。 19に設定すると、問題が解決しました。パブリッシュの場合、targetSdkVersion 27を設定します

com.google.Android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.Java:150)at com.google.Android.vending.expansion.downloader.impl.DownloaderService $ LVLRunnable.run

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

targetSdkVersion 19

0
ethemsulan

私にとっては、サンプルの現在のIabHelperを使用するのに役立ちました:sdk/extras/google/play_billing/samples/TrivialDrive/src/com/example/Android/trivialdrivesample/util/IabHelper.Java

最初にSDK更新マネージャーを実行して、現在のバージョンがインストールされていることを確認することを忘れないでください。

0
Björn Kechel

この特定の問題に対する回答は既に投稿されていますが、まったく同じ問題を他の人に役立てるためだけですが、今回はライセンスAPIについてです。

上記のIAPライブラリと同じ5.0メッセージでエラーが発生しますが、修正を見つけることができます(LicenseChecker.Java(Googleのコード)で数行を手動で変更し、このライブラリを含むプロジェクトを再コンパイルすることを含む)。

チェックアウト: https://code.google.com/p/Android/issues/detail?id=78505 詳細誰でも使用できることを願っています。

0
zaifrun

これは私にとってはうまくいきましたが、これを行うには許容できる方法であることを知りたいです:

i.setClass(context、MyService.class);

0
Mike Ludwig