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

如何向拨号Intent传递含#的号码?#被自动移除问题求助

解决Android拨号Intent中带#号码被截断的问题

这个问题我之前处理过,核心原因是**#在URI里属于特殊的片段标识符**,直接拼接成tel: URI时,系统的URI解析器会自动把#及后面的内容当成片段部分截断,所以才会出现号码末尾#丢失的情况。而你提到移除setData后模拟器可行但真机不行,是因为模拟器的拨号应用对Intent的校验比较宽松,而真机上的系统拨号应用严格遵循Android Intent规范,必须依赖正确的tel URI才能识别完整号码。

下面是两种可靠的解决方案:

方案1:对电话号码进行URL编码

使用Uri.encode()方法对包含特殊字符(#、*等)的号码进行编码,这样URI解析器会把这些特殊字符当成号码的一部分处理:

public PhoneIntents dialPhone(String phoneNumber) {
    intent = new Intent();
    intent.setAction(Intent.ACTION_DIAL);
    // 对电话号码进行URL编码,保留所有特殊字符
    String encodedPhoneNumber = Uri.encode(phoneNumber);
    intent.setData(Uri.parse("tel:" + encodedPhoneNumber));
    return this;
}

方案2:使用Uri.Builder构建规范的tel URI

这种方式更符合Android URI构建的最佳实践,能自动处理特殊字符的编码:

public PhoneIntents dialPhone(String phoneNumber) {
    intent = new Intent();
    intent.setAction(Intent.ACTION_DIAL);
    // 用Uri.Builder构建tel协议的URI
    Uri telUri = new Uri.Builder()
            .scheme("tel")
            .appendPath(phoneNumber)
            .build();
    intent.setData(telUri);
    return this;
}

两种方案都能让*123*12#这类带特殊字符的号码完整传递到拨号界面,而且在真机上也能正常工作。需要注意的是,ACTION_DIAL不需要申请CALL_PHONE权限,只会打开拨号界面让用户手动确认拨打,所以不用担心权限问题。

内容的提问来源于stack exchange,提问作者Masoud Mohammadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:08:00