在呼叫中的上行链路上发送DTMF音调

时间:2011-06-14 10:34:09

标签: android telephony internal dtmf in-call

我正在开展一个项目,要求我的应用能够在通话期间在语音的上行频率上发送DTMF音。

我的两个条件是:

  • 我们不使用自定义的Android平台
  • 我们不需要根电话

我花了几天时间做作业,并且我知道当前的SDK /标准API不支持通话中的DTMF发送。但是,通过使用com.android.internal.telephony中的相关类,我希望模仿本机电话应用程序如何执行此操作。我跟着this site on how to use internal APIs for standard 3rd party apps

我也为Android OS开发环境做好准备,并且能够在模拟器上以调试模式运行Phone应用程序,以确定其内部工作原理。

我在股票标准模拟器上尝试了各种方法,但我得到的错误是:

  1. 尝试使用android.uid.phone的sharedUserId基于Phone.apk的源安装重命名的应用程序后,我得到了:

      

    安装错误:INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

    毫无疑问,由于我没有系统证书来签名。

  2. 尝试根据Phone.apk来源的相关DTMF音码发送代码编写自定义应用程序后,设置PhoneFactory时出现以下错误;

      

    java.lang.SecurityException:Permission Denial:不允许发送广播android.provider.Telephony.SPN_STRINGS_UPDATED。

    毫无疑问,由于我的应用程序没有正确的权限,尽管AndroidManifest.xml设置的权限与Phone.apk相同。

  3. 我不知道还能尝试什么。有没有人有任何建议?

    提前致谢, 西蒙。

3 个答案:

答案 0 :(得分:10)

你采取了一种有趣的方法,我赞扬你的努力。不幸的是,有一些保留的内部权限(显然,例如SPN_STRINGS_UPDATED),您不能作为应用程序开发人员使用,这或多或少会破坏这种方法。您可以尝试删除导致此问题的代码区域,但我相当肯定您会遇到阻塞问题。

因此,我担心目前这是不可能的。在现有的电话呼叫中发送DTMF音频有an open feature request on Android,但它已经在那里休眠了将近两年。

我知道这不能解决您的问题,但请注意您可以在拨打号码后直接发送DTMF音:

Intent i = new Intent("android.intent.action.CALL",
                      Uri.parse("tel://" + number + "," + dtmfTones));

答案 1 :(得分:6)

简单地说,如果没有自定义至少必须以系统用户身份运行才能访问调制解调器的手机应用程序,您将无法执行此操作。要做到这一点,你必须手机。

为了满足您的要求,唯一可行的解​​决方案是增强Android平台。我们做到了这一点,并已将我们的补丁发送到AOSP项目:

https://android-review.googlesource.com/32820

https://android-review.googlesource.com/32821

我们目前正在等待Google开发者审核并接受我们的贡献。如果您有兴趣,请让Google知道各种AOSP列表(android-contrib,android-platform)。它有望加快审查。

最诚挚的问候, 盖尔盖伊

答案 2 :(得分:1)

您无法在通话期间发送DTMF音,但您可以在发起通话时“编程”它们时发送它们。 请参阅以下帖子:https://stackoverflow.com/a/12986066/475472