热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

AndroidTelephonyManager详解及实现代码

本文主要介绍AndroidTelephonyManager,这里整理了关于AndroidTelephoneManager的相关资料,并附有示例代码和实现效果图,有需要的朋友可以参考下

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代码:

 
 

  main.xml源码如下:

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
   
     
     
   
   
   
 

 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 

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


推荐阅读
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • LoadRunner中的IP欺骗配置与实践
    为了确保服务器能够有效地区分不同的用户请求,避免多人使用同一IP地址造成的访问限制,可以通过配置IP欺骗来解决这一问题。本文将详细介绍IP欺骗的工作原理及其在LoadRunner中的具体配置步骤。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文概述了在GNU/Linux系统中,动态库在链接和运行阶段的搜索路径及其指定方法,包括通过编译时参数、环境变量及系统配置文件等方式来控制动态库的查找路径。 ... [详细]
  • 本文介绍如何使用 Python 计算两个时间戳之间的时间差,并将其转换为毫秒。示例代码展示了如何通过 `time` 和 `datetime` 模块实现这一功能。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 使用REM和媒体查询实现响应式布局
    本文介绍如何利用REM单位和媒体查询(Media Queries)来创建适应不同屏幕尺寸的网页布局。通过具体示例,展示在不同屏幕宽度下如何调整页面元素的样式。 ... [详细]
  • 本文介绍了一种在 Android 开发中动态修改 strings.xml 文件中字符串值的有效方法。通过使用占位符,开发者可以在运行时根据需要填充具体的值,从而提高应用的灵活性和可维护性。 ... [详细]
  • 神策数据分析基础
    本文介绍了基于用户行为的数据分析方法,包括业务问题的提出与定义、具体行为的识别及统计分析流程。同时,详细阐述了如何利用事件模型(Event Model)来描述用户行为,以及在实际应用中的案例分析。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
  • 本文列举了构建和运行 Struts2 应用程序所需的核心 JAR 文件,包括文件上传、日志记录、模板引擎等关键组件。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文介绍了用户界面(User Interface, UI)的基本概念,以及在iOS应用程序中UIView及其子类的重要性和使用方式。文章详细探讨了UIView如何作为用户交互的核心组件,以及它与其他UI控件和业务逻辑的关系。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
author-avatar
yangyue627595
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有