Google In-App billing, IllegalArgumentException: Service Intent must be explicit, after upgrade to A
Posted
技术标签:
【中文标题】Google In-App billing, IllegalArgumentException: Service Intent must be explicit, after upgrade to Android L Dev Preview【英文标题】:Google In-App billing, IllegalArgumentException: Service Intent must be explicit, after upgrading to Android L Dev Preview 【发布时间】:2014-08-20 05:32:40 【问题描述】:在我升级到 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 ComponentInfocom.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)
...
【问题讨论】:
这一行及其周围的代码会很有趣:com.tbse.wnswfree.util.IabHelper.startSetup(IabHelper.java:262)
Hans - 这是谷歌的代码,你可以在这里看到:goo.gl/KLMllR
Android L (API 21) - java.lang.IllegalArgumentException: Service Intent must be explicit的可能重复
【参考方案1】:
在“L”中绑定到服务需要使用明确的意图。
见http://commonsware.com/blog/2014/06/29/dealing-deprecations-bindservice.html
【讨论】:
所以我只是想知道我们是否应该使用博客中的解决方案,或者是否会更新 IAP API。我想它会更新... @elliptic1 它昨天在 API 21 中没有修复,所以我不确定它是否会改变。 :( 如果您在 IAB 以外的其他地方遇到此问题,还发布了一个更通用的解决方案,从标记的答案中得到启发:blog.android-develop.com/2014/10/… 好吧,令人难以置信的是,Google 还没有更新他们的 IABHelper 代码。这些解决方案都不适用于运行 5.0 的模拟器,它仍然在 bindService() 上崩溃。【参考方案2】: 正如下面的答案所指出的,解决方案是手动创建显式意图:
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;
Here 是 L 预览源代码中用于检查显式意图的代码。它目前有commented,但在带有 L 预览的 Nexus 5 上它仍然运行并为隐式意图抛出异常。
编辑:@alav 的answer 更好更简单。只需添加
intent.setPackage("com.android.vending");
him 的所有学分。而here 是L 发布源中用于检查显式意图的代码。
【讨论】:
这行得通(至少警告现在消失了)。此外,您可以强制安装一个应用程序来解决此操作,以防止盗版。 如果您在 IAB 以外的其他地方遇到此问题,还发布了一个受此答案启发的更通用的解决方案:blog.android-develop.com/2014/10/… 使用此解决方案确实可以解决问题,但对我来说会产生另一个问题。请在此处查看我的问题:***.com/questions/27495659/… Google (developer.android.com/google/play/billing/…) 的官方解决方案是在@alav 的回答中添加 serviceIntent.setPackage("com.android.vending") 那行不通。这行已经在最后一个IabHelper.java中很久了,还是报错。【参考方案3】:我在旧版 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");
【讨论】:
【参考方案4】:我有同样的问题,明确设置包解决了它。类似于 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);
【讨论】:
太棒了——即使在谷歌最新的 IabHelper.java 中也没有这个。不确定这是否只是 5.0 的要求,但肯定会添加它。 最后一个 iAbHelper.java 现在包含该行(第 5 版),但是我仍然收到完全相同的错误!?所以我把这个添加到 IapHelper: if (ris.get(0) != null && ris.get(0).serviceInfo != null) serviceIntent.setClassName(ris.get(0).serviceInfo.packageName, ris. get(0).serviceInfo.name); @3c71 你从哪里得到第 5 版? 请注意,此代码位于“util”包中的 IabHelper.java 文件中。这对我来说并不明显 现在在 LicenseChecker 类中。【参考方案5】:对我来说,使用示例中的当前 IabHelper 很有效: sdk/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/util/IabHelper.java
不要忘记先运行 sdk 更新管理器以确保您安装了当前版本。
【讨论】:
【参考方案6】:这个特定问题的答案已经发布,但只是为了帮助其他人解决完全相同的问题,但这次是针对许可证 API。
您在 5.0 消息中收到与上面发布的 IAP 库中相同的错误,但您可以找到修复方法(涉及手动更改 LicenseChecker.java(Google 的代码)中的几行,然后重新编译将包含此库的项目)。
查看:https://code.google.com/p/android/issues/detail?id=78505 了解详情。 希望任何人都可以使用它。
【讨论】:
【参考方案7】:在这里找到明确的解决方案: 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);
AndroidManifest.xml 集中的 AND: android:minSdkVersion="4"
“setPackage”需要 Android 版本 4。
【讨论】:
我们刚刚更新了目标 SDK 并遇到了这个问题。感谢您的修复。请注意,这只影响运行 Android 5.0 的设备。运行 5.0.1 及更高版本的设备似乎没问题。【参考方案8】:这对我有用,但我想知道这是一种可接受的方式:
i.setClass(context, MyService.class);
【讨论】:
【参考方案9】:只需替换代码
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);
在您放置在 inappbilling 的 utils 文件夹中的类 IabHelper
中(如果您已按照 Google InApp Billing 教程的说明进行操作)。
【讨论】:
它现在适用于 Lollipop 及以上版本,之前的代码仅适用于 Kitkat。【参考方案10】:如果您有以下错误,请在 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
【讨论】:
以上是关于Google In-App billing, IllegalArgumentException: Service Intent must be explicit, after upgrade to A的主要内容,如果未能解决你的问题,请参考以下文章
SDK接入之Android Google Play内支付(in-app Billing)接入
Google Play In-app billing 版本 3 购买的服务器端验证
Google In-App billing, IllegalArgumentException: Service Intent must be explicit, after upgrade to A