iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android TelephonyManager详解及实现代码
  • 950
分享到

Android TelephonyManager详解及实现代码

Android 2022-06-06 07:06:21 950人浏览 薄情痞子
摘要

JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的几项功能。先来看看本文程序运行的效果图:   本文程序演示了以下功

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

您可能感兴趣的文章:Android中TelephonyManager用法实例Android中TelephonyManager类的用法案例详解Android中TelephonyManager类的方法实例分析Android提高之TelephonyManager功能探秘Android 应用更换皮肤实现方法安卓(Android)开发之统计App启动时间Android如何自定义按钮效果Android GPS详解及示例代码


--结束END--

本文标题: Android TelephonyManager详解及实现代码

本文链接: https://www.lsjlt.com/news/24359.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android ViewPagerIndicator详解及实例代码
    Android ViewPagerIndicator详解及实例代码关于自定义View的属性零碎知识自定义View和自定义属性的知识不再此提及,这里着重说的是属性在自定义View中的获取方式,自定义的属性如下:<?xml ver...
    99+
    2023-05-31
    android viewpagerindicator age
  • java 实现汉诺塔详解及实现代码
    java 实现汉诺塔详解及实现代码汉诺塔问题:有三根柱子A,B,C,其中A上面有n个圆盘,从上至下圆盘逐渐增大,每次只能移动一个圆盘,并且规定大的圆盘不能叠放在小的圆盘上面,现在想要把A上面的n个圆盘全部都移动到C上面,输出移动的总步数以及...
    99+
    2023-05-31
    java 汉诺塔 ava
  • java 汉诺塔详解及实现代码
    java 汉诺塔详解及实现代码实现效果图打印的方法在 moveTheTopOne() 方法中被调用,调用该方法前打印出移动的方向--从X号塔往Y号塔汉诺塔要求:将第一座塔上的所有盘子,借助第二座塔,全部搬运到第三座塔上。规则:一次只能搬运一...
    99+
    2023-05-31
    汉诺塔 java ava
  • Transformer模型入门详解及代码实现
    目录 前言 一.什么是Transformer 二.Encoder的组成 1.输入部分 2.注意力机制 2.1注意力机制的含义 2.2在TRM中的实现 3.前馈神经网络 3.1 前馈神经网络,BP算法,BP神经网络的区别: 3.2Encode...
    99+
    2023-10-18
    transformer 深度学习 人工智能 nlp python
  • 线段树详解以及C++实现代码
    目录应用场景算法思想查询操作修改操作算法实现建树查询修改总结应用场景 假设有这样的问题:有n个数,m次操作,操作分为:修改某一个数或者查询一段区间的值 分析下,如果针对数组元素的修改...
    99+
    2024-04-02
  • android长截屏原理及实现代码
    小米系统自带的长截屏应该很多人都用过,效果不错。当长截屏时listview就会自动滚动,当按下停止截屏时,就会得到一张完整的截屏。该篇就介绍一下长截屏的原理上篇中介绍了android屏幕共享实现方式,该篇的原理和上一篇基本一致。获取view...
    99+
    2023-05-30
    android 长截屏 roi
  • 详解B+树的原理及实现Python代码
    B+树是自平衡树的高级形式,其中所有值都存在于叶级中。B+树所有叶子都处于同一水平,每个节点的子节点数量≥2。B+树与B树的区别是各节点在B树上不是相互连接,而在B+树上是相互连接的。 B+树多级索引结构图 B+树搜索规则 1、从...
    99+
    2024-01-24
    B树的概念
  • MyBatisPlus代码生成器的原理及实现详解
    目录一、代码生成器原理分析二、代码生成器实现一、代码生成器原理分析 我们在观察之前写的代码的时候,会发现很多重复的内容。  一个Book模板,,只需要把红色部分的内容全部...
    99+
    2022-11-13
    MyBatisPlus代码生成器原理 MyBatisPlus代码生成器实现 MyBatisPlus 代码生成器
  • Android 带logo的二维码详解及实例
    Android 带logo的二维码详解及实例好久没有写博客了,快元旦了公司的事情也不是很多,刚好和朋友一起出去玩玩,朋友是搞PHP的说到了每天在公司都是搞些什么二维码和微信支付的相关东西,因为上班的时间不忙,所以随便来搞下。二维码(Quic...
    99+
    2023-05-31
    android logo 二维码
  • Android空心圆及层叠效果实现代码
    本文实例为大家分享了Android空心圆及层叠效果的具体代码,供大家参考,具体内容如下package com.bwei.test.zidingyiview2;import android.content.Context;import and...
    99+
    2023-05-30
    android 空心圆 层叠
  • Android实现webview实例代码
    webview是一个很简单的功能,代码没有什么逻辑上的难度,只是需要注意权限上的问题。其实在安卓编程的过程当中,权限问题可以算是出现的比较多的BUG。MainActpackage com.lxq.webview01;import andro...
    99+
    2023-05-31
    android webview roi
  • C语言超详细讲解栈的实现及代码
    目录前言栈的概念栈的结构栈的实现创建栈结构初始化栈销毁栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空总代码Stack.h 文件Stack.c 文件Test.c 文件前言 栈...
    99+
    2024-04-02
  • GoLangchannel底层代码实现详解
    目录1.channel 简介2.channel 内部结构3.创建channel4.发送数据5.接收数据6.关闭channel7.总结1.channel 简介 Go语言有个很出名的话是...
    99+
    2024-04-02
  • Swift实现代码混淆详解
    目录1. 新建相关文件2. 导入文件至项目3. 修改项目配置3.1 修改TARGETS配置3.2 修改指令文件3.2.1 打开confuse.sh文件,复制并粘贴一下文本3.2.2 ...
    99+
    2024-04-02
  • Java中IO流解析及代码实例详解
    目录1、IO流1.流和流的分类什么是IO流?IO流的分类?java.io包下需要掌握的流有16个:2.如何使用流1、输入流(读文件):FileInputStream2、输出流(写文件...
    99+
    2024-04-02
  • Android Studio实现仿微信APP门户界面详解及源码
    目录前言界面分析界面动态实现代码静态界面实现总结前言 你好! 本文章主要介绍如何用Android Studio制作简易的门户界面,主要说明框架的各部分功能与实现过程,结尾处附有源码。...
    99+
    2024-04-02
  • python静态web服务器实现方法及代码详解
    1、编写TCP服务器程序。 2、获取浏览器发送的http请求消息数据。 3、读取固定的页面数据,将页面数据组装成HTTP响应消息数据并发送给浏览器。 4、HTTP响应报文数据发送完成...
    99+
    2022-11-21
    python 静态 web服务器
  • C语言超详细讲解队列的实现及代码
    目录前言队列的概念队列的结构队列的应用场景队列的实现创建队列结构队列初始化  队列销毁  入队列  出队列  队列判空  获取队列元...
    99+
    2024-04-02
  • Android ViewFlipper的详解及实例
    Android ViewFlipper的详解前言:View Flipper,是ViewAnimator的子类,而ViewAnimator又是继承自FrameLayout,而FrameLayout就是平时基本上只显示一个子视图的布局,由于Fr...
    99+
    2023-05-30
    android viewflipper pp
  • Android WebView的详解及实例
    Android WebView的详解      Android WebView在android平台上是一个特殊的View, 他能用来显示网页,这个类可以被用来在你的app中仅仅显示一张在线的...
    99+
    2023-05-30
    android webview roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作