24

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

我的两个条件是:

  • 我们不使用定制的 Android 平台
  • 我们不需要root手机

我花了几天时间做功课,并且知道当前的 SDK/标准 API 不支持通话中的 DTMF 发送。然而,通过使用相关的类,com.android.internal.telephony我希望模仿原生电话应用程序是如何做到这一点的。我关注了这个网站,了解如何将内部 API 用于标准 3rd 方应用程序

我还为自己设置了 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 相同的权限。

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

在此先感谢,西蒙。

4

3 回答 3

11

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

因此,恐怕目前这是不可能的。Android 上有一个开放的功能请求,可以通过现有电话发送 DTMF 音调,但它已经休眠了将近两年。

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

Intent i = new Intent("android.intent.action.CALL",
                      Uri.parse("tel://" + number + "," + dtmfTones));
于 2011-07-05T09:58:42.653 回答
6

简而言之,如果不至少自定义电话应用程序,您将无法做到这一点,该应用程序必须以系统用户身份运行才能访问调制解调器。为了做到这一点,你必须root你的手机。

为了满足您的要求,唯一可能的解决方案是增强 android 平台。我们就是这样做的,并且已经将补丁发送到 AOSP 项目:

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

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

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

最好的问候, Gergely

于 2012-05-17T19:02:07.233 回答
1

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

于 2012-10-20T07:00:48.140 回答