我的应用内结算代码工作正常,直到我升级到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) {
...
答案 0 :(得分: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);
答案 1 :(得分: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;
}
Here是L预览源中用于检查显式意图的代码。它目前有commented,但在带有L预览的Nexus 5上,它仍会运行并为隐含意图抛出异常。
编辑:@ alav&#39; s answer更好更简单。只需添加
intent.setPackage("com.android.vending");
答案 2 :(得分: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);
在AndroidManifest.xml中设置: 机器人:的minSdkVersion = “4”
“setPackage”需要Android版本4。
答案 3 :(得分:3)
&#34; L&#34;绑定到服务需要使用明确的意图。
请参阅http://commonsware.com/blog/2014/06/29/dealing-deprecations-bindservice.html
答案 4 :(得分: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结算教程的说明进行操作)。
答案 5 :(得分: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");
答案 6 :(得分:0)
对我来说,它可以使用样本中的当前IabHelper: SDK /演员/谷歌/ play_billing /样品/ TrivialDrive / SRC / COM /示例/机器人/ trivialdrivesample / util的/ IabHelper.java
不要忘记先运行sdk更新管理器,以确保安装了当前版本。
答案 7 :(得分:0)
此特定问题的答案已经发布,但只是为了帮助其他人解决完全相同的问题,但这次是针对许可证API。
您在5.0消息上收到与上面发布的IAP库相同的错误,但您可以找到修复程序(包括手动更改LicenseChecker.java中的几行(Google代码),然后重新编译包含此库的项目)。
查看:https://code.google.com/p/android/issues/detail?id=78505了解详情。 希望任何人都可以使用它。
答案 8 :(得分:0)
这对我有用,但我想知道这是可以接受的方式:
i.setClass(context,MyService.class);
答案 9 :(得分: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