基于上一篇挂断电话:https://blog.csdn.net/whjk20/article/details/112916480, 实现拦截给定的电话号码。

目录

一、功能描述

二、过程分析

三、相关API

1. TelephonyManager: 电话服务的管理器,

2. PhoneStateListener: 电话状态监听器

四、代码实现

1. 创建一个Service, 用于监听电话状态。

2. Service 创建回调onCreate时, 创建TelephonyManager/ TelecomManager 对象,并注册电话状态监听, 以及初始化黑名单列表

3. 电话状态改变时,处理拦截挂断

4.完整代码


一、功能描述

  1. 当前手机保存一些黑名单电话号码
  2. 当来电时,如果是黑名单号码,则自动挂断

二、过程分析

  1. 启动服务
  2. 在服务中监听电话状态
  3. 当电话状态是响铃时,判断是否为黑名单号码
  4. 如果是,挂断电话

三、相关API

1. TelephonyManager: 电话服务的管理器,

  • 获取它的对象: context.getSystemService(TELEPHONY_SERVICE)
  • 监听电话状态:telephonyManager.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE)

注意: 当解除接听的时候,需要传 事件: PhoneStateListener.LISTEN_NONE

2. PhoneStateListener: 电话状态监听器

  • 电话状态改变的回调方法: onCallStateChanged(int state, String phoneNumber)
  • 电话状态(TelephonyManager 定义) :   CALL_STATE_IDLE(初始状态)  ,  CALL_STATE_RINGING(响铃),  CALL_STATE_OFFHOOK(通话中)

注意:需要 应用程序 拥有 android.permission.READ_CALL_LOG 权限, 否则回调中的 phoneNumber 是为空的。

因此,不仅AndroidManifest 中需要声明使用这个权限,而且应用程序启动时,提示用户打开 “电话记录” 的权限。(毕竟权限的目的也是为了提醒用户,可能会用到一些隐私信息)

     * @param state call state* @param phoneNumber call phone number. If application does not have* {@link android.Manifest.permission#READ_CALL_LOG READ_CALL_LOG} permission or carrier* privileges (see {@link TelephonyManager#hasCarrierPrivileges}), an empty string will be* passed as an argument.*/public void onCallStateChanged(@CallState int state, String phoneNumber) {// default implementation empty}

四、代码实现

1. 创建一个Service, 用于监听电话状态。

public class ListenCallService extends Service

2. Service 创建回调onCreate时, 创建TelephonyManager/ TelecomManager 对象,并注册电话状态监听, 以及初始化黑名单列表

//注册监听
mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);
private PhoneStateListener mListener = new PhoneStateListener() {...}

mTelecomManager = (TelecomManager) getSystemService(TELECOM_SERVICE);

//add block number
mBlockNumberList.add("10086");

3. 电话状态改变时,处理拦截挂断

@Override
        public void onCallStateChanged(int state, String phoneNumber) {
            super.onCallStateChanged(state, phoneNumber);
            if (state == TelephonyManager.CALL_STATE_RINGING && isBlockNumber(phoneNumber)) {
                boolean ret = mTelecomManager.endCall();
            }
        }

4.完整代码

package com.example.endcallremoteservice;import android.Manifest;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.IBinder;
import android.telecom.TelecomManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;import java.util.ArrayList;
import java.util.List;public class ListenCallService extends Service {private static final String TAG = "ListenCallService";private Context mContext;private TelephonyManager mTelephonyManager;private TelecomManager mTelecomManager;private List<String> mBlockNumberList = new ArrayList<>();private PhoneStateListener mListener = new PhoneStateListener() {@RequiresApi(api = Build.VERSION_CODES.P)@Overridepublic void onCallStateChanged(int state, String phoneNumber) {super.onCallStateChanged(state, phoneNumber);log("onCallStateChanged state=" + state + ", phoneNumber=" + phoneNumber);if (state == TelephonyManager.CALL_STATE_RINGING && isBlockNumber(phoneNumber)) {if (mContext.checkSelfPermission(Manifest.permission.ANSWER_PHONE_CALLS) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.log("onCallStateChanged - no ANSWER_PHONE_CALLS permission");return;}boolean ret = mTelecomManager.endCall();log("onCallStateChanged endCall ret=" + ret);}}};private boolean isBlockNumber(String phoneNumber) {if (phoneNumber == null) {return false;}for (String number : mBlockNumberList) {if (phoneNumber.equals(number)) {return true;}}return false;}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic void onCreate() {super.onCreate();log("onCreate");mContext = this;mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);//监听mTelephonyManager.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);mTelecomManager = (TelecomManager) getSystemService(TELECOM_SERVICE);//add block numbermBlockNumberList.add("10086");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (mContext.checkSelfPermission(Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {log("onCreate - do not grant permission.READ_CALL_LOG ");} else {log("onCreate - already granted permission.READ_CALL_LOG ");}}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {log("onStartCommand");return super.onStartCommand(intent, flags, startId);}@Nullable@Overridepublic IBinder onBind(Intent intent) {log("onCreate");return null;}@Overridepublic boolean onUnbind(Intent intent) {log("onUnbind");return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy();log("onDestroy");//解除监听mTelephonyManager.listen(mListener, PhoneStateListener.LISTEN_NONE);}private void log(String msg) {Log.d(TAG, msg);}
}

AndroidManifest 使用的权限

    <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /><uses-permission android:name="android.permission.CALL_PHONE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.READ_CALL_LOG"/>

五、 输出结果:

//启动来电监听
2021-01-22 16:21:20.891 9188-9188/com.example.endcallremoteservice D/MainActivity: clicked button to enablePhoneListener
2021-01-22 16:21:20.899 9188-9188/com.example.endcallremoteservice D/ListenCallService: onCreate
2021-01-22 16:21:20.906 9188-9188/com.example.endcallremoteservice D/ListenCallService: onCreate - already granted permission.READ_CALL_LOG
2021-01-22 16:21:20.906 9188-9188/com.example.endcallremoteservice D/ListenCallService: onStartCommand
2021-01-22 16:21:20.908 9188-9188/com.example.endcallremoteservice D/ListenCallService: onCallStateChanged state=0, phoneNumber=//拦截来电
2021-01-22 16:21:51.007 9188-9188/com.example.endcallremoteservice D/ListenCallService: onCallStateChanged state=1, phoneNumber=10086
2021-01-22 16:21:51.013 9188-9188/com.example.endcallremoteservice D/ListenCallService: onCallStateChanged endCall ret=true
2021-01-22 16:21:51.341 9188-9188/com.example.endcallremoteservice D/ListenCallService: onCallStateChanged state=0, phoneNumber=10086//停止监听
2021-01-22 16:22:21.003 9188-9188/com.example.endcallremoteservice D/MainActivity: clicked button to stopPhoneListener
2021-01-22 16:22:21.011 9188-9188/com.example.endcallremoteservice D/ListenCallService: onDestroy 

Android 四大组件之 Service_5_拦截电话号码相关推荐

  1. Android添加手机黑名单,手机来电拦截实现详解与Demo,一个不错的练手项目,涵盖Android四大组件。

    简介 这是一个小应用的详解,这个应用可以添加手机黑名单,拦截手机黑名单的来电.通过这个小demo,我们可以对Android四大组件的应用场景有个具体的了解,可以说是一个不错的练手项目. 下面给出下载地 ...

  2. Android四大组件之BroadCastReceiver

    1. 基本概念 在Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制.而BroadcastReceiver 是对发送出来的Broadcast 进行过滤接受并响应的一类 ...

  3. Kotlin第七章: Android四大组件

    1. 四大组件 四大组件是每一个Android人必须要会,要掌握的知识点,因为他们是我们在日常开发工作中打交道最频繁的组件,而且他们四个在不同的领域扮演着极其重要的角色. Activity: 负责用户 ...

  4. Android 四大组件,五大存储,六大布局

    Android 四大组件 android四大组件分别是:Activity, service,content provider,broadcast receiver 一.Activity 1.概念: a ...

  5. android 广播的权限,Android四大组件详解之BroadcastReceiver广播接收者

    Android四大组件详解---BroadcastReceicer广播接收者 广播有两个角色,一个是广播发送者,另一个是广播接收者. 广播按照类型分为两种,一种是全局广播,另一种是本地广播 全局广播: ...

  6. Android 四大组件之——Service(一)

    一.什么是服务 服务,是Android四大组件之一, 属于 计算型组件.   长期后台运行的没有界面的组件 ,特点是无用户界面.在后台运行.生命周期长 二,什么时候使用服务? 天气预报:后台的连接服务 ...

  7. Android 四大组件之——Acitivity(一)

    一,什么是Activity activity是Android组件中最基本也是最为常见用的四大组件之一.Android四大组件有Activity,Service服务,Content Provider内容 ...

  8. Android——四大组件、六大布局、五大存储

    一.android四大组件 (一)android四大组件详解 Android四大组件分别为activity.service.content provider.broadcast receiver. 1 ...

  9. 重温Android四大组件(一)—Activity的生命周期

    前言 四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了.但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心. 这里以& ...

最新文章

  1. Linux Find 命令精通指南
  2. [LeetCode] Longest Substring Without Repeating Characters
  3. [ JS 进阶 ] Ajax 详解 (2) :XHR 实例 GET 和 POST 异步和同步
  4. Python3 闭包函数及nonlocal
  5. 面试官 | Java转List三种方式,你说说吧。我。。懵逼。啥时候有三种了
  6. SQL Server 2014新功能 -- 内存中OLTP(In-Memory OLTP)
  7. 虚拟机开机时出现Press ESC in 5 seconds to skip startup.nsh, any other key to continue问题的解决办法
  8. tg3269c网卡驱动linux,TP-Link TG-3269C驱动
  9. python 手机号码归属地 软件,Python查询手机号码归属地几种方法
  10. ASM-第二章寄存器
  11. 三星手机和计算机如何连接打印机,WIFI当道 手把手教你如何实现无线打印
  12. meta标签属性及其功能
  13. (2020年下半年软件设计师49题)程序设计语言的大多数语法现象可以用CFG(上下文无关文法)表示。下面的CFG产生式集用于描述简单算术表达式,其中+ - * 表示加、减、乘运算,id表示单个字母表示
  14. 一个数据存取类的代码,请高手帮忙分析和指定是否有误!
  15. 如何在 Debian、Ubuntu 以及其它 Linux 发行版上安装 ONLYOFFICE 桌面编辑器 v7.2 版本
  16. matlab 中trace,trace命令和tracert命令的用途 matlab中的trace 怎么用的?
  17. 【转载】VLOOKUP函数多条件查询 VLOOKUP三个条件查询
  18. 视觉Transformer上榜!DeepMind科学家:2020年AI领域十大研究进展
  19. 科普读书会丨《被讨厌的勇气》:愤怒不是目的,是一种工具
  20. arm rtx教程_【RTX操作系统教程】第4章 RTX操作系统介绍

热门文章

  1. 阿里云呼叫中心的开发
  2. 记录一次hive的JVM调优
  3. spark程序运行异常:java.lang.OutOfMemoryError: GC overhead limit exceeded
  4. Android集成微信登录
  5. 一头扎进JDBC视频教程 + 源码
  6. 数据库系统原理与应用教程(047)—— MySQL 查询(九):连接查询
  7. 大学计算机学不懂还挂科想转专业,2018大一新生转专业难不难?那些转了专业的学生居然还会后悔!...
  8. 有什么值得选择的VPS主机控制面板?
  9. sonar-scanner扫描代码出错 SonarQube svn: E170001
  10. 通过Http调用第三方接口,收不到返回信息