栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android提高之TelephonyManager功能探秘

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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添加以下两行代码,以获得权限:




main.xml源码如下:



 
 
 
 
 
 


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 {
 
 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 {
  
 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());
 }
 }
 
 public class CheckEvent implements RadioGroup.OnCheckedChangeListener{

 @Override
 public void onCheckedChanged(RadioGroup group, int checkedId) {
  testTelephony.this.checkedId=checkedId;
 }
 }
 
 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());
  } 
  }
 }
 }
 
 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 {
   //需要 
   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项目开发有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/164528.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号