- 浏览: 411536 次
文章分类
- 全部博客 (327)
- Android (114)
- Java (13)
- Java基础 (14)
- Glib (2)
- linux (15)
- extjs (5)
- eclipse (2)
- Asterisk (56)
- MYSQL (6)
- 数据库 (9)
- PHP (7)
- C# (18)
- 杂谈~~ (1)
- web开发前端 (3)
- 网络编程 (2)
- Opensips (2)
- voip (3)
- debian (7)
- openfire (15)
- wordpress (1)
- 版本控制 (1)
- Android 线程服务广播 (1)
- SRTP (2)
- 单片机及ARM等 (3)
- 基础知识 (5)
- asp.net (2)
- 单片机 (1)
- 设计模式及架构 (1)
- 安全 (1)
- Cubieboard 草莓树莓各类派 Android开发板 (1)
- J2EE (2)
- BootStrap (3)
- BootStrap web前端开发 (1)
- web前端开发 (4)
- object-c (1)
- openwrt (8)
- 智能家居 (4)
- Node.js (4)
最新评论
-
xiaoxiecomeon:
你这个程序一存在线程的时间片相互抢占的问题,运行时间长了很可能 ...
Runnable 和 Thread -
dotjar:
我觉得话应该这么说:引用TestThread tt = new ...
Runnable 和 Thread -
dagf113225:
调用TelephonyManager的隐藏API是先参考Fra ...
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);
- }
- }
- }
评论
1 楼
dagf113225
2012-01-29
调用TelephonyManager的隐藏API是先参考Framework的\base\telephony\java\com\android\internal\telephony\ITelephony.aidl,然后自己实现一个ITelephony.aidl,最后在TelephonyManager中通过反射机制实例化自定义的ITelephony,实例化之后就可以调用ITelephony里面的函数了。
请指教,这步如何实现,能贴出完整的代码和工程吗?谢谢
请指教,这步如何实现,能贴出完整的代码和工程吗?谢谢
发表评论
-
直接拿来用!最火的Android开源项目整理
2015-09-16 10:13 600一、代码库 1、from 代码家 整理比较好的源 ... -
探讨android更新UI的几种方法
2014-06-09 23:27 614今天讲的内容非常简单,只是讲讲有关于android界面更新的 ... -
Android 滑动切换页面 以及屏幕手势
2014-05-08 17:49 525手机进入智能机时代,触摸屏也已成为主流之势,原来的手机按键也 ... -
android 用Achartengine 作图
2014-05-08 16:55 759Achartengine 是google的一 ... -
Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
2014-05-08 16:28 768Animation的4个基本动画效果 What is An ... -
java.lang.ClassNotFoundException: Didn't find class "android.support.v4.view.Vie
2014-05-06 14:43 2931Android错误:Caused by: java.lang ... -
Android Socket通信如何设置超时时间
2014-05-06 14:14 1078其实关于这个问题可能用到的人不会很多,不过我在这里还是说说。 ... -
【转】Android本地语音识别引擎PocketSphinx-语言建模
2014-02-13 10:35 1829Android本地语音识别引擎PocketSphinx- ... -
关于build.prop原始Dalvik虚拟机设定与调整
2013-09-05 10:40 1260原厂S3 台版 1GB Ramsystem/build.pro ... -
Android中Service与IntentService的使用比较
2013-09-04 15:24 1202该博客来自网络——— ... -
android 应用程序Activity之间数据传递与共享的几种途径
2013-08-01 17:24 9051.基于消息的通信机制 Intent ---boud ... -
android数据通信方式
2013-08-01 17:15 911http://www.itkee.com/develope ... -
“android.intent.category.DEFAULT”的目的是什么?
2013-07-31 16:43 5371、要弄清楚这个问题,首先需要弄明白什么是implicit( ... -
集成拨号盘,2句话的事情
2013-07-30 15:45 601<intent-filter> < ... -
Android TabHost动态加载内容总结
2013-07-25 17:49 953前面用继承TabActivity的方法很好的完成了,TabHo ... -
[Android实例] android json
2013-07-17 15:20 653import java.io.ByteArrayOutput ... -
android json解析及简单例子
2013-07-17 15:19 931JSON的定义: 一种轻量级的数据交换 ... -
AsyncTask的用法-UI刷新发放
2013-07-15 14:50 665在开发Android应用时必须遵守单线程模型的原则: A ... -
java.lang.OutOfMemoryError处理错误
2013-07-15 14:41 671java.lang.OutOfMemoryError异常解决 ... -
关于android.view.WindowLeaked异常的解决方案
2013-07-15 10:34 613Android.view.WindowLeaked按字面了解, ...
相关推荐
前面文章介绍了如何使用JAVA的反射机制来调用蓝牙的隐藏API,本文继续来练习JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。 先来看一下本文程序运行的效果图,如下所示: 本文程序...
本篇将深入探讨如何利用`TelephonyManager`来获取手机状态,并结合实践项目`PhoneState_Project`进行解析。 首先,我们需要了解`TelephonyManager`的基本用法。它位于`android.telephony`包下,可以通过`Context`的...
Android(安卓)应用开发技术 TelephonyManager闹铃管理器的使用案例源代码.rar Android(安卓)应用开发技术 TelephonyManager闹铃管理器的使用案例源代码.rar Android(安卓)应用开发技术 TelephonyManager闹铃...
JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。先来看看本文程序运行的效果图: 本文程序演示了以下功能: 1.所有来电自动接听; 2.所有来电自动挂断; 3.开启/关闭Radio...
#### Android提高第十篇之AudioRecord实现“助听器” AudioRecord是Android提供的录音功能类,通过它,开发者可以实现实时声音捕捉,进而构建出诸如“助听器”这样的应用。这一技术不仅展示了Android平台的音频处理...
TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在应用程序中可以使用这些get方法获取相关数据。 ...
在Android系统中,`TelephonyManager`是Android SDK提供的一个关键类,用于获取与电话通信相关的各种信息。这个类提供了许多方法,允许开发者访问手机的SIM卡状态、网络连接状态以及用户信息。在实际应用开发中,`...
在Android平台上,监听电话呼叫状态是一项重要的功能,它允许开发者获取到电话的实时状态,例如来电、通话中或挂断等。以下将详细介绍如何在Android应用中实现这一功能,包括必要的权限控制和电话状态监听。 首先,...
在Android平台上,`TelephonyManager`是Android系统提供的一个关键接口,用于获取设备的电话功能信息。`TelephonyManagerSample.zip`很可能包含了一个示例项目,教导开发者如何使用`TelephonyManager` API来获取和...
电话管理器(TelephonyManager)是Android系统中的一个重要组件,主要负责处理与手机通话功能相关的各种信息和操作。它提供了一系列API,使开发者能够获取到设备的电话状态、SIM卡信息以及网络连接等数据,从而在...
本篇文章将详细探讨`TelephonyManager`类的核心知识点,包括如何使用它来检测硬件支持、获取电话信息,以及处理各种电话状态。 1. 获取`TelephonyManager`实例: 要使用`TelephonyManager`,首先需要获取它的实例...
在Android开发中,监听来电和去电是许多应用程序的核心功能之一,尤其是在通讯应用、日志记录或企业级安全软件中。根据给定的文件信息,我们可以深入探讨如何在Android中实现这一功能,包括必要的权限设置、广播接收...
Android中的`TelephonyManager`类是系统服务的一个关键组件,它提供了访问手机通信相关状态和信息的接口。开发者可以使用这个类来获取关于手机硬件、网络状态以及SIM卡等信息。在Android应用程序中,`...
在Android开发中,TelephonyManager类是用于获取设备电话功能相关信息的重要工具。它提供了一系列方法,可以帮助开发者获取手机硬件信息,如IMEI、SIM卡信息、网络运营商等。本篇文章将详细讲解如何使用...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。在Android系统中,Java反射机制同样被广泛...理解并掌握反射机制,是成为高级Android开发者的关键技能之一。
在Android开发中,掌握如何判断网络状态、获取网络运营商以及识别网络类型是非常关键的技能,这对于构建具有网络功能的应用程序至关重要。以下将详细介绍这些知识点。 首先,**判断网络状态**是确保应用程序能够...