Android中Mapbox导航SDK的电池使用优化
我在一个项目中工作,需要在片段中显示NavigationView。它工作正常,但会消耗大量电池(在某些情况下,根据设备的不同,温度会显著升高)。 我检查了探查器以确定问题所在 让我们看看 据我所知,地图盒导航要求每秒钟都有高精度的定位。 问题是,有没有办法配置优先级或间隔以减少电池消耗 我按照实现了一个定制的LocationEngine,它适用于MapView,但不适用于NavigationView 有人在Mapbox导航的性能方面遇到过这种问题吗?我已经在新旧设备上测试过了,每次都是一样的 我正在使用:Android中Mapbox导航SDK的电池使用优化,android,mapbox,battery,navigationview,Android,Mapbox,Battery,Navigationview,我在一个项目中工作,需要在片段中显示NavigationView。它工作正常,但会消耗大量电池(在某些情况下,根据设备的不同,温度会显著升高)。 我检查了探查器以确定问题所在 让我们看看 据我所知,地图盒导航要求每秒钟都有高精度的定位。 问题是,有没有办法配置优先级或间隔以减少电池消耗 我按照实现了一个定制的LocationEngine,它适用于MapView,但不适用于NavigationView 有人在Mapbox导航的性能方面遇到过这种问题吗?我已经在新旧设备上测试过了,每次都是一样的
implementation "com.mapbox.navigation:ui:1.4.0"
implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:9.6.0'
这是我实施的一部分
private fun initLocationEngine() {
locationEngine = LocationEngineProvider.getBestLocationEngine(requireContext())
// i don't know if is necessary to remove location updates before configure a new location engine
locationEngine?.removeLocationUpdates(this)
val request =
LocationEngineRequest.Builder(30000)
.setPriority(LocationEngineRequest.PRIORITY_BALANCED_POWER_ACCURACY)
.setMaxWaitTime(10000).build()
locationEngine?.requestLocationUpdates(request, this, getMainLooper())
}
override fun onMapReady(mapboxMap: MapboxMap) {
mapView = mapboxMap
mapView.setStyle(Style.TRAFFIC_DAY) {
initLocationEngine()
initCamera(mapboxMap)
}
}
private fun setupNavigationOptions(directionsRoute: DirectionsRoute): NavigationViewOptions {
val options = NavigationViewOptions.builder(requireContext())
options.directionsRoute(directionsRoute)
.navigationListener(this)
.feedbackListener(this)
.locationObserver(this)
.locationEngine(locationEngine)
return options.build()
}
private fun getNavigationRoute(origin: Point, destination: Point) {
val navigation = MapboxNavigation.defaultNavigationOptionsBuilder(getCurrentContext(), Mapbox.getAccessToken())
mapboxNavigation = MapboxNavigation(navigation.build())
val routeOptions = RouteOptions.builder()
.applyDefaultParams()
.accessToken(Mapbox.getAccessToken()!!)
.coordinates(coordinates)
.geometries(RouteUrl.GEOMETRY_POLYLINE6)
.profile(DirectionsCriteria.PROFILE_DRIVING)
.alternatives(false)
.voiceUnits(DirectionsCriteria.METRIC)
.build()
mapboxNavigation.requestRoutes(routeOptions, object : RoutesRequestCallback {
override fun onRoutesReady(routes: List<DirectionsRoute>) {
if (routes.isNotEmpty() && isAdded) {
val currentRoute = routes.first()
navigationView.startNavigation(setupNavigationOptions(currentRoute))
showNavigationMode()
}
}
override fun onRoutesRequestFailure(throwable: Throwable, routeOptions: RouteOptions) {
Timber.e("route request failure %s", throwable.toString())
}
override fun onRoutesRequestCanceled(routeOptions: RouteOptions) {
Timber.d("route request canceled")
}
})
}
// these methods are from LocationObserver callback
override fun onEnhancedLocationChanged(enhancedLocation: Location, keyPoints: List<Location>) {
// this method called every second, so, LocationEngine it's configured fine but the criteria and interval configuration does'nt work
}
override fun onRawLocationChanged(rawLocation: Location) {
}
但不幸的是它不起作用。周期和优先级是相同的(可能是默认值),我每秒都会收到高优先级的更新。在您的实现中,当trip session启动时,您的设置将被默认设置覆盖
NavigationOptions
有一个名为的选项,用于配置LocationEngine
()
下面的代码演示了如何在NavigationViewOptions
中使用NavigationOptions
,该选项是NavigationView#startNavigation
val optionsBuilder=NavigationViewOptions.builder(this@MainActivity)
选项生成器.导航选项(MapboxNavigation
.DefaultNavigationOptions生成器(this@MainActivity,Mapbox.getAccessToken())
.locationEngineRequest(locationEngineRequest.Builder(5)
.build())
.build())
同时,根据您的性能结果,位置更新能耗远小于CPU能耗
在这种情况下,如何使用FPS节流机制,以减少CPU功耗?此设置将在设备启动时剪辑最大FPS。默认值为
navigationView.retrieveNavigationMapboxMap()?.updateMapFpsThrottle(5);
谢谢您提供的信息!我将测试它并更新答案。我编辑了问题,它不起作用:(>周期和优先级相同(可能是默认值),我每秒都会收到高优先级的更新。您是如何检查这一点的?如果您检查探查器,您可能会看到遥测活动使用了不同的功能。从这个意义上说,减少请求数量不会对电源使用造成很大影响。
private fun setupNavigationOptions(directionsRoute: DirectionsRoute): NavigationViewOptions {
val navViewOptions = NavigationViewOptions.builder(requireContext())
val navOpt = MapboxNavigation.defaultNavigationOptionsBuilder(requireContext(), Mapbox.getAccessToken())
val request =
LocationEngineRequest.Builder(30000)
.setPriority(LocationEngineRequest.PRIORITY_BALANCED_POWER_ACCURACY).build()
navOpt.locationEngineRequest(request)
navViewOptions.navigationOptions(navOpt.build())
navViewOptions.directionsRoute(directionsRoute)
.navigationListener(this)
.feedbackListener(this)
.locationObserver(this)
return options.build()
}