Android 来去电监听,电话挂断

Android 来去监听电话挂断Android应用性能优化 考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新! 阅读详情

android:enabled=“true”

android:process=“:PhoneListenService”>

public class PhoneStateReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {

// 去电,可以用定时挂断

} else {

//来电

String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

Log.d(PhoneListenService.TAG, "PhoneStateReceiver onReceive state: " + state);

if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {

Log.d(PhoneListenService.TAG, “PhoneStateReceiver onReceive endCall”);

HangUpTelephonyUtil.endCall(context);

}

}

}

}

三. 实战,有什么需要特别注意地方


3.1 双卡双待的手机怎么获取

对于双卡手机,每张卡都对应一个 Service 和一个 PhoneStateListener,需要给每个服务注册自己的 Ph 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 oneStateListener,服务的名称还会有点变化,厂商可能会修改

public ArrayList getMultSimCardInfo() {

// 获取双卡的信息,这个也是经验尝试出来的,不知道其他厂商有什么坑

ArrayList phoneServerList = new ArrayList();

for(int i = 1; i < 3; i++) {

try {

String phoneServiceName;

if (MiuiUtils.isMiuiV6()) {

phoneServiceName = “phone.” + String.valueOf(i-1);

} else {

phoneServiceName = “phone” + String.valueOf(i);

}

// 尝试获取服务看是否能获取到

IBinder iBinder = ServiceManager.getService(phoneServiceName);

if(iBinder == null) continue;

ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);

if(iTelephony == null) continue;

phoneServerList.add(phoneServiceName);

} catch(Exception e) {

e.printStackTrace();

}

}

// 这个是默认的

phoneServerList.add(Context.TELEPHONY_SERVICE);

return phoneServerList;

}

3.2 挂断电话

挂断电话使用系统服务提供的接口去挂断,但是挂断电话是个并不能保证成功的方法,所以会有多种方式挂断同时使用,下面提供

package com.phone.listen;

import android.content.Context;

import android.os.RemoteException;

import android.telephony.TelephonyManager;

import com.android.internal.telephony.ITelephony;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.concurrent.Executor;

import java.util.concurrent.Executors;

/**

  • 封装挂断电话接口

*/

public class HangUpTelephonyUtil {

public static boolean endCall(Context context) {

boolean callSuccess = false;

ITelephony telephonyService = getTelephonyService(context);

try {

if (telephonyService != null) {

callSuccess = telephonyService.endCall();

}

} catch (RemoteException e) {

e.printStackTrace();

} catch (Exception e){

e.printStackTrace();

}

if (callSuccess == false) {

Executor eS = Executors.newSingleThreadExecutor();

eS.execute(new Runnable() {

@Override

public void run() {

disconnectCall();

}

});

callSuccess = true;

}

return callSuccess;

}

private static ITelephony getTelephonyService(Context context) {

TelephonyManager telephonyManager = (TelephonyManager)

context.getSystemService(Context.TELEPHONY_SERVICE);

Class clazz;

try {

clazz = Class.forName(telephonyManager.getClass().getName());

Method method = clazz.getDeclaredMethod(“getITelephony”);

method.setAccessible(true);

return (ITelephony) method.invoke(telephonyManager);

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

return null;

}

private static boolean disconnectCall() {

Runtime runtime = Runtime.getRuntime();

try {

runtime.exec(“service call phone 5 \n”);

} catch (Exception exc) {

exc.printStackTrace();

return false;

}

return true;

}

// 使用 endCall 挂断不了,再使用 killCall 反射调用再挂一次

public static boolean killCall(Context context) {

try {

// Get the boring old TelephonyManager

TelephonyManager telephonyManager = (TelephonyManager)

context.getSystemService(Context.TELEPHONY_SERVICE);

// Get the getITelephony() method

Class classTelephony = Class.forName(telephonyManager.getClass().getName());

Method methodGetITelephony = classTelephony.getDeclaredMethod(“getITelephony”);

// Ignore that the method is supposed to be private

methodGetITelephony.setAccessible(true);

// Invoke getITelephony() to get the ITelephony interface

Object telephonyInterface = methodGetITelephony.invoke(telephonyManager);

// Get the endCall method from ITelephony

Class telephonyInterfaceClass = Class.forName(telephonyInterface.getClass().getName());

Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod(“endCall”);

// Invoke endCall()

methodEndCall.invoke(telephonyInterface);

} catch (Exception ex) { // Many things can go wrong with reflection calls

return false;

}

return true;

}

}

ITelephony 接口在 layoutlib.jar 包中,需要导入 android sdk 目录\platforms\android-8\data\layoutlib.jar

挂断电话需要权限

3.3 监听来去电状态放到后台服务(独立进程)

<service android:name=“.PhoneListenService”

android:label=“Android 来电监听”

android:process=“:PhoneListenService”/>

来去电监听 Service

package com.phone.listen;

import android.app.Service;

import android.content.Context;

import android.content.Intent;

import android.os.IBinder;

import android.telephony.PhoneStateListener;

import android.telephony.TelephonyManager;

import android.util.Log;

/**

  • 来去电监听服务

*/

public class PhoneListenService extends Service {

public static final String TAG = PhoneListenService.class.getSimpleName();

public static final String ACTION_REGISTER_LISTENER = “action_register_listener”;

@Override

public void onCreate() {

super.onCreate();

Log.d(TAG, “onCreate”);

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

Log.d(TAG, "onStartCommand action: " + intent.getAction() +

" flags: " + flags + " startId: " + startId);

String action = intent.getAction();

if (action.equals(ACTION_REGISTER_LISTENER)) {

registerPhoneStateListener();

}

return super.onStartCommand(intent, flags, startId);

}

private void registerPhoneStateListener() {

CustomPhoneStateListener customPhoneStateListener = new CustomPhoneStateListener(this);

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

if (telephonyManager != null) {

telephonyManager.listen(customPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);

}

}

}

通过PhoneStateListener实现Android电话监听 电话监听是比较简单的安卓案例。但却非常经典,因为它涵盖了动态监听、服务绑定、文件保存三大技术操作。作为Android学习的不错案例,今天我就和大家一起来看看安卓通过PhoneStateListener实现的电话监听。 由于监听方法比较多,方法也可以不断修正改良,作为原理讲解,我们就先来看最简单的例子,直接通过程序启动服务绑定。(接下来就比较好接受广播+服务的后台监听) OK,现在开始! 阅读详情

相关推荐

android之通过phoneStateListener监听电话状态改变

<br />效果图<br />当我们外部打电话过来的时候,当前的信息会自动的进行改变。<br />-------------------------------------------------------------------------------<br />activity代码:<br />package cn.com.chenzheng_java; import android.app.Activity; import android.os.Bundle; import android

梦中一夜下江南 3万+

PhoneStateListener

概述 PhoneStateListener是给三方app监听通信状态变化的方法,基本使用如下: TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); PhoneStateListener mPhoneStateListener = new Ph

firedancer0089的专栏 1万+

Android基于AudioManager、PhoneStateListener实现设置黑名单功能

本文实例讲述了Android基于AudioManager、PhoneStateListener实现设置黑名单功能。分享给大家供大家参考,具体如下: 手机中一般有设置黑名单的功能。此例通过设置电话黑名单,当黑名单中的电话打来时,手机铃声为变成静音。 程序代码如下: import android.app.Activity; import android.content.Context; import android.media.AudioManager; import android.os.Bundle; import android.telephony.PhoneStateListener;

电话状态说明

电话和来电话时处理 媒体音量的问题。现将逻辑说明如下: 1.来电话 监听类 PhoneStateListener 第一种状态:响铃:TelephonyManager.CALL_STATE_RINGING 第二种状态:接起电话: TelephonyManager.CALL_STATE_OFFHOOK 第三种状态:挂电话:TelephonyManager.CALL_STATE_IDLE

善感的人 1万+

Android 来去监听电话挂断(1)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!

2401_84901213的博客 720

Android 来去监听电话挂断,卑微打工人

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

m0_60721823的博客 920

Android应用开发之PhoneStateListener 的使用

这两天在做翻转静音的功能,需要用到PhoneStateListener,以前只是知道有这么个东西,没有具体用过 包含此类的包是:android.telephony.PhoneStateListener   由于StatusBar中用到了PhoneStateListener中较多的内容,索性研究了一下StatusBarPolicy.java 76 /** 77  * This class 

梵依然的专栏 8115

通话状态监听-Android13

处于无电话活动,相当于电话挂断,不过要先有。主要查看 framework.jar。

许浑的博客 3563

Android PhoneStateListener

PhoneStateListener  我们可以通过     MyPhoneStateListener

mnk89的专栏 1210

安卓通话状态监听

之前在做通话监听这一块的功能,发现网上找的资料都不怎么全,而且用了问题还蛮多的后来发现了一些新的东西,就发上来给需要的人看看,希望有点帮助。 写这个功能我放的权限: uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> uses-permission android:name="android

u011172512的博客 2845

android-PhoneStateListener

honeStateListener 1.对特定的电话状态的监听,包括服务的状态、信号强度、消息等待指示(语音信箱)、通话转移、呼叫状态、设备单元位置、数据连接状态、数据流量方向。一些电话信息受权限保护,应用程序不会收到受保护的信息的更新,除非在manifest文件中有适当的权限声明。凡申请许可,有适当的LISTEN_标志。 2.对监听的话做处理 Handler mHandler = ne

奈何只是路人A 1775
上一篇: Android 广播机制 详解
下一篇: Android 网络性能优化(2)DNS优化
Java364102
博客等级 码龄4年 12粉丝 58原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值