Приложение работает на Android Auto и показывает NavigationTemplate с картой, но карта маршрута/маневра в верхнем левом углу никогда не появляется.
Что я пытаюсь сделать
Когда я запускаю навигацию, я ожидаю, что Android Auto покажет карту маршрута по умолчанию (с указанием следующего поворота, расстояния и т. д.) в в левом верхнем углу экрана, в то время как моя карта видна на заднем плане.
Однако отображаются только карта и панель приложения/действия — карты маршрутизации нет.
Соответствующий код
Это упрощенная версия моей настройки экрана и шаблона навигации:
Код: Выделить всё
@RequiresApi(Build.VERSION_CODES.O)
class NavigationHomeScreen(
carContext: CarContext,
position: LatLng,
polylineList: List?,
poiLocations: List = emptyList()
) : Screen(carContext) {
private val appMgr = carContext.getCarService(AppManager::class.java)
private val surfaceCb = NavSurfaceCallback(
carContext,
position,
polylineList,
poiLocations,
refreshPois = { fetchPoiLocations() }
)
private val assetHelper: AssetHelper = AssetHelper(carContext)
private val navMgr = carContext.getCarService(NavigationManager::class.java)
private val mainHandler = Handler(Looper.getMainLooper())
private var navigationStarted = false
private var routingInfo: RoutingInfo = placeholderRoutingInfo()
init {
appMgr.setSurfaceCallback(surfaceCb)
// NavigationManager callback ve basit dummy rota yüklemesi
mainHandler.post {
navMgr.setNavigationManagerCallback(object : NavigationManagerCallback {
override fun onStopNavigation() {
Log.d("NavigationManagerCallback", "Navigation Stopped")
}
})
// Fake rota/step/estimate ile NavigationManager'ı başlat
startNavigationIfNeeded()
fetchPoiLocations()
}
}
private fun actionStrip() = ActionStrip.Builder()
.addAction(
Action.Builder()
.setTitle("+")
.setOnClickListener { surfaceCb.zoomIn() }
.build()
)
.addAction(
Action.Builder()
.setTitle("-")
.setOnClickListener { surfaceCb.zoomOut() }
.build()
)
.addAction(
Action.Builder()
.setIcon(
assetHelper.getCarIconFromDrawable(
R.drawable.my_location,
null,
false,
null
)
)
.setOnClickListener { surfaceCb.recenter() }
.build()
)
.build()
private fun mapActionStrip() = ActionStrip.Builder()
.addAction(Action.PAN)
.build()
private fun createStep(text: String, maneuverType: Int): Step =
Step.Builder(CarText.create(text))
.setManeuver(Maneuver.Builder(maneuverType).build())
.build()
private fun isRoutingInfoSupported(): Boolean {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
}
private fun placeholderRoutingInfo(): RoutingInfo {
val currentStep = createStep("Başlıyoruz, düz devam", Maneuver.TYPE_DEPART)
val nextStep = createStep("300 m sonra sağa dön", Maneuver.TYPE_TURN_NORMAL_RIGHT)
return RoutingInfo.Builder()
.setCurrentStep(currentStep, Distance.create(300.0, UNIT_METERS))
.setNextStep(nextStep)
.build()
}
private fun buildTempTrip(): Trip {
val currentStep = createStep("D100/E5 yönüne devam et", Maneuver.TYPE_STRAIGHT)
val nextStep = createStep("300 m sonra sağa dön", Maneuver.TYPE_TURN_NORMAL_RIGHT)
routingInfo = RoutingInfo.Builder()
.setCurrentStep(currentStep, Distance.create(500.0, UNIT_METERS))
.setNextStep(nextStep)
.build()
return Trip.Builder()
.addStep(
currentStep,
travelEstimate()
)
.setCurrentRoad("Road")
.build()
}
private fun fetchPoiLocations() {
AndroidAutoLocationPlugin.getLocations(object : MethodChannel.Result {
override fun success(result: Any?) {
val markers = mutableListOf()
if (result is List) {
result.forEach { raw ->
try {
if (raw is String) {
val item = LocationItem.fromArgs(raw)
markers.add(
NavSurfaceCallback.PoiMarker(
position = LatLng(item.latitude, item.longitude),
isAc = item.isAc,
isDc = item.isDc
)
)
}
} catch (_: Exception) {
}
}
}
surfaceCb.updatePoiMarkers(markers)
}
override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
// ignore
}
override fun notImplemented() {
// ignore
}
})
}
@RequiresApi(Build.VERSION_CODES.O)
private fun travelEstimate():TravelEstimate {
val arrivalTime = ZonedDateTime.now(ZoneId.systemDefault()).plusMinutes(18)
val dtw = DateTimeWithZone.create(arrivalTime)
return TravelEstimate.Builder(
Distance.create(12450.0, Distance.UNIT_METERS),
dtw // ETA, DateTimeWithZone olarak
).setRemainingTimeSeconds(18 * 60L)
.build()
}
private fun debugRoutingSupport() {
Log.d("RoutingSupport", "SDK: ${Build.VERSION.SDK_INT}")
Log.d("RoutingSupport", "Supported: ${isRoutingInfoSupported()}")
Log.d("RoutingSupport", "Navigation started: $navigationStarted")
}
private fun startNavigationIfNeeded() {
if (navigationStarted) return
navigationStarted = true
navMgr.navigationStarted()
navMgr.updateTrip(buildTempTrip())
invalidate()
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onGetTemplate(): Template {
debugRoutingSupport()
startNavigationIfNeeded()
return try {
val builder = NavigationTemplate.Builder()
.setNavigationInfo(routingInfo)
.setDestinationTravelEstimate(travelEstimate())
.setActionStrip(actionStrip())
.setMapActionStrip(mapActionStrip())
return builder.build()
} catch (t: Throwable) {
MessageTemplate.Builder("Hata: ${t::class.java.simpleName}\n${t.message}")
.setTitle("Car Demo")
.setHeaderAction(Action.APP_ICON)
.build()
}
}
Что я проверил
Приложение имеет необходимые зависимости androidx.car.app.
Приложение объявлено как навигационное приложение в манифесте ().
Отображается NavigationTemplate (заголовок, действия и карта видима).
Разрешение на определение местоположения предоставлено, и я могу обновить местоположение на карте.
Вопрос
Что именно требуется для того, чтобы карта маршрута/маневра в верхнем левом углу отображалась в навигационном приложении Android Auto?
Нужно ли мне устанавливать какие-либо конкретные свойства для NavigationTemplate, Trip или Route?
Существует ли дополнительный API (например, обратные вызовы с указанием поворотов или указаний), которые должны быть реализованы?
Есть ли какие-либо ограничения в эмуляторе или головном устройстве, которые могут помешать отображению карты?
Любые указатели или минимальный пример, который правильно отображает карту маршрутизации, будут оценены по достоинству.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ot-showing
Мобильная версия