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

我有同样的问题,明确设置包解决了它。类似于 Aleksey 的回答,但更简单:

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 预览源中用于检查显式意图的代码。它目前已被评论,但在带有 L 预览的 Nexus 5 上,它仍然运行并为隐式意图抛出异常。


编辑:@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 许可库 (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。

于 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 回答
2

只需替换代码

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 教程的说明进行操作)。

于 2015-11-17T16:15:13.437 回答
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。

您在 5.0 消息中收到与上面发布的 IAP 库中相同的错误,但您可以找到修复(包括手动更改 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 回答
0

这对我有用,但我想知道这是一种可以接受的方式:

i.setClass(context, MyService.class);

于 2015-01-17T07:16:14.223 回答
0

如果您有以下错误,请在 build.gradle 中设置 targetSdkVersion 19。当我设置 19 时,我的问题解决了。对于发布,我设置 targetSdkVersion 27

在 com.google.android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.java:150) 在 com.google.android.vending.expansion.downloader.impl.DownloaderService$LVLRunnable.run

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

targetSdkVersion 19

于 2017-12-13T20:08:34.437 回答