这里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”(或更低版本),这可能需要一段时间。