Google In-App结算,IllegalArgumentException:升级到Android L Dev预览后,服务意图必须明确

ell*_*ic1 56 android illegalargumentexception android-intent in-app-billing android-5.0-lollipop

我的应用内结算代码工作正常,直到我升级到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.+'
...
...
Run Code Online (Sandbox Code Playgroud)

应用启动时的错误:

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)
        ...
Run Code Online (Sandbox Code Playgroud)

           

InfoPanel.java中的第709行:

        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
          @Override
          public void onIabSetupFinished(IabResult result) {
            ...
Run Code Online (Sandbox Code Playgroud)

ala*_*lav 116

我有同样的问题,明确设置包解决了它.与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);
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是 - 即使在谷歌的最新IabHelper.java中也没有.不确定这是否只是5.0的要求,但是肯定会添加它是不会有害的. (3认同)
  • 最后iAbHelper.java现在包含该行(rev 5),但是我仍然收到完全相同的错误!?所以我已经将它添加到IapHelper:if(ris.get(0)!= null && ris.get(0).serviceInfo!= null)serviceIntent.setClassName(ris.get(0).serviceInfo.packageName,ris.得到(0).serviceInfo.name); (3认同)

Ale*_*sny 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;
    }
Run Code Online (Sandbox Code Playgroud)

以下是L预览源中用于检查显式意图的代码.它目前已被评论,但在带有L预览的Nexus 5上,它仍会运行并为隐式意图抛出异常.


编辑:@ alav的答案要好得多,也简单得多.只需添加

intent.setPackage("com.android.vending");
Run Code Online (Sandbox Code Playgroud)

他的所有学分.而这里为L排放源代码进行检查明确意图.

  • Google(http://developer.android.com/google/play/billing/billing_integrate.html#billing-service)的官方解决方案是添加serviceIntent.setPackage("com.android.vending"),如答案中所示. @alav (2认同)
  • 这不起作用.很长一段时间以来,这条线已经在最后一个IabHelper.java中了,我仍然遇到了错误. (2认同)

Roy*_*Roy 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);
Run Code Online (Sandbox Code Playgroud)

AND在AndroidManifest.xml中设置:android:minSdkVersion ="4"

"setPackage"需要Android版本4.