1. 添加权限
  2. <uses-permission android:name="android.permission.CALL_PHONE"/>
  3. <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
  4.  
  5. main.xml
  6. <?xml version="1.0" encoding="utf-8"?>
  7. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  8. androidrientation="vertical" android:layout_width="fill_parent"
  9. android:layout_height="fill_parent">
  10. <RadioGroup android:layout_height="wrap_content"
  11. android:layout_width="fill_parent" android:id="@+id/rGrpSelect">
  12. <RadioButton android:layout_height="wrap_content"
  13. android:layout_width="fill_parent" android:id="@+id/rbtnAutoAccept"
  14. android:text="所有来电自动接听"></RadioButton>
  15. <RadioButton android:layout_height="wrap_content"
  16. android:layout_width="fill_parent" android:id="@+id/rbtnAutoReject"
  17. android:text="所有来电自动挂断"></RadioButton>
  18. </RadioGroup>
  19. <ToggleButton android:layout_height="wrap_content"
  20. android:layout_width="fill_parent" android:id="@+id/tbtnRadioSwitch"
  21. android:textOn="Radio已经启动" android:textOff="Radio已经关闭"
  22. android:textSize="24dip" android:textStyle="normal"></ToggleButton>
  23. <ToggleButton android:layout_height="wrap_content"
  24. android:layout_width="fill_parent" android:id="@+id/tbtnDataConn"
  25. android:textSize="24dip" android:textStyle="normal" android:textOn="允许数据连接"
  26. android:textOff="禁止数据连接"></ToggleButton>
  27. </LinearLayout>
  28.  
  29. PhoneUtils.java是手机功能类,从TelephonyManager中实例化ITelephony并返回,源码如下:
  30. package com.testTelephony;
  31.  
  32. import java.lang.reflect.Field;
  33. import java.lang.reflect.Method;
  34. import com.android.internal.telephony.ITelephony;
  35. import android.telephony.TelephonyManager;
  36. import android.util.Log;
  37.  
  38. public class PhoneUtils {
  39. /**
  40. * 从TelephonyManager中实例化ITelephony,并返回
  41. */
  42. static public ITelephony getITelephony(TelephonyManager telMgr) throws Exception {
  43. Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod("getITelephony");
  44. getITelephonyMethod.setAccessible(true);//私有化函数也能使用
  45. return (ITelephony)getITelephonyMethod.invoke(telMgr);
  46. }
  47.  
  48. static public void printAllInform(Class clsShow) {
  49. try {
  50. // 取得所有方法
  51. Method[] hideMethod = clsShow.getDeclaredMethods();
  52. int i = 0;
  53. for (; i < hideMethod.length; i++) {
  54. Log.e("method name", hideMethod.getName());
  55. }
  56. // 取得所有常量
  57. Field[] allFields = clsShow.getFields();
  58. for (i = 0; i < allFields.length; i++) {
  59. Log.e("Field name", allFields.getName());
  60. }
  61. } catch (SecurityException e) {
  62. // throw new RuntimeException(e.getMessage());
  63. e.printStackTrace();
  64. } catch (IllegalArgumentException e) {
  65. // throw new RuntimeException(e.getMessage());
  66. e.printStackTrace();
  67. } catch (Exception e) {
  68. // TODO Auto-generated catch block
  69. e.printStackTrace();
  70. }
  71. }
  72. }
  73. testTelephony.java是主类,使用PhoneStateListener监听通话状态,以及实现上述4种电话控制功能,源码如下:
  74. package com.testTelephony;
  75.  
  76. import android.app.Activity;
  77. import android.os.Bundle;
  78. import android.telephony.PhoneStateListener;
  79. import android.telephony.TelephonyManager;
  80. import android.util.Log;
  81. import android.view.View;
  82. import android.widget.RadioGroup;
  83. import android.widget.ToggleButton;
  84.  
  85. public class testTelephony extends Activity {
  86. /** Called when the activity is first created. */
  87. RadioGroup rg;//来电操作单选框
  88. ToggleButton tbtnRadioSwitch;//Radio开关
  89. ToggleButton tbtnDataConn;//数据连接的开关
  90. TelephonyManager telMgr;
  91. CallStateListener stateListner;
  92. int checkedId=0;
  93. @Override
  94. public void onCreate(Bundle savedInstanceState) {
  95. super.onCreate(savedInstanceState);
  96. setContentView(R.layout.main);
  97.  
  98. telMgr= (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
  99. telMgr.listen(new CallStateListener(), CallStateListener.LISTEN_CALL_STATE);
  100.  
  101. PhoneUtils.printAllInform(TelephonyManager.class);
  102.  
  103. rg = (RadioGroup)findViewById(R.id.rGrpSelect);
  104. rg.setOnCheckedChangeListener(new CheckEvent());
  105. tbtnRadioSwitch=(ToggleButton)this.findViewById(R.id.tbtnRadioSwitch);
  106. tbtnRadioSwitch.setOnClickListener(new ClickEvent());
  107. try {
  108. tbtnRadioSwitch.setChecked(PhoneUtils.getITelephony(telMgr).isRadioOn());
  109. } catch (Exception e) {
  110. Log.e("error",e.getMessage());
  111. }
  112. tbtnDataConn=(ToggleButton)this.findViewById(R.id.tbtnDataConn);
  113. tbtnDataConn.setOnClickListener(new ClickEvent());
  114. try {
  115. tbtnDataConn.setChecked(PhoneUtils.getITelephony(telMgr).isDataConnectivityPossible());
  116. } catch (Exception e) {
  117. Log.e("error",e.getMessage());
  118. }
  119. }
  120.  
  121. /**
  122. * 来电时的操作
  123. * @author GV
  124. *
  125. */
  126. public class CheckEvent implements RadioGroup.OnCheckedChangeListener{
  127.  
  128. @Override
  129. public void onCheckedChanged(RadioGroup group, int checkedId) {
  130. testTelephony.this.checkedId=checkedId;
  131. }
  132. }
  133.  
  134. /**
  135. * Radio和数据连接的开关
  136. * @author GV
  137. *
  138. */
  139. public class ClickEvent implements View.OnClickListener{
  140.  
  141. @Override
  142. public void onClick(View v) {
  143. if (v == tbtnRadioSwitch) {
  144. try {
  145. PhoneUtils.getITelephony(telMgr).setRadio(tbtnRadioSwitch.isChecked());
  146. } catch (Exception e) {
  147. Log.e("error", e.getMessage());
  148. }
  149. }
  150. else if(v==tbtnDataConn){
  151. try {
  152. if(tbtnDataConn.isChecked())
  153. PhoneUtils.getITelephony(telMgr).enableDataConnectivity();
  154. else if(!tbtnDataConn.isChecked())
  155. PhoneUtils.getITelephony(telMgr).disableDataConnectivity();
  156. } catch (Exception e) {
  157. Log.e("error", e.getMessage());
  158. }
  159. }
  160. }
  161. }
  162.  
  163. /**
  164. * 监视电话状态
  165. * @author GV
  166. *
  167. */
  168. public class CallStateListener extends PhoneStateListener {
  169. @Override
  170. public void onCallStateChanged(int state, String incomingNumber) {
  171. if(state==TelephonyManager.CALL_STATE_IDLE)//挂断
  172. {
  173. Log.e("IDLE",incomingNumber);
  174. }
  175. else if(state==TelephonyManager.CALL_STATE_OFFHOOK)//接听
  176. {
  177. Log.e("OFFHOOK",incomingNumber);
  178. }
  179. else if(state==TelephonyManager.CALL_STATE_RINGING)//来电
  180. {
  181. if(testTelephony.this.checkedId==R.id.rbtnAutoAccept)
  182. {
  183. try {
  184. //需要<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
  185. PhoneUtils.getITelephony(telMgr).silenceRinger();//静铃
  186. PhoneUtils.getITelephony(telMgr).answerRingingCall();//自动接听
  187.  
  188. } catch (Exception e) {
  189. Log.e("error",e.getMessage());
  190. }
  191. }
  192. else if(testTelephony.this.checkedId==R.id.rbtnAutoReject)
  193. {
  194. try {
  195. PhoneUtils.getITelephony(telMgr).endCall();//挂断
  196. PhoneUtils.getITelephony(telMgr).cancelMissedCallsNotification();//取消未接显示
  197. } catch (Exception e) {
  198. Log.e("error",e.getMessage());
  199. }
  200. }
  201. }
  202. super.onCallStateChanged(state, incomingNumber);
  203. }
  204. }
  205. }

Android 实现自动接听和挂断电话功能的更多相关文章

  1. android 自动拨打电话 挂断电话代码

    页面布局文件代码  (  res下面的layout下面的activity_main.xml代码 ) <RelativeLayout xmlns:android="http://sche ...

  2. Android自动接听&挂断电话(包含怎么应对4.1以上版本的权限检

    一  前言 这两天要研究类似白名单黑名单以及手势自动接听的一些功能,所以呢,自然而然的涉及到怎么自动接听/挂断电话的功能了.对于自动接听这一块,android4.1版本及其以上的版本和之前的版本处理逻 ...

  3. Android之——自己主动挂断电话的实现

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47072451 通过<Android之--AIDL小结>与<And ...

  4. android 接听和挂断实现方式

    参考:android 来电接听和挂断 支持目前所有版本 注意:android2.3版本及以上不支持下面的自动接听方法. (会抛异常:java.lang.SecurityException: Neith ...

  5. Android 电话自己主动接听和挂断具体解释

    1.通过aidl及反射实现挂断电话 详细分三步: (1)ITelephony.aidl ,必须新建com.android.internal.telephony包并放入ITelephony.aidl文件 ...

  6. Android接听、挂断电话

    新建一个名为ITelephony的aidl文件,注意包名不能改变,因为是通过反射方式来实现接听和挂断的

  7. eclipse下Android无法自动生成apk文件怎么办?

    eclipse下Android无法自动生成apk文件怎么办? 现象:创建android工程后,通过手动build/clean或自动build均无法在bin文件夹下生成.apk文件 解决方法:进入win ...

  8. Android:TextView 自动滚动(跑马灯) (转)

    Android:TextView 自动滚动(跑马灯)       TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true ...

  9. Android 源代码自动编译packages/apps

    /*************************************************************************** * Android 源代码自动编译packag ...

随机推荐

  1. 解决android.os.NetworkOnMainThreadException

    好久不写Android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误Caused by: android.os.NetworkOnMainThreadExc ...

  2. Shell Scipt 命令行带参数,输出log

    命令行带参数,以及字符串参数放到ssh命令里可以这么放: #!/bin/bash        这行保证运行bash可以这样: ./data.sh if [ $# != 4 ]; then echo ...

  3. Linux_系统信息

    公司里一些仿真软件得进Linux系统,好奇公司用的什么Linux版本,于是搜罗了几个命令如下: 1  uname - Print system info -a, print all info -s, ...

  4. Linux网卡启动报错(this device is not active)

    重启网络服务 service network restart   报如下错误:   shutting down interface eth0: error:device "eth0" ...

  5. [WebService]之DTD

    文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构.  DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用. <?xml version=& ...

  6. Java基础 —— CSS

    CSS:层叠样式表(Cascading Style Sheets) --> 提高显示功能,定义样式 html提供了div与span,只为了封装文本数据,div为一行数据,span为行内的数据. ...

  7. 轻松学习Linux之理解Shell的硬链接与软连接

     大家在学习linux的过程中常常遇到一些模糊且容易混淆的概念比如什么是硬链接和软链接,他们有什么区别?  软连接有点象windows中的快捷方式,连接和目标文件具有相同的节点,而硬连接就好象重新复制 ...

  8. Cloud_panel

    传统基础架构应用程序的系统架构师,云计算应用程序的设计确实是相当有挑战性的工作.体现在应用程序架构师首先要了解云计算环境和传统基础架构的差异并且充分利用云计算平台的一些特点来更好的满足用户需求. 对于 ...

  9. Test log4net

    protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGloba ...

  10. 三、 将DataTable 转换为List

    1. 方法public static IList<T> ConvertTo<T>(DataTable table) { if (table == null) { return ...