Шаблон Android Auto NavigationTemplate: карта маршрутизации в верхнем левом углу не отображаетсяAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Шаблон Android Auto NavigationTemplate: карта маршрутизации в верхнем левом углу не отображается

Сообщение Anonymous »

Я реализую навигационное приложение Android Auto с использованием библиотеки приложений Android для автомобилей на Kotlin.
Приложение работает на 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()
}
}
CarAppService и Session настроены, как указано в официальной документации, и приложение корректно запускается на Android Auto.
Что я проверил
Приложение имеет необходимые зависимости androidx.car.app.
Приложение объявлено как навигационное приложение в манифесте ().
Отображается NavigationTemplate (заголовок, действия и карта видима).
Разрешение на определение местоположения предоставлено, и я могу обновить местоположение на карте.
Вопрос
Что именно требуется для того, чтобы карта маршрута/маневра в верхнем левом углу отображалась в навигационном приложении Android Auto?
Нужно ли мне устанавливать какие-либо конкретные свойства для NavigationTemplate, Trip или Route?
Существует ли дополнительный API (например, обратные вызовы с указанием поворотов или указаний), которые должны быть реализованы?
Есть ли какие-либо ограничения в эмуляторе или головном устройстве, которые могут помешать отображению карты?
Любые указатели или минимальный пример, который правильно отображает карту маршрутизации, будут оценены по достоинству.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ot-showing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»