You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,系统会通过该服务判断应用是否具备处理通话的能力:

  1. 在Android原生代码中创建ConnectionService子类:
package com.your.package.name;

import android.telecom.ConnectionService;

public class MyConnectionService extends ConnectionService {
    // 无需额外实现,仅需继承即可满足系统检测要求
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:36:12