问题描述
|
我正在做一个项目,要求我的应用程序在通话过程中能够在语音的上行链路频率上发送DTMF音调。
我的两个条件是:
我们不使用定制的Android平台
我们不需要扎根手机
我已经花了几天时间来做作业,并且知道当前的SDK /标准API不支持通话中DTMF发送。但是,通过使用
com.android.internal.telephony
中的相关类,我希望模仿本地Phone应用程序如何做到这一点。我关注了这个网站,了解如何将内部API用于标准的第三方应用程序。
我还设置了Android OS开发环境,并能够在模拟器上以调试模式运行Phone应用程序,以了解其内部工作原理。
我在股票标准仿真器上尝试了多种方法,但遇到的错误是:
尝试使用android.uid.phone的sharedUserId根据Phone.apk的源安装重命名的应用程序后,我得到:
安装错误:INSTALL_Failed_SHARED_USER_INCOMPATIBLE
毫无疑问,由于我没有用于签名的系统证书。
尝试根据相关的DTMF音调(从Phone.apk的源发送代码)编写自定义应用程序后,在设置PhoneFactory时出现以下错误;
java.lang.SecurityException:权限拒绝:不允许发送广播android.provider.Telephony.SPN_STRINGS_UPDATED。
毫无疑问,由于我的应用程序没有正确的权限,尽管AndroidManifest.xml的设置与Phone.apk的权限相同。
我茫然不知所措。有没有人有什么建议?
提前致谢,
西蒙
解决方法
您采取了一种有趣的方法,我赞扬您的努力。不幸的是,不允许您作为应用程序开发人员使用一些保留的内部特权(例如as1ѭ),这或多或少破坏了这种方法。您可以尝试删除导致此问题的代码区域,但是我很确定您会遇到阻塞问题。
因此,目前恐怕这是不可能的。 Android上有一个开放功能请求,要求通过现有电话发送DTMF音调,但该功能已经休眠了将近两年。
我了解这不能解决您的问题,但是请注意,您可以在拨打电话后直接发送DTMF音调:
Intent i = new Intent(\"android.intent.action.CALL\",Uri.parse(\"tel://\" + number + \",\" + dtmfTones));
, 简而言之,您至少要自定义“电话”应用,否则您将无法做到这一点,该应用必须以系统用户身份运行才能访问调制解调器。为此,您必须扎根手机。
为了满足您的要求,唯一可能的解决方案是增强android平台。我们就是这样做的,并且已经将补丁发送到AOSP项目:
https://android-review.googlesource.com/32820
https://android-review.googlesource.com/32821
我们目前正在等待Google开发人员审核并接受我们的贡献。如果您有兴趣,请在各种AOSP列表(android-contrib,android-platform)上告知Google。希望它将加速审查。
最好的祝福,
热心地
, 您不能在通话过程中发送DTMF音,但是可以在启动通话时对其进行“编程”时发送。
请参阅以下帖子:https://stackoverflow.com/a/12986066/475472