129.s1-拦截黑名单的电话,Android Studio使用aidl
拦截电话需要权限
<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相关推荐
- Android Studio使用AIDL技术进行SDK开发
前面我们有介绍AIDL的基本用法: Android进程间通信--AIDL Android进程间通信--AIDL Binder连接池 现在我们来介绍利用AIDL来实现一个简陋的SDK,将获取用户信息的方 ...
- android 拦截外拨电话,Android拦截外拨电话程序示例
拦截监听外拨的电话,并进行处理: 向外拨打电话时系统会发出一个有序广播,虽然该广播最终会被拔号器里的广播接收者所接收并实现电话拔打,但我们可以在广播传递给拔号广播接收者之前先得到该广播,然后清除传递给 ...
- android studio调用电话,Android studio案例之实现电话拨号
一.代码配置 1.创建项目 流程看图 2.增添代码 更改布局 布局完整代码 xmlns:app="http://schemas.android.com/apk/res-auto"
- android 标题字体大小,如何修改android studio标题字体大小
匿名用户 1级 2017-03-08 回答 之前为大家讲解了android studio怎么修改字体大小和颜色?其实android studio代码字体样设置位置和之前将的设置位置是一样的,这里再给大 ...
- android studio中使用AIDL进行客户端与服务端互相通信
前言 在AIDL实现IPC通信,调用远程服务端的方法.但是,远程服务端并不能主动给客户端返回信息.在很多情况下是需要远程服务端主动给客户端返回数据,客户端只需要进行监听即可,这是典型的观察者模式.这篇 ...
- Android Studio 使用问题---导入aidl
http://www.cnblogs.com/daxiaaichihanbaobao/p/4345640.html 使用了一段时间Android Studio发现慢慢喜欢上用它写代码了,界面比ADT好 ...
- 查找android studio版本号,Android studio版本号查看的三种方法
Android studio版本号查看的三种方法 发布于 2016-04-10 22:50:17 | 688 次阅读 | 评论: 0 | 来源: 网友投递 Android Studio Android ...
- aidl生成java文件_Android Studio编写AIDL文件后如何实现自动编译生成
Android Studio编写AIDL文件后如何实现自动编译生成 发布时间:2020-09-17 23:34:54 来源:脚本之家 阅读:111 作者:EdwardChu123 在目录src/mai ...
- Android进程间通信 深入浅出AIDL
文中示例代码均可在demo中找到 1. AIDL概念 Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似.您可以利用它定义客户端与服务均认可的编程接口,以便二者 ...
最新文章
- Go 知识点(18)— 条件编译(编译标签、文件后缀)
- Fragment.setArguments()
- c语言单词翻译大全,c语言单词翻译
- TCP/IP 协议标准简单描述
- Vmware centos无法连接网络
- mysql 逗号金额比较,如何使用MySQL比较两个逗号分隔的字符串列表
- 信道效率以及信道的吞吐率
- Spring配置文件总结-applicationContext.xml
- ccc强制性认证是什么?
- 计算机团队霸气名称大全,最霸气最潮的团队名字
- 我和谷歌共同成长----Andriod(安卓)开发(持续更新)
- WCDMA空口速率和Iub口速率的计算方法和限制
- 如何1年赚100万,具体点
- 学习通信原理之——从实验中理解频谱/功率谱/功率谱密度(MATLAB演示)
- 从唐骏携手金和看协同OA企业的个性及实力
- Xcode使用OpenCV访问Mac摄像头权限问题
- 学计算机的演员,南开大学计算机系到演员 张桐回顾“不安分”的青春_TOM明星...
- 告别网贷系统圈钱模式,开启P2P网贷系统免费时代
- 【程序员如何买股票 一】 股票基础知识
- 接口知识大全(含实物图40种)