如何让Flutter应用在Android设备的「默认数字助手应用」中显示?
如何通过Flutter开发让应用加入Android「默认数字助手应用」列表
要让Flutter应用出现在Android系统的「默认数字助手应用」列表中,核心在于完成Android原生端的系统服务声明与配置,Flutter端主要负责实现交互逻辑。以下是具体步骤:
一、Android端核心配置(AndroidManifest.xml)
修改android/app/src/main/AndroidManifest.xml,这是让应用被系统识别为数字助手的关键:
- 添加必要权限
<uses-permission android:name="android.permission.BIND_VOICE_INTERACTION" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 若需语音输入则添加 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 若需联网功能则添加 -->
- 注册VoiceInteractionService
在<application>标签内添加服务声明,其中android:label会显示在系统助手列表中:
<service android:name=".MyVoiceInteractionService" android:label="@string/app_name" android:permission="android.permission.BIND_VOICE_INTERACTION"> <intent-filter> <action android:name="android.service.voice.VoiceInteractionService" /> </intent-filter> <meta-data android:name="android.voice_interaction_session" android:value=".MyVoiceInteractionSession" /> <meta-data android:name="android.voice_interaction_session_show_settings" android:value="true" /> <!-- 允许在系统设置中显示助手配置项 --> </service>
- 创建原生服务类
在Android项目的java/com/your/package/(或Kotlin对应目录)下创建两个类:
- MyVoiceInteractionService:继承系统VoiceInteractionService
package com.your.package; import android.service.voice.VoiceInteractionService; public class MyVoiceInteractionService extends VoiceInteractionService { @Override public void onCreate() { super.onCreate(); // 可在此初始化服务基础逻辑 } }
- MyVoiceInteractionSession:处理助手唤起后的会话逻辑
package com.your.package; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.service.voice.VoiceInteractionSession; public class MyVoiceInteractionSession extends VoiceInteractionSession { public MyVoiceInteractionSession(Context context) { super(context); } @Override public void onShow(Bundle args, int showFlags) { super.onShow(args, showFlags); // 唤起Flutter主界面 Intent intent = new Intent(getContext(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(intent); } }
二、Flutter端交互实现
如果需要将系统唤起参数传递给Flutter,可通过MethodChannel实现:
- 原生端(MainActivity)设置通道
import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.plugin.common.MethodChannel; public class MainActivity extends FlutterActivity { private static final String CHANNEL = "voice_assistant_channel"; @Override public void configureFlutterEngine(FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL) .setMethodCallHandler((call, result) -> { if (call.method.equals("getInvocationArgs")) { // 可传递唤起时的系统参数 result.success("助手被系统唤起"); } else { result.notImplemented(); } }); } }
- Flutter端接收数据
import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; class HomePage extends StatefulWidget { const HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { final MethodChannel _channel = const MethodChannel('voice_assistant_channel'); String? _invocationMsg; @override void initState() { super.initState(); _getInvocationMsg(); } void _getInvocationMsg() async { String? msg = await _channel.invokeMethod('getInvocationArgs'); setState(() { _invocationMsg = msg; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("我的数字助手")), body: Center(child: Text(_invocationMsg ?? "等待唤起")), ); } }
三、测试与设置默认助手
- 安装应用后,进入系统设置→应用→默认应用→数字助手应用,即可看到你的应用出现在列表中,选择即可设为默认
- 也可通过adb命令快速设置:
adb shell cmd role set-role-holder android.app.role.VOICE_INTERACTION com.your.package
注意事项
BIND_VOICE_INTERACTION是系统级权限,无需用户手动授权,由系统自动授予- 部分品牌定制Android系统可能对第三方数字助手有额外限制,需确保设备支持第三方助手设置
- 若需语音识别、唤醒等功能,需额外集成Android原生
SpeechRecognizer或第三方语音服务
内容的提问来源于stack exchange,提问作者reasrt
相关产品推荐
相关产品推荐

