【发布时间】: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