自动拨号程序调试过程
来源:互联网 发布:田宫上色 知乎 编辑:程序博客网 时间:2024/05/03 21:11
想实现一个自动拨号程序,在拨入后能自动输入号码,即能支持10086一类的自动语音系统。
1.最先测试了
Intentintent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086"));
startActivity(intent);
支持拨号,但弹出了系统的拨号盘,后面的号码只能手动输入。
2.然后参考
TelephonyManagertelMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
MethodgetITelephonyMethod = telMgr.getClass().getDeclaredMethod("getITelephony");
getITelephonyMethod.setAccessible(true);
ITelephonyiTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[])null);
iTelephony.call("10086");
找不到ITelephony的定义,网上狂搜,终于有人指出在SDK中的datacomandroidinternaltelephony下,将data目录加为Build Path,发现DEX报错重复引入了。
改为只引入telephony目录能编译了,就是有些别扭。也是弹出拨号盘。
3.再狂搜,终于发现网上有人指出只要引入datalayoutlib.jar,只是再次出错,dex报出Java heap space,找来找去网上给出方案是应当用户库的形式导入,试用后问题解决
4.由于以上方法都没有解决实际问题,忽然想到把ROM中的Phone.apk反编译试试,用到了dex2jar。
查看了拨号盘按下去的事件,原来是用了com.android.internal.telephony.CallManager中的sendBurstDtmf。
双音多频DTMF,搜索了一下相关概念,原来接通以后送出的按键就是DTMF啊!
这次改用反射,狗血的是居然找不到sendBurstDtmf方法,再看Phone.apk,底层又调用了com.android.internal.telephony.Phone,而正好这里有sendDtmf.改用Phone接口来做。
5.使用PhoneFactory.getDefaultPhone();返回Phone,结果模拟器中一跑报错PhoneFactory.getDefaultPhone must be called from Looper thread
原来是权限不够,manifest加入android:sharedUserId="android.uid.phone",application加入android:process="com.android.phone"。
安装不上INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,这次是签名不对了,要用到platform.x509.pem、platform.pk8,找了半天,还不知道在哪下,如果不同版本还不一样那可怎么办。
终于在CyanogenMod/android_build/target/product/security/下找到,签上名,能在模拟器下用了。
6.测试实际手机了,怎么安到手机上是个大问题,后来找到"adb -s 设备名 install XXX.apk",在模拟器和手机同时存在的情况下指定安到手机。
安装报INSTALL_FAILED_INVALID_INSTALL_LOCATION,原来要安装到/system/app下,只能复制到手机指定目录下,安装,没反应,心灰了因为这个安装不知道怎么调试。
重启手机一看,居然给安上了,再测试,成功拨打10086后继续发出了按键并得到了回复,没有弹出拨号盘。
1.最先测试了
Intent
startActivity(intent);
支持拨号,但弹出了系统的拨号盘,后面的号码只能手动输入。
2.然后参考
TelephonyManager
Method
getITelephonyMethod.setAccessible(true);
ITelephony
iTelephony.call("10086");
找不到ITelephony的定义,网上狂搜,终于有人指出在SDK中的datacomandroidinternalte
改为只引入telephony目录能编译了,就是有些别扭。也是弹出拨号盘。
3.再狂搜,终于发现网上有人指出只要引入datalayoutlib.jar,只是再次出错,dex报出Java heap space,找来找去网上给出方案是应当用户库的形式导入,试用后问题解决
4.由于以上方法都没有解决实际问题,忽然想到把ROM中的Phone.apk反编译试试,用到了dex2jar。
查看了拨号盘按下去的事件,原来是用了com.android.internal.telephony.CallManager中的sendBurstDtmf。
双音多频DTMF,搜索了一下相关概念,原来接通以后送出的按键就是DTMF啊!
这次改用反射,狗血的是居然找不到sendBurstDtmf方法,再看Phone.apk,底层又调用了com.android.internal.telephony.Phone,而正好这里有sendDtmf.改用Phone接口来做。
5.使用PhoneFactory.getDefaultPhone();返回Phone,结果模拟器中一跑报错PhoneFactory.getDefaultPhone must be called from Looper thread
原来是权限不够,manifest加入android:sharedUserId="android.uid.phone",application加入android:process="com.android.phone"。
安装不上INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,这次是签名不对了,要用到platform.x509.pem、platform.pk8,找了半天,还不知道在哪下,如果不同版本还不一样那可怎么办。
终于在CyanogenMod/android_build/target/product/security/下找到,签上名,能在模拟器下用了。
6.测试实际手机了,怎么安到手机上是个大问题,后来找到"adb -s 设备名 install XXX.apk",在模拟器和手机同时存在的情况下指定安到手机。
安装报INSTALL_FAILED_INVALID_INSTALL_LOCATION,原来要安装到/system/app下,只能复制到手机指定目录下,安装,没反应,心灰了因为这个安装不知道怎么调试。
重启手机一看,居然给安上了,再测试,成功拨打10086后继续发出了按键并得到了回复,没有弹出拨号盘。
- 自动拨号程序调试过程
- ADSL自动拨号程序
- 用程序实现自动拨号
- android 自动拨号程序 订票程序apk
- android下调试3G之自动拨号
- android下调试3G之自动拨号
- 用MASM32写ADSL自动拨号程序
- 自动拨号
- android下调试3G之自动拨号【转】
- Windows程序调试 - 调试过程
- Android程序调试过程
- 无法自动调试。未能调试远程过程。
- VideoNet的程序 调试过程
- Keil C51程序调试过程
- 矢量量化程序调试过程
- 调试拨号界面布局
- PPPoE拨号调试
- 调试---2.拨号
- 读书笔记:Representing and manipulation information<computer system a programmer perspective第二章>
- java send message to flex(BlazeDS)
- myecplice10.6 完美破解教程
- memcache学习
- Win8 使用照相机获取照片,视频等效
- 自动拨号程序调试过程
- select方法设置socket 连接超时
- xp如何设置wifi
- 采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版)
- ARM的Load/Store指令
- 编程之美2.1扩展问题2
- Linux进程通信
- 关闭WIN7下的IPV6
- ANDROID 静音与振动