Android电话相关的操作 - 打电话,接电话,挂电话
因为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电话相关的操作 - 打电话,接电话,挂电话相关推荐
- pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话(补充效果录像图)
pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话 经过几年的沉淀,我们已经将整个这个需求背景的架构与解决方案进行了高级的研发,将在下一个文档中进行概述. 电脑通过网页通过控制usb的安卓手 ...
- android电话、短信黑白名单拦截、电话录音
功能描述: 总的来说这是一个防骚扰的应用,设置黑名单,白名单,通话录音名单.添加到黑名单的联系人或号码将被拒绝来电或短信:添加到白名单的联系人或号码将通过来电或短信(除白名单以外的号码将被拒绝来电或短 ...
- adb应用之打电话,挂电话
打电话: 1. adb shell service call phone 2 s16 "10086" 2. adb shell am start -a android.intent ...
- android hook电话,Android之拨打接挂电话功能实现
手机是现代人们必不可少的工具之一,而使用得最多的就是拨打电话接听电话,本文通过一个简单的例子实现这个功能. 首先,加入我们的电话处理类 PhoneUtil.java package com.sl.ca ...
- android自动回复退订,Android实现短信自动回复,挂电话
原标题:Android实现短信自动回复,挂电话 简单功能,配置一下ITelephoney,ITelephony这个接口不能直接用的. 需要先在src下新建包com.android.internal.t ...
- Android入门篇(四):自动拨打电话、手动拨打电话
Android入门篇(四):自动拨打电话.手动拨打电话 一.前言 最近在做的项目需要用到自动拨号的这一功能,17年写了一个,最近拿出来用发现不能使用了,后面查资料据说是因为Android 6(api2 ...
- android 实现挂电话和接电话
代码下载见:http://download.csdn.net/source/3477225 在src文件夹下创建包com.android.internal.telephony,在包下建一个文件ITel ...
- Android 电话的反射调用机制实现自动接听电话
最近在看一些有关反射和aidl远程服务控制的类,自己也小写了这么一个Android 电话的反射调用机制实现静默接听电话demo 自己总结出来,以供查阅,若是还有其他问题,希望大家指出. 首先要调用系统 ...
- Android 用代码实现防打扰【能够屏蔽电话和短信】
Android 实现电话和短信拦截的功能如下: 1.实现广播接口,即[BroadcastReceiver] 检测到电话来时,则挂断电话,同时保存来电的电话号码,一做特殊处理[发信息或者一段时间后提示用 ...
最新文章
- java面向对象-------静态初始化块
- 链表问题18——向有序的环形单链表中插入新节点
- 小程序中ajax返回数据,请问在小程序中如何从请求success中将数据返回给对象data?...
- 《数据库原理与应用》(第三版)第9章 事务与并发控制 基础 习题参考答案
- c++中使用 hiredis/hiredis.h
- linux mysql odbc驱动安装_mysql odb驱动_Mysql的odbc driver安装配置(Linux)
- 使用jQuery异步传递含复杂属性及集合属性的Model到控制器方法
- c标签判断true false jsp_Java学习知识点:小白如何掌握JSP技术?
- Insert插入不同的列数量,统计信息对比
- r语言调用python_python如何调用R
- java微调器_java-更改微调器标题栏样式
- linux 3.10的kdump配置的小坑
- 新手如何使用Docker来搭建PHP开发环境?
- UNICODE编码UTF-16 中的Endian(FE FF) 和 Little Endian(FF FE)
- SpringBoot的@Value注解设置默认值
- html怎么打出一个圆点,如何打出两个字中间的圆点
- 产品经理应该懂哪些术语?
- Ubuntu安装Typora(md文件)
- Android 全景视频播放器(VR视频播放器探索二)
- Win11 “qq无法访问个人文件夹”解决方法(原创)
热门文章
- 帧数达不到144用144hz_144Hz到底比60Hz强哪里?为啥电竞屏都是144Hz?
- 安卓取消apple music订阅
- 程序员转型不得不说的事 成为管理者
- Ubuntu18.04下安装深度学习框架Pytorch(GPU加速)
- 电脑上如何安装python
- 如何查看电脑是否已安装Python环境以及Python版本
- 加油站问题-贪心算法(面试题JS)
- 如何利用UWA优化物理开销
- 未来教育官网计算机一级考试题,2019年计算机一级考试MS Office操作试题021
- python玩微信小程序游戏_016 用python一步一步教你玩微信小程序【跳一跳】