Android提高之TelephonyManager功能探秘

前面文章介绍了如何使用JAVA的反射机制来调用蓝牙的隐藏API,本文继续来练习JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。

先来看一下本文程序运行的效果图,如下所示:

本文程序演示了以下功能:

1.所有来电自动接听;

2.所有来电自动挂断;

3.开启/关闭Radio;

4.开启/关闭数据连接(WAP or NET的连接)。

调用TelephonyManager的隐藏API是先参考Framework的/base/telephony/java/com/android/internal/telephony/ITelephony.aidl,然后自己实现一个ITelephony.aidl,最后在TelephonyManager中通过反射机制实例化自定义的ITelephony,实例化之后就可以调用ITelephony里面的函数了。

本文程序需要在AndroidManifest.xml添加以下两行代码,以获得权限:

<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />

main.xml源码如下:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <RadioGroup android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/rGrpSelect"> <RadioButton android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/rbtnAutoAccept" android:text="所有来电自动接听"></RadioButton> <RadioButton android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/rbtnAutoReject" android:text="所有来电自动挂断"></RadioButton> </RadioGroup> <ToggleButton android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/tbtnRadioSwitch" android:textOn="Radio已经启动" android:textOff="Radio已经关闭" android:textSize="24dip" android:textStyle="normal"></ToggleButton> <ToggleButton android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/tbtnDataConn" android:textSize="24dip" android:textStyle="normal" android:textOn="允许数据连接" android:textOff="禁止数据连接"></ToggleButton> </LinearLayout>

PhoneUtils.java是手机功能类,从TelephonyManager中实例化ITelephony并返回,源码如下:

package com.testTelephony; import java.lang.reflect.Field; import java.lang.reflect.Method; import com.android.internal.telephony.ITelephony; import android.telephony.TelephonyManager; import android.util.Log; public class PhoneUtils { /** * 从TelephonyManager中实例化ITelephony,并返回 */ static public ITelephony getITelephony(TelephonyManager telMgr) throws Exception { Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod("getITelephony"); getITelephonyMethod.setAccessible(true);//私有化函数也能使用 return (ITelephony)getITelephonyMethod.invoke(telMgr); } static public void printAllInform(Class clsShow) { try { // 取得所有方法 Method[] hideMethod = clsShow.getDeclaredMethods(); int i = 0; for (; i < hideMethod.length; i++) { Log.e("method name", hideMethod[i].getName()); } // 取得所有常量 Field[] allFields = clsShow.getFields(); for (i = 0; i < allFields.length; i++) { Log.e("Field name", allFields[i].getName()); } } catch (SecurityException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (IllegalArgumentException e) { // throw new RuntimeException(e.getMessage()); e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

testTelephony.java是主类,使用PhoneStateListener监听通话状态,以及实现上述4种电话控制功能,源码如下:

package com.testTelephony; import android.app.Activity; import android.os.Bundle; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; import android.view.View; import android.widget.RadioGroup; import android.widget.ToggleButton; public class testTelephony extends Activity { /** Called when the activity is first created. */ RadioGroup rg;//来电操作单选框 ToggleButton tbtnRadioSwitch;//Radio开关 ToggleButton tbtnDataConn;//数据连接的开关 TelephonyManager telMgr; CallStateListener stateListner; int checkedId=0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); telMgr= (TelephonyManager)getSystemService(TELEPHONY_SERVICE); telMgr.listen(new CallStateListener(), CallStateListener.LISTEN_CALL_STATE); PhoneUtils.printAllInform(TelephonyManager.class); rg = (RadioGroup)findViewById(R.id.rGrpSelect); rg.setOnCheckedChangeListener(new CheckEvent()); tbtnRadioSwitch=(ToggleButton)this.findViewById(R.id.tbtnRadioSwitch); tbtnRadioSwitch.setOnClickListener(new ClickEvent()); try { tbtnRadioSwitch.setChecked(PhoneUtils.getITelephony(telMgr).isRadioOn()); } catch (Exception e) { Log.e("error",e.getMessage()); } tbtnDataConn=(ToggleButton)this.findViewById(R.id.tbtnDataConn); tbtnDataConn.setOnClickListener(new ClickEvent()); try { tbtnDataConn.setChecked(PhoneUtils.getITelephony(telMgr).isDataConnectivityPossible()); } catch (Exception e) { Log.e("error",e.getMessage()); } } /** * 来电时的操作 * @author GV * */ public class CheckEvent implements RadioGroup.OnCheckedChangeListener{ @Override public void onCheckedChanged(RadioGroup group, int checkedId) { testTelephony.this.checkedId=checkedId; } } /** * Radio和数据连接的开关 * @author GV * */ public class ClickEvent implements View.OnClickListener{ @Override public void onClick(View v) { if (v == tbtnRadioSwitch) { try { PhoneUtils.getITelephony(telMgr).setRadio(tbtnRadioSwitch.isChecked()); } catch (Exception e) { Log.e("error", e.getMessage()); } } else if(v==tbtnDataConn){ try { if(tbtnDataConn.isChecked()) PhoneUtils.getITelephony(telMgr).enableDataConnectivity(); else if(!tbtnDataConn.isChecked()) PhoneUtils.getITelephony(telMgr).disableDataConnectivity(); } catch (Exception e) { Log.e("error", e.getMessage()); } } } } /** * 监视电话状态 * @author GV * */ public class CallStateListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { if(state==TelephonyManager.CALL_STATE_IDLE)//挂断 { Log.e("IDLE",incomingNumber); } else if(state==TelephonyManager.CALL_STATE_OFFHOOK)//接听 { Log.e("OFFHOOK",incomingNumber); } else if(state==TelephonyManager.CALL_STATE_RINGING)//来电 { if(testTelephony.this.checkedId==R.id.rbtnAutoAccept) { try { //需要<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> PhoneUtils.getITelephony(telMgr).silenceRinger();//静铃 PhoneUtils.getITelephony(telMgr).answerRingingCall();//自动接听 } catch (Exception e) { Log.e("error",e.getMessage()); } } else if(testTelephony.this.checkedId==R.id.rbtnAutoReject) { try { PhoneUtils.getITelephony(telMgr).endCall();//挂断 PhoneUtils.getITelephony(telMgr).cancelMissedCallsNotification();//取消未接显示 } catch (Exception e) { Log.e("error",e.getMessage()); } } } super.onCallStateChanged(state, incomingNumber); } } }

感兴趣的读者可以测试一下本文实例代码,希望能够对大家的Android项目开发有所帮助。

时间: 2024-09-24 05:47:36

Android提高之TelephonyManager功能探秘的相关文章

Android提高之TelephonyManager功能探秘_Android

前面文章介绍了如何使用JAVA的反射机制来调用蓝牙的隐藏API,本文继续来练习JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能. 先来看一下本文程序运行的效果图,如下所示: 本文程序演示了以下功能: 1.所有来电自动接听: 2.所有来电自动挂断: 3.开启/关闭Radio: 4.开启/关闭数据连接(WAP or NET的连接). 调用TelephonyManager的隐藏API是先参考Framework的/base/telephony/j

JSFIDDLE 助力 Threejs 功能探秘

JSFIDDLE 助力 WebGL 功能探秘 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 以下示例能产生基本几何体的阴影投射,还有另一份代码,是无法投射的,和本份能投射的代码,相差不多,但确

谷歌高管:Android 从未抄袭 iPhone 功能

据华cnet网站报道,Google负责Android技术的副总裁希罗什·洛克海姆(Hiroshi Lockheimer)在苹果-三星专利侵权案上作证时表示,Google工程师从未在Android中抄袭iPhone功能. 洛克海姆对陪审团称,Google工程师实际上试图开发截然不同于苹果iOS移动操作系统的软件,"我们希望有自己的特色,希望有自己的创意.我们对自己的产品热情高昂,有自己的创意非常重要". 苹果指控三星在开发Android设备时抄袭iPhone和iPad,但三星则辩称,An

Android带多选功能的PhotoPicker

最近利用闲碎的一些时间开发了一个Android库PhotoPicker,前面一篇文章也介绍了,Android高仿微信图片选择功能的PhotoPicker,之前没有加入选择多张图片的功能,现在加上之后一个完整的PhotoPicker库终于算是完工了. 动态效果图 Android带多选功能的PhotoPicker示例图片 使用方法 引入PhotoPicker库,在需要使用图片选择功能的地方添加如下代码: Intent intent = new Intent(MainActivity.this, Ph

android-想实现Android的火车票查询功能,请问火车票数据从哪里获取?

问题描述 想实现Android的火车票查询功能,请问火车票数据从哪里获取? 想用Android开发火车票的查询功能,包括到达每站的时刻,所用时间,火车票价,经过的站点! 请问有现成的火车票数据?一般情况下,这些火车票数据都是从哪里获取到的? 解决方案 1.聚合网,要申请APPKEY,网址:http://www.juhe.cn/docs/api/id/22 2.webservice的,http://webservice.webxml.com.cn//WebServices/TrainTimeWeb

效果-Android Android 拖拽拼图功能的实现!!急!!在线等!急!

问题描述 Android Android 拖拽拼图功能的实现!!急!!在线等!急! 我要的效果是 比如我在左边选择了第一个模版,然后我拖拽到右边工作区域,松开放下,然后我在去左边选择模版,比如我在选择第一个模版,又拖动右边,比如我我放在我第一个的左边,这是要注意了,这2个图片不能重叠在一起!!如果我觉得第二个没放好!我可以在点击让他消失,在去左边选择一个模版,拖过来拼在上下左右的位置!!! 小弟先谢过各位了!! 有实例代码最好!!给小弟思路小弟也感激不尽!! 解决方案 在电脑中处理不行吗? 解决

调用Android自带日历功能(日历列表单、添加一个日历事件)

调用Android自带日历功能  觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有一个内置的日历应用程序.第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件.这个日历可以直接同步用户的谷歌日历.  不幸的是,没有文档和Android手机的日历应用集成,因为有另外一个联系人应用程序.相反,本文所提供的所有信息,将会通过逆向工程的谷歌日历内容提供商.该接口

源码-android 系统如何给功能打宏开关?

问题描述 android 系统如何给功能打宏开关? 比如:我做了一个通话自动录音的功能,改了源码,功能实现了,但现在问题来了,有的 客户需要这个功能,有的客户不需要这个功能,所以,想给它添加一个开关,需要这个功能的客户,将其开关打开,不需要此功能的客户,在编译系统的时候将其关闭,现在 需要了解开关是在哪个地方加,加到哪个文件里面,如何读取这个开关. 望大神指点.谢谢! 解决方案 定义全局变量Config控制, gradle打包时改变变量 解决方案二: 定义全局变量Config控制, gradle

android 集成扫码功能

问题描述 android 集成扫码功能 求可以集成到项目里的Zxing扫码工程 漂亮点的 急求! 网上找了一些不是自己想要的 解决方案 我有何老师家教通智能学习平台的邀请码cxhdd8 有谁知道怎么用吗? 解决方案二: 网上找一份还能用的自己改改就行了.