Android Auto во FlutterAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android Auto во Flutter

Сообщение Anonymous »

Приложение Flutter Android Auto не отображается на DHU.
Среда
Flutter: стабильный канал
Android Auto: настольное головное устройство (DHU)
Целевой SDK: 34
minSdk: 21
Библиотека автомобильных приложений AndroidX: 1.7.0
Устройство: Эмулятор/физическое устройство, подключенное к DHU
Я следовал инструкциям Chatgpt и создал следующие классы для встроенного подключения с помощью Flutter.
Чего я пытаюсь достичь
Покажите базовый экран Android Auto с помощью Flutter.
CarAppService
Используйте Flutter для:
обработки голоса
преобразования текста в речь
UI в телефонном приложении
Общайтесь между Android Auto → Flutter с помощью MethodChannel
Как минимум я ожидаем:
Приложение появится в DHU.
Простой экран списка с названием «Голосовой помощник».

Код: Выделить всё

AUTOSERVICE.KT
package com.example.mytwincar

import androidx.car.app.CarAppService
import androidx.car.app.Session
import androidx.car.app.validation.HostValidator

class AutoService : CarAppService() {

override fun createHostValidator(): HostValidator {
// DHU only: allow all hosts
return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR
}

override fun onCreateSession(): Session {
return AutoSession()
}

}

Код: Выделить всё

Autosession.kt
package com.example.mytwincar

import android.content.Intent
import androidx.car.app.Screen
import androidx.car.app.Session
class AutoSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
return MainAutoScreen(carContext)
}
}

Код: Выделить всё

MainActivity.kt
package com.example.mytwincar

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {

private val CHANNEL = "voice_assistant_channel"

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handleAssistantIntent(intent)
}

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleAssistantIntent(intent)
}

private fun handleAssistantIntent(intent: Intent?) {
val query = intent?.getStringExtra("query") ?: return

MethodChannel(
flutterEngine!!.dartExecutor.binaryMessenger,
CHANNEL
).invokeMethod("onVoiceQuery", query)
}

override fun configureFlutterEngine(flutterEngine: io.flutter.embedding.engine.FlutterEngine) {
super.configureFlutterEngine(flutterEngine)

MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
CHANNEL
).setMethodCallHandler { call, result ->
if (call.method == "launchAssistant") {
launchGoogleAssistant()
result.success(null)
}
}
}

private fun launchGoogleAssistant() {
val intent = Intent(Intent.ACTION_VOICE_COMMAND)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
}
}

Код: Выделить всё

MainAutoScreen.kt
package com.example.mytwincar

import androidx.car.app.CarContext
import androidx.car.app.Screen
import androidx.car.app.model.*
import androidx.car.app.model.ListTemplate
import androidx.car.app.model.ItemList
import androidx.car.app.model.Row

class MainAutoScreen(carContext: CarContext) : Screen(carContext) {

override fun onGetTemplate(): Template {
return ListTemplate.Builder()
.setTitle("Voice Assistant")
.setSingleList(
ItemList.Builder()
.addItem(
Row.Builder()
.setTitle("Say:  Talk to MyApp")
.build()
).build()
)
.build()
}
}
Вот как я соединяю Flutter с Native
Код Flutter

Код: Выделить всё

voice_bridge.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_tts/flutter_tts.dart';
import 'package:mytwincar/voice_bridge.dart';

void main() {
WidgetsFlutterBinding.ensureInitialized();
VoiceBridge.init();
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

@override
Widget build(BuildContext context) {
return const MaterialApp(
home: VoiceScreen(),
);
}
}

class VoiceScreen extends StatelessWidget {
const VoiceScreen({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Voice Assistant')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton.icon(
icon: const Icon(Icons.mic),
label: const Text("Use Google Assistant"),
onPressed: VoiceBridge.launchAssistant,
),
const SizedBox(height: 20),
ElevatedButton.icon(
icon: const Icon(Icons.stop),
label: const Text("Stop Audio"),
onPressed: VoiceBridge.stopSpeaking,
),
],
),
),
);
}
}
Манифест Зависимости в android build.gradle

Код: Выделить всё

    dependencies {
implementation("androidx.car.app:app:1.7.0")
implementation("androidx.car.app:app-projected:1.7.0")
}
Проблема
Приложение устанавливается успешно
Нет сбоев во время выполнения
Не отображается в DHU
То, что я уже пробовал
Очистка кеша и хранилища Android Auto
Переустановка приложения
Использование категории навигации
Включение режима разработчика в Android Auto
Разрешение неизвестных приложений
Перезапуск DHU
Проверка имен пакетов и классов

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

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

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

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

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

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