Android中Mapbox导航SDK的电池使用优化

Android中Mapbox导航SDK的电池使用优化,android,mapbox,battery,navigationview,Android,Mapbox,Battery,Navigationview,我在一个项目中工作,需要在片段中显示NavigationView。它工作正常,但会消耗大量电池(在某些情况下,根据设备的不同,温度会显著升高)。 我检查了探查器以确定问题所在 让我们看看 据我所知,地图盒导航要求每秒钟都有高精度的定位。 问题是,有没有办法配置优先级或间隔以减少电池消耗 我按照实现了一个定制的LocationEngine,它适用于MapView,但不适用于NavigationView 有人在Mapbox导航的性能方面遇到过这种问题吗?我已经在新旧设备上测试过了,每次都是一样的

我在一个项目中工作,需要在片段中显示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()
    }