【问题标题】:Optimizing battery usage for Mapbox Navigation SDK in Android优化 Android 中 Mapbox Navigation SDK 的电池使用情况
【发布时间】:2021-02-02 23:01:40
【问题描述】:

我正在从事一个需要在片段中显示 NavigationView 的项目。它工作正常,但会消耗大量电池(并且取决于设备的温度会显着升高)。 我检查了 AS 中的分析器以尝试识别问题,

让我们看看...

据我所知,Mapbox Navigation 每隔一秒就会要求高精度定位。 问题是,有什么方法可以配置优先级或间隔来减少电池消耗?

我按照official docs 实现了一个自定义LocationEngine,适用于MapView,但不适用于NavigationView。

有人在 Mapbox Navigation 的性能方面遇到过这种问题吗?我已经在新旧设备上测试过,每次都是一样的。

我正在使用:

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) {
   
}

// 编辑 在 Yoshikage Ochi 发表评论后,我对 setupNavigationOptions 方法进行了一些更改:

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()
    }

但不幸的是它不起作用。周期和优先级是相同的(可能是默认值),我每秒都会收到更新,并且处于 HIGH_PRIORITY。

【问题讨论】:

    标签: android mapbox battery navigationview


    【解决方案1】:

    在您的实施中,当行程会话以Google doc explains 开始时,您的设置将被默认设置覆盖。

    NavigationOptions 有一个名为locationEngineRequest 的选项,用于配置LocationEngine (example)。

    以下代码演示了如何在NavigationViewOptions 中使用NavigationOptions,这是NavigationView#startNavigation 的参数

    val optionsBuilder = NavigationViewOptions.builder(this@MainActivity)
    optionsBuilder.navigationOptions(MapboxNavigation
        .defaultNavigationOptionsBuilder(this@MainActivity, Mapbox.getAccessToken())
            .locationEngineRequest(LocationEngineRequest.Builder(5)
            .build())
        .build())
    

    同时,根据您的性能结果,位置更新能耗远小于 CPU 能耗。

    在这种情况下,如何使用 FPS 节流机制来降低 CPU 功耗?当设备is running on battery and meets some conditions 时,此设置会限制最大 FPS。默认值为20

    navigationView.retrieveNavigationMapboxMap()?.updateMapFpsThrottle(5);
    

    【讨论】:

    • 感谢您的信息!我将对其进行测试并更新答案。
    • 我编辑了这个问题,它不起作用:(
    • >周期和优先级是相同的(可能是默认值),我每秒都会收到更新,并且处于 HIGH_PRIORITY。你是怎么检查这个的?如果您检查 Profiler,您可能会看到使用不同 FusedLocationProvider 的遥测活动。这意味着减少请求的数量不会对电源使用产生很大影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2017-05-26
    相关资源
    最近更新 更多