因为Android2.3以上增加了对permission  android.permission.MODIFY_PHONE_STATE 的限制,2.3之前的通过反射机制调用ITelephone的能力的做法已经不适用,所以可以用伪造广播的方式来接听电话

package com.demo.launcher;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.net.Uri;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.KeyEvent;public class PhoneUtils {public static String TAG = PhoneUtils.class.getSimpleName();public static void endCall(Context context) {try {Object telephonyObject = getTelephonyObject(context);if (null != telephonyObject) {Class telephonyClass = telephonyObject.getClass();Method endCallMethod = telephonyClass.getMethod("endCall");endCallMethod.setAccessible(true);endCallMethod.invoke(telephonyObject);}} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}private static Object getTelephonyObject(Context context) {Object telephonyObject = null;try {// 初始化iTelephonyTelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);// Will be used to invoke hidden methods with reflection// Get the current object implementing ITelephony interfaceClass telManager = telephonyManager.getClass();Method getITelephony = telManager.getDeclaredMethod("getITelephony");getITelephony.setAccessible(true);telephonyObject = getITelephony.invoke(telephonyManager);} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return telephonyObject;}/*** 通过反射调用的方法,接听电话,该方法只在android 2.3之前的系统上有效。* @param context*/private static void answerRingingCallWithReflect(Context context) {try {Object telephonyObject = getTelephonyObject(context);if (null != telephonyObject) {Class telephonyClass = telephonyObject.getClass();Method endCallMethod = telephonyClass.getMethod("answerRingingCall");endCallMethod.setAccessible(true);endCallMethod.invoke(telephonyObject);// ITelephony iTelephony = (ITelephony) telephonyObject;// iTelephony.answerRingingCall();}} catch (SecurityException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}}/*** 伪造一个有线耳机插入,并按接听键的广播,让系统开始接听电话。* @param context*/private static void answerRingingCallWithBroadcast(Context context){AudioManager localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);//判断是否插上了耳机boolean isWiredHeadsetOn = localAudioManager.isWiredHeadsetOn();if (!isWiredHeadsetOn) {Intent headsetPluggedIntent = new Intent(Intent.ACTION_HEADSET_PLUG);headsetPluggedIntent.putExtra("state", 1);headsetPluggedIntent.putExtra("microphone", 0);headsetPluggedIntent.putExtra("name", "");context.sendBroadcast(headsetPluggedIntent);Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent);context.sendOrderedBroadcast(meidaButtonIntent, null);Intent headsetUnpluggedIntent = new Intent(Intent.ACTION_HEADSET_PLUG);headsetUnpluggedIntent.putExtra("state", 0);headsetUnpluggedIntent.putExtra("microphone", 0);headsetUnpluggedIntent.putExtra("name", "");context.sendBroadcast(headsetUnpluggedIntent);} else {Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent);context.sendOrderedBroadcast(meidaButtonIntent, null);}}/*** * @param context*/public static void answerRingingCall(Context context) {if (BaseActivity.isGingerbreadOrlater()) {answerRingingCallWithBroadcast(context);} else {answerRingingCallWithReflect(context);}}/*** * @param context* @param phoneNumber*/public static void callPhone(Context context, String phoneNumber) {if(!TextUtils.isEmpty(phoneNumber)){try {Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ phoneNumber));context.startActivity(callIntent);} catch (Exception e) {e.printStackTrace();}}}/*** * @param context* @param phoneNumber*/public static void dialPhone(Context context, String phoneNumber){if(!TextUtils.isEmpty(phoneNumber)){try {Intent callIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+ phoneNumber));context.startActivity(callIntent);} catch (Exception e) {e.printStackTrace();}}}}

Android电话相关的操作 - 打电话,接电话,挂电话相关推荐

  1. pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话(补充效果录像图)

    pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话 经过几年的沉淀,我们已经将整个这个需求背景的架构与解决方案进行了高级的研发,将在下一个文档中进行概述. 电脑通过网页通过控制usb的安卓手 ...

  2. android电话、短信黑白名单拦截、电话录音

    功能描述: 总的来说这是一个防骚扰的应用,设置黑名单,白名单,通话录音名单.添加到黑名单的联系人或号码将被拒绝来电或短信:添加到白名单的联系人或号码将通过来电或短信(除白名单以外的号码将被拒绝来电或短 ...

  3. adb应用之打电话,挂电话

    打电话: 1. adb shell service call phone 2 s16 "10086" 2. adb shell am start -a android.intent ...

  4. android hook电话,Android之拨打接挂电话功能实现

    手机是现代人们必不可少的工具之一,而使用得最多的就是拨打电话接听电话,本文通过一个简单的例子实现这个功能. 首先,加入我们的电话处理类 PhoneUtil.java package com.sl.ca ...

  5. android自动回复退订,Android实现短信自动回复,挂电话

    原标题:Android实现短信自动回复,挂电话 简单功能,配置一下ITelephoney,ITelephony这个接口不能直接用的. 需要先在src下新建包com.android.internal.t ...

  6. Android入门篇(四):自动拨打电话、手动拨打电话

    Android入门篇(四):自动拨打电话.手动拨打电话 一.前言 最近在做的项目需要用到自动拨号的这一功能,17年写了一个,最近拿出来用发现不能使用了,后面查资料据说是因为Android 6(api2 ...

  7. android 实现挂电话和接电话

    代码下载见:http://download.csdn.net/source/3477225 在src文件夹下创建包com.android.internal.telephony,在包下建一个文件ITel ...

  8. Android 电话的反射调用机制实现自动接听电话

    最近在看一些有关反射和aidl远程服务控制的类,自己也小写了这么一个Android 电话的反射调用机制实现静默接听电话demo 自己总结出来,以供查阅,若是还有其他问题,希望大家指出. 首先要调用系统 ...

  9. Android 用代码实现防打扰【能够屏蔽电话和短信】

    Android 实现电话和短信拦截的功能如下: 1.实现广播接口,即[BroadcastReceiver] 检测到电话来时,则挂断电话,同时保存来电的电话号码,一做特殊处理[发信息或者一段时间后提示用 ...

最新文章

  1. java面向对象-------静态初始化块
  2. 链表问题18——向有序的环形单链表中插入新节点
  3. 小程序中ajax返回数据,请问在小程序中如何从请求success中将数据返回给对象data?...
  4. 《数据库原理与应用》(第三版)第9章 事务与并发控制 基础 习题参考答案
  5. c++中使用 hiredis/hiredis.h
  6. linux mysql odbc驱动安装_mysql odb驱动_Mysql的odbc driver安装配置(Linux)
  7. 使用jQuery异步传递含复杂属性及集合属性的Model到控制器方法
  8. c标签判断true false jsp_Java学习知识点:小白如何掌握JSP技术?
  9. Insert插入不同的列数量,统计信息对比
  10. r语言调用python_python如何调用R
  11. java微调器_java-更改微调器标题栏样式
  12. linux 3.10的kdump配置的小坑
  13. 新手如何使用Docker来搭建PHP开发环境?
  14. UNICODE编码UTF-16 中的Endian(FE FF) 和 Little Endian(FF FE)
  15. SpringBoot的@Value注解设置默认值
  16. html怎么打出一个圆点,如何打出两个字中间的圆点
  17. 产品经理应该懂哪些术语?
  18. Ubuntu安装Typora(md文件)
  19. Android 全景视频播放器(VR视频播放器探索二)
  20. Win11 “qq无法访问个人文件夹”解决方法(原创)

热门文章

  1. 帧数达不到144用144hz_144Hz到底比60Hz强哪里?为啥电竞屏都是144Hz?
  2. 安卓取消apple music订阅
  3. 程序员转型不得不说的事 成为管理者
  4. Ubuntu18.04下安装深度学习框架Pytorch(GPU加速)
  5. 电脑上如何安装python
  6. 如何查看电脑是否已安装Python环境以及Python版本
  7. 加油站问题-贪心算法(面试题JS)
  8. 如何利用UWA优化物理开销
  9. 未来教育官网计算机一级考试题,2019年计算机一级考试MS Office操作试题021
  10. python玩微信小程序游戏_016 用python一步一步教你玩微信小程序【跳一跳】