向拨号器发送暂停

Posted

技术标签:

【中文标题】向拨号器发送暂停【英文标题】:Sending pause to dialer 【发布时间】:2011-08-10 16:22:30 【问题描述】:

与Sending Pause and DTMF input in android 类似,我正在尝试将暂停字符“,”发送到拨号器。这适用于 HTC Sense 手机甚至 Xoom,但不适用于 Nexus One 或 T-Mobile G2 等“股票体验”手机(我怀疑摩托罗拉 Droid)。

这些电话似乎有一个拨号器,它会尝试对号码进行漂亮的格式化(即添加破折号)并在遇到逗号字符时停止。有趣的是,它不会阻塞“p”字符,尽管它会去掉“p”并继续添加数字。

这是 ActivityManager 看到的内容:

I/ActivityManager(   92): Starting activity: Intent  act=android.intent.action.DIAL dat=tel:8883333,444 cmp=com.android.contacts/.DialtactsActivity 

我还尝试了编码形式“tel:8883333%2C444”,这些手机的行为没有区别。如前所述,我已经尝试过“p”,但这些字符被删除,导致拨号器错误地填充了 888-333-3444,而且我不确定“p”是否正确。

那么,问题来了:有没有办法指定适用于大多数或所有安卓拨号器的暂停?

【问题讨论】:

【参考方案1】:

简短回答:使用本机拨号器似乎不可能。

长答案:

Android 中的原生拨号器使用以下代码提取您使用 Intent 传递给拨号器的号码

if ("tel".equals(uri.getScheme())) 
  // Put the requested number into the input area
  String data = uri.getSchemeSpecificPart();
  setFormattedDigits(data, null);
  return true;
 

setFormattedDigits 方法中,数字因此被转换:

  String dialString = PhoneNumberUtils.extractNetworkPortion(data);

查看extractNetworkPortion 的文档,您会注意到它“提取网络地址部分 [其中] 网络地址部分是所有内容直到 DTMF 控制数字分隔符(暂停或等待).

因此,代码有意删除了暂停字符及其后面的任何内容。我能想到的唯一选择是替换拨号器或使用ACTION_CALL 操作而不是ACTION_DIAL。这将绕过拨号程序,因此应谨慎使用。

【讨论】:

感谢您对此进行调查。【参考方案2】:

拨号暂停30年了

如果安卓手机兼容ITUT V.250 ATS8=2,应将逗号引起的延迟设置为2秒。 (有可能它被设置为 0)

ITUT 是一个很棒的标准组织,您可以免费下载他们的标准。

【讨论】:

感谢您的信息。我真的认为是拨号器本身从意图中的字符串中删除了逗号。如果我没记错的话,这些拨号器可以让你插入暂停,只要你从他们的 UI 中进行。 Android 手机可能内部使用这个标准,但是允许其他应用程序发送拨号请求的接口使用 RFC3966 URI 来指示号码,它不支持有意选择暂停字符(参见tools.ietf.org/html/rfc3966#section-12)【参考方案3】:

来自安卓的latin ime source code:

<!-- Pause is a comma. Check PhoneNumberUtils.java to see if this has changed. -->
<Key 
    android:codes="44"
    android:keyLabel="Pause" />

我不能 100% 确定它是否公开,但您也许可以使用:

PhoneNumberUtils.PAUSE

【讨论】:

是的,这就是我确定我应该发送逗号的方式。但问题是,有些拨号器在遇到逗号后就会停止。【参考方案4】:

',' 是标准,但 HTC 在 rogers magic 中使用了 'p',你试过用 'p' 吗? HTC Magic is using p

【讨论】:

是的,我尝试了 p 字符,正如我在问题中所描述的那样。它只是被丢弃了,所有的数字都串在一起了。【参考方案5】:

这是可怕和危险的。在手机上收到电话会议电子邮件的商务人士必须不断地来回切换以获取号码。

让它按应有的方式工作:

tel://+1-877-555-1212,,,2345678#

应拨打877 号码暂停,然后在电话上的任意位置选择参与者会议代码和“输入”(#)。

就这么简单。这在 Android 中不起作用的事实是 iPhone 的推销。

【讨论】:

你可能想向 Android 提交一个错误,我不确定他们是否读过这里。【参考方案6】:

供将来参考RFC-2806 指定以以下格式存储电话号码:

tel:number;postd=post-dial

其中number 可以以+ 开头用于有意拨号,可以包含-. 作为视觉分隔符,post-dial 可以包含数字、大写字母AD、#*p 暂停,w 等待。

【讨论】:

遗憾的是,ios(从版本 9 开始)在 tel: URI 中给出“postd=”时会失败,所以现在只使用 , 和 ;在 iOS 上 谢谢,但这适用于模拟器,但不适用于某些手机。 @CoolMind 也许知道它在哪部手机上工作的人应该为他们提出 RFC-2806 合规性的票? @SteveBarnes,好主意。但即使任何生产商将在未来的手机中修复此错误,旧手机仍将继续使用旧方案。

以上是关于向拨号器发送暂停的主要内容,如果未能解决你的问题,请参考以下文章

Android 自定义拨号器应用,连接未激活

android M拨号盘开源之旅--- 浅析拨号盘主界面

微信内置浏览器中如何实现点击电话号码自动到拨号页面

ARM+llinux系统移植3G拨号上网收发短信

关于ppp拨号gprs上网的一些问题

iPhone 你能从你的应用程序中显示拨号界面吗?