Среда
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
Код: Выделить всё
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,
),
],
),
),
);
}
}
Код: Выделить всё
Код: Выделить всё
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
Мобильная версия