向拨号器发送暂停指令

28
发送暂停和DTMF输入的android类似,我正在尝试将暂停字符“,”发送到拨号器。 这在HTC Sense手机甚至Xoom上都可以工作,但不适用于“股票体验”手机,例如Nexus One或T-Mobile G2(我怀疑Motorola 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"是否正确。
所以问题是:是否有一种方式可以在大多数或所有Android拨号器中使用的暂停指定方法?
6个回答

17

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

长话短说:

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。这将绕过拨号器,因此应谨慎使用。


感谢您查看此事。 - pforhan

4

拨号暂停已经存在了30年。

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

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


谢谢提供信息。我真的认为是拨号器本身从意图中删除了逗号。如果我没记错的话,只要你从他们的用户界面中插入暂停,这些拨号器就会让你这样做。 - pforhan
Android手机在内部可能使用这个标准,但允许其他应用程序发送请求拨打号码的接口使用RFC3966 URI来指示号码,该标准故意不支持暂停字符(请参见http://tools.ietf.org/html/rfc3966#section-12)。 - Jules

3

来自安卓的 拉丁输入法源代码

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

我不确定这是否是公开的,但你可能可以使用:

PhoneNumberUtils.PAUSE

是的,这就是我确定应该发送逗号的方式。但问题在于,一些拨号器一旦遇到逗号就会停止工作。 - pforhan

0

供日后参考,RFC-2806 指定以以下格式存储电话号码:

tel:number;postd=post-dial

number 可以以 + 开头表示有意拨号,可以包含 -. 作为可视分隔符,post-dial 可以包含数字、大写字母 A-D、#*p 表示暂停和 w 表示等待。


遗憾的是,iOS(截至版本9)在tel:URI中给出“postd =”时会失败,因此现在在iOS上仅使用“,”和“;”。 - Nick Dowell
谢谢,但这在模拟器上可行,但在某些手机上不行。 - CoolMind
@CoolMind 或许应该有人知道它在哪些手机上无法运行,然后为了符合 RFC-2806 标准向他们提出问题单? - Steve Barnes
1
@SteveBarnes,很好的想法。但是即使任何生产商在未来的手机中修复了这个漏洞,旧手机仍将继续使用旧方案。 - CoolMind

0

是的,就像我在问题描述中所说的那样,我尝试了字符 p。但它只是被忽略了,所有数字都被拼接在一起了。 - pforhan

0

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

让它像应该的那样工作:

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

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

就是这么简单。这在Android上不起作用,这是iPhone的销售宣传。


3
你可能希望向Android提交一个错误报告,我不确定他们是否会在这里阅读。 - pforhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接