Android应用程序许可致命异常:服务意图必须是显式的。

4

我正在将一款旧版的Android应用从Eclipse迁移到Android Studio。

在3-4年前的旧版本Android上,一切都运行良好。

现在,当我在Android 7.0上运行该应用时,android.vending.licensing出现了以下(Service Intent必须是明确的)致命异常:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=110, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } (has extras) }} to activity {HexagoniaGalaxyS7.hexagoniagalaxys7.apk/hexagoniagalaxys7.apk.HexagoniaActivity}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.licensing.ILicensingService launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } }

Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.licensing.ILicensingService launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } }

这是我的代码:
 String deviceId = tManager.getDeviceId();
 licenseCheckerCallback = new HexagoniaLicenseCheckerCallback();
 licenceChecker = new LicenseChecker(this, new ServerManagedPolicy(this, new AESObfuscator(JUMBLE, getPackageName(), deviceId)), BASE64_PUBLIC_KEY);

licenceChecker.checkAccess(licenseCheckerCallback); // **IT CRASHES ON THIS LINE**

我已经卡在这里两天了 - 非常感谢任何帮助。


1
推荐阅读:https://dev59.com/xXE85IYBdhLWcg3wKwKD(隐式意图现在被认为是安全风险) - ben75
你可能需要更新到该库的新版本。你并没有自己调用bindService()方法;这个库似乎在做这件事情。 - CommonsWare
LicenseCheckerCallback库? - EasyCoder
我认为我在LicenseChecker.java中找到了它:boolean bindResult = mContext.bindService( new Intent(ILicensingService.class.getName()), this, // ServiceConnection.Context.BIND_AUTO_CREATE); 如何更改才能使Intent显式? - EasyCoder
@CommonsWare,我已经更新到最新版本的MarketLicencing库,结果仍然是一样的:java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=110, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } (has extras) }} to activity [...] java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.android.vending.licensing.ILicensingService launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } } - EasyCoder
由于我不使用这个库,我无法为您提供进一步的帮助。请查看谷歌为该库提供的其他支持选项。 - CommonsWare
2个回答

5
Intent intent = new Intent(new Intent(new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U="))));
intent.setPackage("com.android.vending");
boolean bindResult = mContext
                            .bindService(
                                    intent,
                                    this, // ServiceConnection.
                                    Context.BIND_AUTO_CREATE);

供您参考,这个问题的发生是因为必须明确定义意图,也就是说,您需要调用setPackage(String)函数并传递有关服务或其他信息的函数参数。

通过这样做,您告诉Android您想要调用什么,由于Android的安全限制,您必须这样做。顺便说一下,您还需要在许可模块build.gradle文件中将minSdkVersion从3更改为4,以允许使用setPackage(String)函数进行意图操作。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接