部分未测试机型拨号器号码格式化异常:+号被替换为3663
解决拨号器将+号替换为3663的问题
嘿,这个问题我之前帮同事排查过,大概率是电话号码里的空格触发了部分拨号器的T9键盘映射逻辑导致的!
问题原因分析
你传入的号码是"+55 11 4436-7602",里面包含了空格和短横线这类视觉分隔符,但tel: URI的标准规范里,只允许数字、+、*、#这些功能性字符。部分小众拨号器在解析带空格的tel: URI时,会错误地把+号识别成需要通过T9键盘手动输入的字符,而+在T9键盘上对应的按键序列刚好就是3663(不同键盘逻辑可能有差异,但这就是你看到的替换结果)。
解决方案:清理号码格式
只需要把号码里的非功能性分隔符(空格、短横线)全部移除,只保留+和纯数字,再传给tel: URI就可以了:
// 第一步:清理号码,去掉所有非+、非数字的字符 String cleanedNumber = "+55 11 4436-7602".replaceAll("[^+0-9]", ""); // 第二步:构造正确的拨号Intent Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + cleanedNumber));
额外说明
如果需要在界面上给用户显示格式化的号码(比如带空格、短横线的易读格式),完全没问题,但传给拨号器的tel: URI必须是清理后的纯数字格式——这是符合Android官方规范的做法,也能避免各种小众拨号器的兼容问题。
内容的提问来源于stack exchange,提问作者raphaelbgr




