黑名单电话自动拦截【Android】
1.功能描述:
当前手机中保存了一些黑名单电话号(如110等)
当一个电话打入进来, 如果它刚好是一个黑名单号码, 就会自动将电话挂断
过程分析:
启动服务
在服务中监听电话状态,
当电话状态是响铃时, 判断是否为黑名单号
如果是, 挂断电话
2.相关API
TelephonyManager: 电话服务的管理器
context.getSystemService(Context.TELEPHONY_SERVICE)
: 得到它的对象
listen(phoneStateListener,PhoneStateListener.LISTEN_CALL_STATE)
:监听电话状态:
PhoneStateListener : 电话状态监听器
onCallStateChanged(int state, String incomingNumber)
: 电话状态改变的回调方法
TelephonyManager.CALL_STATE_IDLE : 空闲状态
TelephonyManager.CALL_STATE_RINGING : 响铃状态
TelephonyManager.CALL_STATE_OFFHOOK : 接通状态
3.挂断电话
说明:Android没有对外公开结束通话的API,如果需要结束通话,必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,方法如下:
1).从sdk的源码中复制下面一个文件
com/android/internal/telephony/ITelephony.aidl
2).调用ITelephony.endCall()结束通话
Method method = Class.forName("android.os.ServiceManager")
.getMethod("getService", String.class);
IBinder binder = (IBinder)method.invoke(null, Context.TELEPHONY_SERVICE);
ITelephony telephony = ITelephony.Stub.asInterface(br);
telephony.endCall(); inde
3). 声明打/挂断电话的权限
<uses-permission android:name="android.permission.CALL_PHONE" />
4.代码实现
1).ListenCallService
package com.example.appservice;import java.lang.reflect.Method;import com.android.internal.telephony.ITelephony;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 ListenCallService extends Service {private TelephonyManager tm;private PhoneStateListener listener = new PhoneStateListener() {// 当通话状态发生改变时调用public void onCallStateChanged(int state, String incomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_IDLE:// 空闲(挂断电话/未来电之前)Log.e("TAG", "空闲(挂断电话/未来电之前)");break;case TelephonyManager.CALL_STATE_RINGING:// 响铃Log.e("TAG", "响铃");// 如果来电是黑名单号(110),就挂断电话if ("110".equals(incomingNumber)) {try {endCall();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case TelephonyManager.CALL_STATE_OFFHOOK:// 接通Log.e("TAG", "接通");break;default:break;}}};@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}/** 挂断电话*/private void endCall() throws Exception {// 通过反射调用隐藏的API// 得到隐藏类的Class对象Class c = Class.forName("android.os.ServiceManager");// 得到方法所对应的Method对象Method method = c.getMethod("getService", String.class);// 调用方法IBinder iBinder = (IBinder) method.invoke(null,Context.TELEPHONY_SERVICE);// 得到接口对象ITelephony telephony = ITelephony.Stub.asInterface(iBinder);// 结束通话telephony.endCall();}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();// 得到电话管理器tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);// 监听电话状态tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();// 停止电话监听tm.listen(listener, PhoneStateListener.LISTEN_NONE);}
}
2).黑名单拦截功能的开关
<span style="white-space:pre"> </span>public void startListenCall(View v){startService(new Intent(this, ListenCallService.class));}public void stopListenCall(View v){stopService(new Intent(this, ListenCallService.class));}
3).注册Service
<service android:name="com.example.appservice.ListenCallService"></service>
5.设置开机即开启黑名单
<receiver android:name="com.example.appservice.BootReceiver"><intent-filter ><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>
package com.example.appservice;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/*** 接收开机完成广播的receiver* @author Xiaocici**/
public class BootReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//启动电话监听的receivercontext.startService(new Intent(context, ListenCallService.class));}}
黑名单电话自动拦截【Android】相关推荐
- 黑马手机卫士黑名单电话拦截 使用ITelephony.aidl和NeighboringCellInfo.aidl 自动拦截黑名单电话 附文件
Android Studio使用ITelephony.aidl 和 NeighboringCellInfo.aidl拦截电话,以及解决 java.lang.NoSuchMethodError: No ...
- android 自动读取短息,Android实现短信验证码自动拦截读取功能
本文实例为大家分享了Android短信验证码自动拦截读取 的具体代码,供大家参考,具体内容如下 知识准备: 1.观察者模式的理解[文章稍后来到~~] 2.Android的Cursor使用[Androi ...
- 自动化软件测试 - 通过 Android Studio 开发 App 自动拦截读取短信验证码
之前一期介绍了怎样通过 Python 的代码去获取短信验证码去进行软件测试,这一期将主要介绍 怎样 通过 Android Studio 开发 App 自动拦截读取短信验证码. Andr ...
- Android 电话自动接听和挂断详解
1.通过aidl及反射实现挂断电话 具体分三步: (1)ITelephony.aidl ,必须新建com.android.internal.telephony包并放入ITelephony.aidl文件 ...
- android 拨测软件,通信网络性能管理系统中电话自动拨测技术的实现
摘要: 当今世界,无线通信技术已经非常普遍,通信网络的覆盖区域越来越广,无线通讯技术的飞速发展为我们的生活带来了极大的便利.通信网络结构趋于复杂,伴随着通信网络使用的设备也趋于复杂,所以如何进行有效地 ...
- uni-app 实现拨打电话功能(android)
最近项目中需要拨打电话功能,项目中实现拨打电话的代码如下,包括微信和真机拨打电话两种方式,特此记录便于日后查阅. //#ifdef MP-WEIXIN uni.makePhoneCall({phone ...
- android 默认dimens_Android开发——自动生成Android屏幕适配的dimens.xml文件
使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力 ...
- 自动备份android,Android自动备份错误
我正在尝试实现android自动备份(Android 6.0),但是它不起作用. 我得到了同样的错误 10-28 22:58:06.980 600-5578/? I/PFTBT: Initiating ...
- c5绑定steam显示服务器内部错误,C5GAME实现Steam非正常交易自动拦截,轻松规避诈骗...
原标题:C5GAME实现Steam非正常交易自动拦截,轻松规避诈骗 Steam玩家都知道,经常会有莫名其妙的人加你游戏好友,然后再给你发送个链接让你去点击,所连接的网址自然是骗子交易链接或者钓鱼网站. ...
最新文章
- 【神经网络】(17) EfficientNet 代码复现,网络解析,附Tensorflow完整代码
- Nginx 反向代理、动静分离、负载均衡及配置实例
- 2014年职称计算机word2003,2014年职称计算机考试Word2003模拟题及答案5
- linux中修改字符编码
- 企业实战_17_MyCat水平扩展_跨分片查询_ER分片
- gridview不换行,高亮显示
- jquery click点击事件重复执行多次
- ubuntu命令整理中
- rdkit GetAtoms获取化合物每个位置的索引;rdkit FindMCS大公共相同结构 找不同化合物之间的差异
- 专题:固体力学中应力与应变分析详解(5.主方向与主应力)
- 中国移动和路由AP218免拆机刷机教程
- Tableau9——计算字段
- html link canonical
- 人工神经网络的英文简称,人工神经网络英语全称
- 又猎一“狐”:一名外逃越南嫌疑人落网中
- TensorFlow1深度学习基础(笔记二)
- maya python教程_Chris Zurbrigg的Maya Python教程合集
- 自然场景文本检测识别技术综述【转】
- 小米AI魔法分身解密(二)
- B站视频CC字幕提取和转换方法
热门文章
- 基于C/C++获取电脑网卡的IP地址信息
- 汇编c 易语言编程软件,这些汇编用易语言怎么写?
- 双连通分量(DCC)
- element UI 模态层dialog自定义大小
- 云灾备、云容灾、云备份、数据库上云、线下线上云灾备、灾备有云等
- 【C#】【HttpClient】下载网络文件
- oracle 英文简写的日期转成数值型日期的字符串
- 扩展显示器失败:“显示信号输入超出范围“问题解决方案
- java毕业生设计中小学教务管理平台计算机源码+系统+mysql+调试部署+lw
- Kotlin + AndroidX + Tablayout + ViewPager + Fragment 实现Tab切页