- 浏览: 398968 次
文章分类
- 全部博客 (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 576一、代码库 1、from 代码家 整理比较好的源 ... -
探讨android更新UI的几种方法
2014-06-09 23:27 593今天讲的内容非常简单,只是讲讲有关于android界面更新的 ... -
Android 滑动切换页面 以及屏幕手势
2014-05-08 17:49 491手机进入智能机时代,触摸屏也已成为主流之势,原来的手机按键也 ... -
android 用Achartengine 作图
2014-05-08 16:55 721Achartengine 是google的一 ... -
Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
2014-05-08 16:28 727Animation的4个基本动画效果 What is An ... -
java.lang.ClassNotFoundException: Didn't find class "android.support.v4.view.Vie
2014-05-06 14:43 2881Android错误:Caused by: java.lang ... -
Android Socket通信如何设置超时时间
2014-05-06 14:14 1028其实关于这个问题可能用到的人不会很多,不过我在这里还是说说。 ... -
【转】Android本地语音识别引擎PocketSphinx-语言建模
2014-02-13 10:35 1773Android本地语音识别引擎PocketSphinx- ... -
关于build.prop原始Dalvik虚拟机设定与调整
2013-09-05 10:40 1236原厂S3 台版 1GB Ramsystem/build.pro ... -
Android中Service与IntentService的使用比较
2013-09-04 15:24 1165该博客来自网络——— ... -
android 应用程序Activity之间数据传递与共享的几种途径
2013-08-01 17:24 8871.基于消息的通信机制 Intent ---boud ... -
android数据通信方式
2013-08-01 17:15 882http://www.itkee.com/develope ... -
“android.intent.category.DEFAULT”的目的是什么?
2013-07-31 16:43 5171、要弄清楚这个问题,首先需要弄明白什么是implicit( ... -
集成拨号盘,2句话的事情
2013-07-30 15:45 582<intent-filter> < ... -
Android TabHost动态加载内容总结
2013-07-25 17:49 934前面用继承TabActivity的方法很好的完成了,TabHo ... -
[Android实例] android json
2013-07-17 15:20 632import java.io.ByteArrayOutput ... -
android json解析及简单例子
2013-07-17 15:19 903JSON的定义: 一种轻量级的数据交换 ... -
AsyncTask的用法-UI刷新发放
2013-07-15 14:50 644在开发Android应用时必须遵守单线程模型的原则: A ... -
java.lang.OutOfMemoryError处理错误
2013-07-15 14:41 640java.lang.OutOfMemoryError异常解决 ... -
关于android.view.WindowLeaked异常的解决方案
2013-07-15 10:34 591Android.view.WindowLeaked按字面了解, ...
相关推荐
前面文章介绍了如何使用JAVA的反射机制来调用蓝牙的隐藏API,本文继续来练习JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。 先来看一下本文程序运行的效果图,如下所示: 本文程序...
Android(安卓)应用开发技术 TelephonyManager闹铃管理器的使用案例源代码.rar Android(安卓)应用开发技术 TelephonyManager闹铃管理器的使用案例源代码.rar Android(安卓)应用开发技术 TelephonyManager闹铃...
JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。先来看看本文程序运行的效果图: 本文程序演示了以下功能: 1.所有来电自动接听; 2.所有来电自动挂断; 3.开启/关闭Radio...
TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在应用程序中可以使用这些get方法获取相关数据。 ...
NULL 博文链接:https://luckfox.iteye.com/blog/1019587
主要介绍了Android中TelephonyManager用法,结合实例形式分析了TelephonyManager类的功能,使用技巧与相关注意事项,需要的朋友可以参考下
电话管理器(TelephonyManager)
TelephonyManager类使用方法大全TelephonyManager类使用方法大全
主要介绍了Android中TelephonyManager类的方法,以实例形式较为详细的分析了Android基于TelephonyManager类获取手机各种常用信息的相关技巧,需要的朋友可以参考下
主要介绍了Android中TelephonyManager类的用法,以获取Android手机硬件信息为例详细分析了TelephonyManager类的使用技巧,需要的朋友可以参考下
主要介绍了Android实现监听电话呼叫状态的方法,涉及Android权限控制及电话状态监听的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
详细解析java的反射机制
1.在telephonymanager/src/main/AndroidManifest.xml中添加如下代码; 2.运行程序后,在虚拟机上打开 设置–>应用和通知–>搜索我们正在运行的应用程序–>权限–>将存储空间和麦克风权限设置为开启;(具体操作如...
获取SIM卡信息: Android:基于TelephonyManager iOS:基于CoreTelephony
Android 通过开启后台的服务达到监听来电和去电 源码
源码参考,欢迎下载