Android TelephonyManager详解及实现代码

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

XML/HTML代码:

<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 TelephonyManager的介绍和简单示例,希望能帮助有需要的同学,谢谢大家对本站的支持!

(0)

相关推荐

  • Android中TelephonyManager类的用法案例详解

    本文以案例形式分析了Android中TelephonyManager类的用法.分享给大家供大家参考.具体如下: 目录结构: main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="ve

  • Android 应用更换皮肤实现方法

    Android应用更换皮肤功能的实现思路   我们可以将皮肤包做成一个apk文件,在应用apk中读取皮肤包中的数据.   应用apk读取皮肤包apk的数据的条件 1. 有相同签名 2. AndroidManifest.xml中配置android:sharedUserId有相同的属性值 满足以上条件,两个apk就能互相访问数据了.      Android应用更换皮肤功能的实现步骤 1.应用程序和皮肤程序的AndroidManifest.xml中配置 XML/HTML代码 android:shar

  • 安卓(Android)开发之统计App启动时间

    前言 作为 Android 开发者,想必多多少少要接触启动速度优化相关的事情,当用户越来越多,产品的功能也随着迭代越来越多,App 逐渐变得臃肿是一件很常见的现象,甚至可以说是不可避免的现象,随之而来的工作就是优化 App 性能,其中最主要的一项就是启动速度优化.但本文的主角并不是启动速度优化,而是启动时间统计. 一.启动类型 工欲善其事,必先利其器.想要优化 App 的启动速度,必须有准确衡量启动时间的方法,否则优化完之后效果怎样,自己都不知道,说出去别人也不信服不是.在做 App 启动时间统

  • Android提高之TelephonyManager功能探秘

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

  • Android GPS详解及示例代码

    LBS(Location Based Services)直译的话就是基于地理位置的服务,这里面至少有两层意思,第一要能轻易的获取当前的地理位置,譬如经纬度海拔等,另一个就是在当前位置的基础上提供增值服务,譬如找附近的加油站.餐馆.酒店等.这里面的第一步:获取用户当前位置,我们就可以用Android的GPS定位服务来得到.Android提供了基于网络的定位服务和基于卫星的定位服务两种.在设置->位置和安全设置里面的前三项就是,最后一个增强型GPS是为了辅助快速找卫星的. 那么我们现在就写一个简单的

  • Android中TelephonyManager类的方法实例分析

    本文实例讲述了Android中TelephonyManager类的方法.分享给大家供大家参考.具体如下: TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取相关数据. TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法来获得,需要注意的是有些通讯

  • Android中TelephonyManager用法实例

    本文实例讲述了Android中TelephonyManager用法.分享给大家供大家参考,具体如下: 一.概述: TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取相关数据. TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法来获得,需要注意的是

  • Android如何自定义按钮效果

    安卓原生的按钮是多么丑,效果是多么单调,大家也是有目共睹的. 要做一个APP少不了使用按钮,一个好看的按钮少不了好看的效果和外表,这次主要跟大家讲讲如何用drawable的xml文件弄一些好看的自定义样式. 首先是外表 在APP中四四方方,灰色底黑色字的按钮是很难看的,我们希望看到的是圆角,彩色,白字(根据你的个人审美也可以是其他样式). 首先是在layout里新建一个按钮 ,然后在drawable文件夹里新建一个drawable resource file ,不妨起名为shape ,加一个se

  • Android TelephonyManager详解及实现代码

    JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能.先来看看本文程序运行的效果图: 本文程序演示了以下功能: 1.所有来电自动接听:        2.所有来电自动挂断:        3.开启/关闭Radio:        4.开启/关闭数据连接(WAP or NET的连接). 调用TelephonyManager的隐藏API是先参考Framework的/base/telephony/java/com/android/internal/

  • Android Dialog详解及实例代码

     Android Dialog详解及实例代码 概述: Android开发中最常用的就是Dialog类,除了自定义dialog布局,最多的就是用在弹出对话框.进度条.输入框.单选.复选框. 1.选择对话框: AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle("选择对话框"); dialog.setMessage("请选择确认或取消"); dialog.setCance

  • Android ViewPagerIndicator详解及实例代码

    Android ViewPagerIndicator详解及实例代码 关于自定义View的属性零碎知识 自定义View和自定义属性的知识不再此提及,这里着重说的是属性在自定义View中的获取方式,自定义的属性如下: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Wisely"> <attr name=&

  • Android CoordinatorLayout详解及实例代码

    Android CoordinatorLayout详解 一.CoordinatorLayout有什么作用 CoordinatorLayout作为"super-powered FrameLayout"基本实现两个功能: 1.作为顶层布局 2.调度协调子布局 CoordinatorLayout使用新的思路通过协调调度子布局的形式实现触摸影响布局的形式产生动画效果.CoordinatorLayout通过设置子View的 Behaviors来调度子View.系统(Support V7)提供了A

  • Android ToggleButton 详解及实例代码

    Android ToggleButton 详解 在Android的开发过程中,对于ToggleButton的使用频率也是相当的高的,下面我就来说一下,这个组件的两种使用方式. 第一种是简单的使用,利用Toast的方式弹出提示语句 需要注意的是要想自定义ToggleButton的显示的内容,就需要设置其TextOn和TextOff的内容. <ToggleButton android:id="@+id/toggleButton1" android:layout_width="

  • Android Service详解及示例代码

    Android Service 详细介绍: 1.Service的概念 2.Service的生命周期 3.实例:控制音乐播放的Service 一.Service的概念 Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件. 二.Service的生命周期 Service对象不能自己启动,需要通过某个Activity.Service或者其他Context对象来启动.启动的方法有两种,Context.startS

  • Android SQLite详解及示例代码

    在Android中使用SQLite数据库的入门指南,打算分下面几部分与大家一起分享, 1.什么是SQLite 2.Android中使用SQLite 一.什么是SQLite SQLite是一款开源的.轻量级的.嵌入式的.关系型数据库.它在2000年由D. Richard Hipp发布,可以支援Java.Net.PHP.Ruby.Python.Perl.C等几乎所有的现代编程语言,支持Windows.Linux.Unix.Mac OS.Android.IOS等几乎所有的主流操作系统平台. SQLit

  • Android Menu详解及示例代码

    Android Menu 详细介绍: 1.选项菜单 OptionsMenu 2.上下文菜单 ContextMenu 3.子菜单 SubMenu 组成Android用户界面的除了View以外,还有菜单和对话框,这一讲我们就共同学习一下菜单的使用. 菜单是用户界面中最常见的元素,使用也非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu),下面分别举例说明. 一.选项菜单 OptionsMenu Andro

  • Android EditText详解及示例代码

       EditText在API中的结构 java.lang.Object android.view.View android.widget.TextView android.widget.EditText 已知直接子类: AutoCompleteTextView, ExtractEditText 已知间接子类: MultiAutoCompleteTextView EditText是TextView的直接子类 所以EditText会继承父类TextView的一些方法.下面我用自己写的一个Demo

随机推荐