前段时间领导说了这样一个需求:对特定的号码电话进行拦截、短信拒收,在百度了查阅了很多的资料,结果有点不尽人意。特别是AIDL通信接口废了老大劲。直接上过程

  • 创建aidl通信接口直接在main目录新建aldl类型文件ITelephony即可,自动生成包名等等如图所示此处有坑:网上基本上都是让这样写
interface ITelephony {boolean endCall();void answerRingingCall();
}

这里导致有可能会导致项目编译错误,这里最好还是不要去网上粘贴aidl包名和ITelephony,尽量自己创建不要懒

// ITelephony.aidl
package com.android.internal.telephony;// Declare any non-default types here with import statementsinterface ITelephony {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,double aDouble, String aString);boolean endCall();void answerRingingCall();
}

如果编译不通过重新编译一下就好。

根据需求需要配置权限如下:

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<!-- 增加拦截电话的权限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<!-- 挂断手机的权限 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
<!-- 读取手机状态的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 读content的权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />

我这里直接贴代码,注释我会写清楚的

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.CallLog;
import android.provider.ContactsContract;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.util.Log;import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private static String[] PERMISSIONS_STORAGE = {android.Manifest.permission.READ_PHONE_STATE,android.Manifest.permission.CALL_PHONE, Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_SETTINGS,Manifest.permission.READ_CALL_LOG, Manifest.permission.WRITE_CALL_LOG};private static final int REQUEST_PERMISSION_CODE = 666;private TelephonyManager telMgr;private IncomingCallReceiver mIncomingCallReceiver;@RequiresApi(api = Build.VERSION_CODES.N)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//动态获取权限if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);}}//注册广播mIncomingCallReceiver = new IncomingCallReceiver();IntentFilter mIntentFilter = new IntentFilter();//拦截电话mIntentFilter.addAction("android.intent.action.PHONE_STATE");//拦截短信mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");//注册BroadcastReceiverregisterReceiver(mIncomingCallReceiver, mIntentFilter);}//广播接收器public class IncomingCallReceiver extends BroadcastReceiver {@SuppressLint("MissingPermission")@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();ContentResolver resolver = getContentResolver();if ("android.intent.action.PHONE_STATE".equals(action)) { //拦截电话telMgr = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);switch (telMgr.getCallState()) {// 当电话呼入时case TelephonyManager.CALL_STATE_RINGING:String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);Log.e("111111111111-----------", "拦截电话2:" + number);//我这里是获取手机通讯录的联系人,如果是呼入电话是手机联系人就不拦截,反之你懂的,如果嫌麻烦当然也可以只设置一个号码ArrayList<String> list = getPhoneNum();Log.e("111111111111-----------", "list:" + list.toString());if (!list.contains(number)) {AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);//先静音mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);//这里就是aldl通讯接口 挂断电话endCall();// 删除该呼入电话系统通话记录if (null != resolver)resolver.delete(CallLog.Calls.CONTENT_URI, "number=?", new String[]{number});//恢复正常铃声mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);}break;//电话被挂起case TelephonyManager.CALL_STATE_OFFHOOK:break;//手机空闲了case TelephonyManager.CALL_STATE_IDLE:break;}} //拦截短信
else if ("android.provider.Telephony.SMS_RECEIVED".equals(action)) {//获取短信信息SmsMessage sms = getMessagesFromIntent(intent)[0];//取得电话号码String number = sms.getOriginatingAddress();Log.e("111111111111-----------", "拦截短信2:" + number);//把国家代码去除掉 number = trimSmsNumber("+86", number); if (!getPhoneNum().contains(number)) {//中断短信推送this.abortBroadcast(); // 删除系统短信if (null != resolver)resolver.delete(Uri.parse("content://sms/"), "address=? or address = ?", new String[]    {number, "+86" + number});}}}}//获取短信内容public final static SmsMessage[] getMessagesFromIntent(Intent intent) {Object[] messages = (Object[]) intent.getSerializableExtra("pdus");byte[][] pduObjs = new byte[messages.length][];for (int i = 0; i < messages.length; i++) {pduObjs[i] = (byte[]) messages[i];}byte[][] pdus = new byte[pduObjs.length][];int pduCount = pdus.length;SmsMessage[] msgs = new SmsMessage[pduCount];for (int i = 0; i < pduCount; i++) {pdus[i] = pduObjs[i];msgs[i] = SmsMessage.createFromPdu(pdus[i]);}return msgs;}//去除国家代码 public final static String trimSmsNumber(String prefix, String number) {String s = number;if (prefix.length() > 0 && number.startsWith(prefix)) {s = number.substring(prefix.length());}return s;}/*** 挂断电话*/private void endCall() {Class<TelephonyManager> c = TelephonyManager.class;try {Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);getITelephonyMethod.setAccessible(true);ITelephony iTelephony = null;iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[]) null);//挂断电话iTelephony.endCall();} catch (Exception e) {//如果有异常查看动态权限有没有遗漏Log.e("111111111111-----------", "Exception:" + e);}}//权限请求回调,如果返回无权限,卸载重装即可@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[]         grantResults) {switch (requestCode) {case REQUEST_PERMISSION_CODE:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {Log.e("111111111111-----------", "有权限");} else {Log.e("111111111111-----------", "无权限");}}}//获取所有联系人private ArrayList<String> getPhoneNum() {ArrayList<String> numList = new ArrayList<String>();//得到ContentResolver对象ContentResolver cr = getContentResolver();//取得电话本中开始一项的光标Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);while (cursor.moveToNext()) {// 取得联系人IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);// 取得电话号码(可能存在多个号码)while (phone.moveToNext()) {String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));String str1 = strPhoneNumber.replaceAll(" ", "");String str2 = str1.replaceAll("-", "");numList.add(str2);}phone.close();}cursor.close();return numList;}@Overrideprotected void onDestroy() {super.onDestroy();//注销广播if (null != mIncomingCallReceiver)unregisterReceiver(mIncomingCallReceiver);}
}

好嘞这样就可以了,可以根据自己的需求改吧改吧就可以用了。目前在我的真机上的测试效果如下:

手机通讯录外的号码呼入拒接,短信拒收(在信息里面也找不到痕迹)

Android拦截电话与短信(电话拒接/短信拒收)相关推荐

  1. Android开发——短信电话拦截/接听电话

    1.短信拦截 首先需要声明的是,Android4.4版本以上,如果想做到短信拦截,必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截.但这种做法,适配性和兼容性的工作是非常 ...

  2. android接听ios电话,教程】教你用电脑连接 iPhone 、 Android ,在电脑上接打电话、收发短信。...

    原标题:教程]教你用电脑连接 iPhone . Android ,在电脑上接打电话.收发短信. 你有「手机依赖症」吗?相信大家对自己的手机都是机不离手,眼不离机吧~那么在办公或者学习的时间里,怎么不接 ...

  3. Android两个小Demo之电话拨号器和短信发送器

    两个简单的小案列 <1>电话拨号器 实现一个电话拨号器,我们分为简单的三步走: 1.在layout中写好布局 2.在MainActivity中写出对应的事件 3.在Manifest中配置好 ...

  4. Android拦截短信并屏蔽Notification

    Android拦截短信并屏蔽Notification 拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收" ...

  5. android拦截短信获取短信内容,《英雄联盟手游》先锋测试招募说明:仅安卓用户...

    招募时间:5月10日~5月17日 测试开始时间:预计5月下旬或6月上旬 招募(体验)要求: 1.测试期间有较长时间可投入游戏体验: 2.能够积极反馈和表达自己的游戏体验感受: 3.需提前完成招募问卷( ...

  6. ADB向测试机发送短信,电话,消息,定位

    1. Telnet登录测试机 telnet localhost <port> telnet localhost 5554 2. 发送短信 sms send <手机号> < ...

  7. Android学习笔记:短信控制手机之“短信开启定位”

    2019独角兽企业重金招聘Python工程师标准>>> 首先,我必须说,我是菜鸟.接触Android不就久,在这里记下,第一想让自己有更加深刻的印象,第二也想和大家一起分享.如果出现 ...

  8. Android Mms短信的发送流程,短信发送源码解析

    发送前的校验 从短信的点击按钮开始着手: // packages/apps/Mms/src/com/android/mms/ui/ComposeMessageActivity.java@Overrid ...

  9. android手机短信备份软件,手机短信备份软件-SMS Backup Restore Pro(短信备份) 安卓版v7.13-PC6安卓网...

    短信备份还原 SMS Backup Restore:短信备份还是很有必要的,遇到一些重要信息的保存,定时备份比较的方便. 官方介绍 短信备份还原 SMS Backup Restore是Android平 ...

  10. android短信数据库类型,安卓短信收发 mmssms.db数据库和查询简介

    Android 手机信息存放在mmssms.db数据库,位于data/data/com.android.providers.telephony/databases下. 短讯息主要用到sms表和thre ...

最新文章

  1. RabbitMQ(十):RabbitMQ 如何保证消息的可靠性
  2. windows server 更改默认服务端口
  3. 用python写个程序送给女朋友_如和用python给女朋友做个专属她的软件
  4. Python高级特性:列表生成式
  5. 微软开源的Trill是什么?
  6. 【渝粤题库】陕西师范大学201281 民法作业
  7. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
  8. 什么样的程序算作漂亮的?
  9. CVPR AAAI 2020 |人脸活体检测最新进展
  10. oracle常见受权与回收权限 grant和revoke
  11. 动网论坛帖子跟帖展开/关闭测试
  12. Xcode 与 macOS 系统版本的兼容问题
  13. C++ 自定义String类
  14. 不瞒你说,我也参加过培训
  15. java面试题(精选版)
  16. 【数据治理】数据安全-数据脱敏方案
  17. WIN10 家庭版 安装DOCKER 遇到问题:THIS COMPUTER DOESN'T HAVE VT-X/AMD-V ENABLED
  18. python的飞机大战
  19. 人工智能之地形导航系统
  20. VS 调试时“还没有为该文档加载任何符号”

热门文章

  1. website for all kinds of courses
  2. Error: [$injector:unpr] Unknown provider: $scopeProvider - $scope -错误解决方案
  3. websocket 客户端测试工具
  4. iMeta | 海南大学张家超组-基于肠道菌群SNV基因标记物的炎症性肠病预测模型
  5. mysql 字符串用省略号_SQL截取字符串,后加省略号的处理办法
  6. 计算机ram和rom的特点的是,什么是ROM和RAM?它们各有什么特点?
  7. 2022深圳杯AC题思路模型分析
  8. WHM(Web Hosting Manager)/CPANEL 设置及linux 文件权限 经验
  9. 帝国cms中常用标签/灵动标签/判断语句
  10. JAVA练习165-复数乘法