拦截电话需要权限

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

清除来电记录需要权限

<uses-permissionandroid:name="android.permission.READ_CALL_LOG"></uses-permission><uses-permissionandroid:name="android.permission.WRITE_CALL_LOG"></uses-permission>

CallSafeService.java需要aidl来实现endCall()方法,内容观察者修改来电中黑名单的电话给删除,业务逻辑方法

package com.ldw.safe.service;import java.lang.reflect.Method;import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;import com.android.internal.telephony.ITelephony;
import com.ldw.safe.db.dao.BlackNumberDao;public class CallSafeService extends Service {private BlackNumberDao dao;private TelephonyManager tm;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {super.onCreate();dao = new BlackNumberDao(this);//拦截电话//获取到TelephonyManager对象tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);//创建电话监听的对象MyPhoneStateListener listener = new MyPhoneStateListener();//监听电话的状态tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//初始化短信的广播,拦截短信InnerReceiver innerReceiver = new InnerReceiver();IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");intentFilter.setPriority(Integer.MAX_VALUE);registerReceiver(innerReceiver, intentFilter);}private class MyPhoneStateListener extends PhoneStateListener{//电话状态改变的监听@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);//TelephonyManager#CALL_STATE_IDLE  电话闲置//TelephonyManager#CALL_STATE_RINGING 电话铃响的状态//TelephonyManager#CALL_STATE_OFFHOOK 电话接通switch (state){//电话铃响的状态case TelephonyManager.CALL_STATE_RINGING://获取来电的号码的拦截模式String mode = dao.findNumber(incomingNumber);/*** 黑名单拦截模式* 1 全部拦截 电话拦截 + 短信拦截* 2 电话拦截* 3 短信拦截*/if(mode.equals("1")|| mode.equals("2")){System.out.println("挂断黑名单电话号码");//利用内容观察者,清楚打进来的电话Uri uri = Uri.parse("content://call_log/calls");getContentResolver().registerContentObserver(uri,true,new MyContentObserver(new Handler(),incomingNumber));//挂断电话endCall();}break;}}}private class MyContentObserver extends ContentObserver{String incomingNumber;/*** Creates a content observer.** @param handler The handler to run {@link #onChange} on, or null if none.* @param incomingNumber*/public MyContentObserver(Handler handler, String incomingNumber) {super(handler);this.incomingNumber = incomingNumber;}//当数据改变的时候调用的方法@Overridepublic void onChange(boolean selfChange) {getContentResolver().unregisterContentObserver(this);//删除电话号码deleteCallLog(incomingNumber);super.onChange(selfChange);}}//删掉电话号码private void deleteCallLog(String incomingNumber) {Uri uri = Uri.parse("content://call_log/calls");//删除表中的电话号码getContentResolver().delete(uri,"number=?",new String[]{incomingNumber});}//初始化短信的广播,拦截短信private class InnerReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("短信来了");Object[] objects = (Object[]) intent.getExtras().get("pdus");for (Object object : objects) {// 短信最多140字节,// 超出的话,会分为多条短信发送,所以是一个数组,因为我们的短信指令很短,所以for循环只执行一次SmsMessage message = SmsMessage.createFromPdu((byte[]) object);String originatingAddress = message.getOriginatingAddress();// 短信来源号码String messageBody = message.getMessageBody();// 短信内容//通过短信的电话号码查询拦截的模式String mode = dao.findNumber(originatingAddress);/*** 黑名单拦截模式* 1 全部拦截 电话拦截 + 短信拦截* 2 电话拦截* 3 短信拦截*/if(mode.equals("1")){abortBroadcast();}else if(mode.equals("3")){abortBroadcast();}//智能拦截模式 发票  你的头发漂亮 分词if(messageBody.contains("fapiao")){abortBroadcast();}}}}@Overridepublic void onDestroy() {super.onDestroy();}/** 挂掉电话*/public void endCall() {try {//通过类加载器加载ServiceManagerClass<?> clazz = getClassLoader().loadClass("android.os.ServiceManager");//通过反射得到当前的方法Method method = clazz.getDeclaredMethod("getService", String.class);IBinder iBinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);//利用aidl获取到endcalll方法ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);iTelephony.endCall();} catch (Exception e) {e.printStackTrace();}}
}

使用aidl的步骤

1.再main下面创建一个aidl文件夹。

2.

再aidl目录下面创建一个包名的文件夹再将aidl文件拷贝到相关的目录下,NeighboringCellInfo也需要引入进来

129.s1-拦截黑名单的电话,Android Studio使用aidl相关推荐

  1. Android Studio使用AIDL技术进行SDK开发

    前面我们有介绍AIDL的基本用法: Android进程间通信--AIDL Android进程间通信--AIDL Binder连接池 现在我们来介绍利用AIDL来实现一个简陋的SDK,将获取用户信息的方 ...

  2. android 拦截外拨电话,Android拦截外拨电话程序示例

    拦截监听外拨的电话,并进行处理: 向外拨打电话时系统会发出一个有序广播,虽然该广播最终会被拔号器里的广播接收者所接收并实现电话拔打,但我们可以在广播传递给拔号广播接收者之前先得到该广播,然后清除传递给 ...

  3. android studio调用电话,Android studio案例之实现电话拨号

    一.代码配置 1.创建项目 流程看图 2.增添代码 更改布局 布局完整代码 xmlns:app="http://schemas.android.com/apk/res-auto"

  4. android 标题字体大小,如何修改android studio标题字体大小

    匿名用户 1级 2017-03-08 回答 之前为大家讲解了android studio怎么修改字体大小和颜色?其实android studio代码字体样设置位置和之前将的设置位置是一样的,这里再给大 ...

  5. android studio中使用AIDL进行客户端与服务端互相通信

    前言 在AIDL实现IPC通信,调用远程服务端的方法.但是,远程服务端并不能主动给客户端返回信息.在很多情况下是需要远程服务端主动给客户端返回数据,客户端只需要进行监听即可,这是典型的观察者模式.这篇 ...

  6. Android Studio 使用问题---导入aidl

    http://www.cnblogs.com/daxiaaichihanbaobao/p/4345640.html 使用了一段时间Android Studio发现慢慢喜欢上用它写代码了,界面比ADT好 ...

  7. 查找android studio版本号,Android studio版本号查看的三种方法

    Android studio版本号查看的三种方法 发布于 2016-04-10 22:50:17 | 688 次阅读 | 评论: 0 | 来源: 网友投递 Android Studio Android ...

  8. aidl生成java文件_Android Studio编写AIDL文件后如何实现自动编译生成

    Android Studio编写AIDL文件后如何实现自动编译生成 发布时间:2020-09-17 23:34:54 来源:脚本之家 阅读:111 作者:EdwardChu123 在目录src/mai ...

  9. Android进程间通信 深入浅出AIDL

    文中示例代码均可在demo中找到 1. AIDL概念 Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似.您可以利用它定义客户端与服务均认可的编程接口,以便二者 ...

最新文章

  1. Go 知识点(18)— 条件编译(编译标签、文件后缀)
  2. Fragment.setArguments()
  3. c语言单词翻译大全,c语言单词翻译
  4. TCP/IP 协议标准简单描述
  5. Vmware centos无法连接网络
  6. mysql 逗号金额比较,如何使用MySQL比较两个逗号分隔的字符串列表
  7. 信道效率以及信道的吞吐率
  8. Spring配置文件总结-applicationContext.xml
  9. ccc强制性认证是什么?
  10. 计算机团队霸气名称大全,最霸气最潮的团队名字
  11. 我和谷歌共同成长----Andriod(安卓)开发(持续更新)
  12. WCDMA空口速率和Iub口速率的计算方法和限制
  13. 如何1年赚100万,具体点
  14. 学习通信原理之——从实验中理解频谱/功率谱/功率谱密度(MATLAB演示)
  15. 从唐骏携手金和看协同OA企业的个性及实力
  16. Xcode使用OpenCV访问Mac摄像头权限问题
  17. 学计算机的演员,南开大学计算机系到演员 张桐回顾“不安分”的青春_TOM明星...
  18. 告别网贷系统圈钱模式,开启P2P网贷系统免费时代
  19. 【程序员如何买股票 一】 股票基础知识
  20. 接口知识大全(含实物图40种)

热门文章

  1. 客户端与服务器信息交互的流程,客户端与服务器的交互流程
  2. 世界上各种壮观震撼奇景。也许你这辈子都看不到了!
  3. 虚拟机与虚拟主机 区别
  4. 哔咔服务器无响应,哔咔哔咔漫画进不去怎么办 无法进入解决办法
  5. 如何架设一个属于自己的Discuz论坛
  6. 解决captcha验证码无法显示的问题
  7. android ap bp,手机刷机中 AP BP是什么意思
  8. 3天25顿的潮汕美食记
  9. 【今日CV 计算机视觉论文速览 第128期】Mon, 10 Jun 2019
  10. copy con 的详细解释