Android 13及以上Flutter通话应用无法加入默认电话应用列表的问询
Android 13+ 让Flutter通话应用加入默认电话应用列表的解决方案
针对你的问题,Android 13(API 33)及以上版本对默认电话应用的准入要求比旧版本更严格,仅配置DIAL相关的intent-filter已经不足以让应用出现在候选列表中,需要完成以下配置:
1. 补充必要的权限声明
在AndroidManifest.xml中添加以下权限,确保应用具备处理通话的基础能力:
<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Android13+ 必需 --> <uses-permission android:name="android.permission.MANAGE_OWN_CALLS" /> <uses-permission android:name="android.permission.ACCEPT_HANDOVER" />
2. 完善Intent Filter配置
替换你现有的intent-filter,添加系统默认电话应用所需的所有action和分类:
<!-- 处理通用拨号请求 --> <intent-filter> <action android:name="android.intent.action.DIAL" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <!-- 处理tel协议的拨号请求 --> <intent-filter> <action android:name="android.intent.action.DIAL" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="tel" /> </intent-filter> <!-- 处理直接呼叫请求(Android13+ 强制要求) --> <intent-filter> <action android:name="android.intent.action.CALL" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="tel" /> </intent-filter> <!-- 处理特权呼叫(如紧急号码) --> <intent-filter> <action android:name="android.intent.action.CALL_PRIVILEGED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="tel" /> </intent-filter> <!-- 标记应用为系统电话应用候选 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.APP_PHONE" /> </intent-filter>
注意:无需添加android:autoVerify="true",该属性用于APP Links验证,和默认电话应用准入无关。
3. 实现并注册Telecom ConnectionService
Android 10及以上版本要求默认电话应用必须实现ConnectionService,系统会通过该服务判断应用是否具备处理通话的能力:
- 在Android原生代码中创建
ConnectionService子类:
package com.your.package.name; import android.telecom.ConnectionService; public class MyConnectionService extends ConnectionService { // 无需额外实现,仅需继承即可满足系统检测要求 }
- 在
AndroidManifest.xml中注册该服务:
<service android:name=".MyConnectionService" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"> <intent-filter> <action android:name="android.telecom.ConnectionService" /> </intent-filter> </service>
4. 运行时申请必要权限
在Flutter端通过权限插件(如permission_handler)申请运行时权限,确保用户授予CALL_PHONE、POST_NOTIFICATIONS等危险权限:
import 'package:permission_handler/permission_handler.dart'; Future<void> requestPhonePermissions() async { final status = await [ Permission.phone, Permission.notification, ].request(); // 检查权限是否被授予 if (status[Permission.phone] != PermissionStatus.granted || status[Permission.notification] != PermissionStatus.granted) { // 处理权限被拒绝的情况,提示用户前往设置开启 } }
完成以上配置后,重新打包应用安装到Android 13+设备上,应用就会出现在系统默认电话应用的候选列表中。
内容的提问来源于stack exchange,提问作者Manish Sharma
相关产品推荐
相关产品推荐

