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不完整:确保
CALLaction的filter包含telscheme和DEFAULTcategory。 - 定制ROM限制:小米、华为等定制系统可能需要手动在权限管理中开启“电话”相关权限,或加入白名单。
四、验证流程
- 安装应用后,调用上述代码触发系统弹窗。
- 在系统设置的“默认应用→电话”中确认应用已出现在列表。
- 选择应用后,测试拨打电话、接收来电功能是否正常。
内容的提问来源于stack exchange,提问作者Raphael Schneider
相关产品推荐
相关产品推荐

