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

Android开发新手求教:如何将应用设为默认电话应用?

将自研应用设为Android默认电话应用的完整解决方案

一、Manifest核心配置(必做)

系统识别默认电话应用的前提是Manifest配置完全正确,以下是必须的配置项:

1. 声明权限

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<!-- Android 10及以上额外需要 -->
<uses-permission android:name="android.permission.ACCEPT_HANDOVER" />

2. 配置电话相关组件

<!-- 处理拨打电话的Activity -->
<activity android:name=".PhoneCallActivity">
    <intent-filter>
        <action android:name="android.intent.action.CALL" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="tel" />
    </intent-filter>
</activity>

<!-- Android 8.0+ 必须的电话连接服务 -->
<service
    android:name=".PhoneCallConnectionService"
    android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
    <intent-filter>
        <action android:name="android.telecom.ConnectionService" />
    </intent-filter>
</service>

<!-- 声明应用为默认电话应用候选 -->
<application ...>
    <meta-data
        android:name="android.telecom.DEFAULT_PHONE_APP"
        android:value="true" />
    <!-- 其他组件配置 -->
</application>

二、主动触发默认应用设置

仅靠Manifest配置,系统不会自动把你的应用加入可选列表,需要在代码中主动请求:

Kotlin 示例

private const val REQUEST_SET_DEFAULT_DIALER = 1001

fun requestDefaultDialer(context: Context) {
    val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
    if (!telecomManager.isDefaultDialerPackage(context.packageName)) {
        val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER)
            .putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, context.packageName)
        (context as Activity).startActivityForResult(intent, REQUEST_SET_DEFAULT_DIALER)
    }
}

Java 示例

private static final int REQUEST_SET_DEFAULT_DIALER = 1001;

public void requestDefaultDialer(Context context) {
    TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
    if (!telecomManager.isDefaultDialerPackage(context.getPackageName())) {
        Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER)
                .putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, context.getPackageName());
        ((Activity) context).startActivityForResult(intent, REQUEST_SET_DEFAULT_DIALER);
    }
}

三、常见问题排查

从你提供的默认电话应用设置截图来看,应用未出现在可选列表中,大概率是以下问题:

  • 动态权限缺失:Android 6.0+ 以上,CALL_PHONE、READ_PHONE_STATE需要动态申请,不能仅依赖Manifest声明。
  • ConnectionService未实现:Android 8.0+ 必须实现ConnectionService的基本逻辑(哪怕是空实现),否则系统不会认定为合格的电话应用。
  • Intent-filter不完整:确保CALL action的filter包含tel scheme和DEFAULT category。
  • 定制ROM限制:小米、华为等定制系统可能需要手动在权限管理中开启“电话”相关权限,或加入白名单。

四、验证流程

  1. 安装应用后,调用上述代码触发系统弹窗。
  2. 在系统设置的“默认应用→电话”中确认应用已出现在列表。
  3. 选择应用后,测试拨打电话、接收来电功能是否正常。

内容的提问来源于stack exchange,提问作者Raphael Schneider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:42:08