这里SDK在Android 8的后台无法使用
在这里,当消费者调用这里SDK在Android 8的后台无法使用,android,here-api,Android,Here Api,在这里,当消费者调用MapEngine.init()时,SDK尝试在内部启动其MapService。由于Android 8后台执行限制,如果要从后台服务初始化MapEngine,此操作将失败。是否有任何初始化MapEngine的方法不涉及SDK在内部启动服务 异常日志: > java.lang.IllegalStateException: Not allowed to start service Intent { act=com.here.android.mpa.service.MapSe
MapEngine.init()
时,SDK尝试在内部启动其MapService
。由于Android 8后台执行限制,如果要从后台服务初始化MapEngine
,此操作将失败。是否有任何初始化MapEngine
的方法不涉及SDK在内部启动服务
异常日志:
> java.lang.IllegalStateException: Not allowed to start service Intent { act=com.here.android.mpa.service.MapService.v3 cmp=de.newecho.app/com.here.android.mpa.service.MapService (has extras) }: app is in background uid UidRecord{6924417 u0a225 CEM idle change:cached procs:1 seq(0,0,0)}
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1521)
at android.app.ContextImpl.startService(ContextImpl.java:1477)
at android.content.ContextWrapper.startService(ContextWrapper.java:650)
at com.nokia.maps.MapServiceClient.a(SourceFile:77)
at com.nokia.maps.MapsEngine.a(SourceFile:622)
at com.nokia.maps.MapsEngine.a(SourceFile:364)
at com.here.android.mpa.common.MapEngine.init(SourceFile:260)
编辑:
我不知道为什么这个被标记为复制品。我的问题不是关于如何像“重复”问题中那样处理安卓8上的背景工作。对
startService()
的调用在HERE SDK内部进行,因此消费者没有办法改变这一点。问题针对HERE开发人员,以澄清是否有一种方法可以初始化MapEngine,使HERE SDK不会在内部启动服务。在HERE Mobile SDK中,无法从后台线程初始化映射
通过确保a)所需地图数据已加载到设备上,b)前台服务已触发,可以在完成地图初始化(前台)后继续在后台导航等功能
从文件:
如果您使用的是逐轮导航模式
对于驾驶,也可以在此处设置SDK进行引导(包括
当应用程序处于
背景。但是,与前景导航场景不同,这里
SDK不会在Android上的后台导航期间流式传输地图数据。
要正确支持这些设备的后台导航,请单击此处
需要应用程序预加载地图数据(例如当前城市或
状态)使用MapLoader类
重要提示:从Android O(8.0)开始,如果您的应用程序正在运行
然后,定位系统服务只计算一个新的
每小时为您的应用程序定位几次。为了避免这种行为,
按照中的说明启动前台服务
Android文档。重要提示:从Android P(9.0)开始,应用程序
需要使用前台服务的,必须请求
android.permission.FOREGROUND\u来自用户的服务权限。对于
更多信息,请参阅Android Pie行为更改
文件
更新:我在这里发了电子邮件,他们说他们“需要”启动前台服务,因为SDK需要运行时权限。我反对说检查权限应该是消费者的责任,权限也可以在后台检查(即使没有设置)。他们可能会考虑改变行为。。。。有没有什么特别的原因使你试图在后台线程上启动地图引擎?首先,你应该在主线程上调用这个方法。原因是我们需要在后台服务中使用MapEngine。除非有比这里提到的权限检查更多的内容,否则对前台服务甚至主线程的限制(顺便说一句,你有这样的源代码吗?)是一种不太理想的设计IMHO。服务和线程是不同的东西,你可以很容易地从代码中的任何地方开始在主线程上运行。新处理程序(Looper.getMainLooper()).post(()->{/*启动MapEngine*/});好的,我明白了:)。当应用程序位于后台时,您不应该启动MapEngine(或通常执行任何繁重的cpu操作)。这就是谷歌希望我们编写应用程序的方式。抱歉,无法选择退出从MapEngine启动服务。一个丑陋的临时解决方案是在build.gradle中设置“targetSdkVersion 25”(或更低版本),这可能需要一段时间。