58

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

10 に答える 10

118

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

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);
于 2014-11-19T21:30:47.917 に答える
42

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

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 プレビューでは引き続き実行され、暗黙的なインテントに対して例外がスローされます。


編集:@alavの答えは、はるかに優れており、よりシンプルです。追加するだけ

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

のためのすべてのクレジット。そして、明示的な意図をチェックするための L リリース ソースのコードを次に示します

于 2014-10-11T20:02:26.343 に答える
6

ここで明確な解決策が見つかりました: 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);

および AndroidManifest.xml セット内: android:minSdkVersion="4"

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

于 2014-12-02T13:34:52.823 に答える
3

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

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

于 2014-06-29T22:37:51.190 に答える
1

以前の 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");
于 2014-11-19T04:52:42.957 に答える
0

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

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

詳細については、 https : //code.google.com/p/android/issues/detail?id=78505をご覧ください。どなたでもご利用いただければ幸いです。

于 2014-11-25T13:41:16.300 に答える
0

私にとっては、サンプルから現在の IabHelper を使用することができました: sdk/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/util/IabHelper.java

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

于 2014-11-21T07:58:37.100 に答える