Android来电拦截的实现方法
作者:Saflyer 发布时间:2023-10-09 16:42:20
标签:Android,来电拦截
本文实例为大家分享了Android来电拦截的方法,供大家参考,具体内容如下
权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<!-- 注册广播 监听拨出电话 -->
<receiver android:name="com.example.administrator.endcall.PhoneStateReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
拨号广播—PhoneStateReceiver
package com.example.administrator.endcall;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
public class PhoneStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i("BlockCallHelper", "BlockCallHelper------->>>>" + phoneNumber);
}
}
}
来电挂断
BlockCallHelper
package com.example.administrator.endcall;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.android.internal.telephony.ITelephony;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public final class BlockCallHelper {
private static final String TAG = "BlockCallHelper";
private Context mContext;
private TelephonyManager tManger;
private List<String> phones;
private BlockCallBack bcb;
//////////////////////////////////////////
private static final class Factory {
private static final BlockCallHelper instance = new BlockCallHelper();
}
public static BlockCallHelper getInstance() {
return Factory.instance;
}
/**
* 初始化上下文以及数据
* @param context
*/
public BlockCallHelper init(Context context) {
if (context == null) {
throw new NullPointerException("context == null!");
}
this.mContext = context;
this.tManger = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
tManger.listen(new PhoneCallListener(), PhoneCallListener.LISTEN_CALL_STATE);
return this;
}
/**
* 注入需要拦截的手机号
* @param phoneL
*/
public BlockCallHelper injectBlockPhoneNum(ArrayList<String> blockCalls) {
this.phones = blockCalls;
return this;
}
/**
* 结束通话
*/
private void endCall() {
Class<TelephonyManager> tmc = TelephonyManager.class;
Method getITelephonyMethod;
try {
getITelephonyMethod = tmc.getDeclaredMethod("getITelephony", (Class[]) null);
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(tManger, (Object[]) null);
iTelephony.endCall();
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e2) {
e2.printStackTrace();
} catch (IllegalAccessException e3) {
e3.printStackTrace();
} catch (RemoteException e4) {
e4.printStackTrace();
}
}
private final class PhoneCallListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if (state == TelephonyManager.CALL_STATE_RINGING) {
if (phones.contains(incomingNumber)) {
Log.i("BlockCallHelper", "contains contains contains");
endCall();
if (bcb != null) {
bcb.callBack(incomingNumber);
}
} else {
Log.i("BlockCallHelper", "contains not-------");
}
}
}
}
public BlockCallHelper setBlockCallBack(BlockCallBack back) {
this.bcb = back;
return this;
}
public interface BlockCallBack {
void callBack(String incomingNum);
}
}
看主界面MainActivity
package com.example.administrator.endcall;
import android.app.Activity;
import android.app.NotificationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<String> blockCalls = new ArrayList();
blockCalls.add("13581922339");
blockCalls.add("+8613581922339");
blockCalls.add("18500813370");
blockCalls.add("13717717622");
blockCalls.add("+8613717717622");
BlockCallHelper.getInstance().init(this).injectBlockPhoneNum(blockCalls).setBlockCallBack(new BlockCallHelper.BlockCallBack() {
@Override
public void callBack(String incomingNum) {
Log.i("BlockCallHelper", "incomingNum-----------" + incomingNum);
}
});
}
}
最后看AIdl层面
ITelephony.aidl
package com.android.internal.telephony;
interface ITelephony {
void dial(String number);
void call(String number);
boolean showCallScreen();
boolean showCallScreenWithDialpad(boolean showDialpad);
boolean endCall();
void answerRingingCall();
void silenceRinger();
boolean isOffhook();
boolean isRinging();
boolean isIdle();
boolean isRadioOn();
boolean isSimPinEnabled();
void cancelMissedCallsNotification();
boolean supplyPin(String pin);
boolean handlePinMmi(String dialString);
void toggleRadioOnOff();
boolean setRadio(boolean turnOn);
void updateServiceLocation();
void enableLocationUpdates();
void disableLocationUpdates();
int enableApnType(String type);
int disableApnType(String type);
boolean enableDataConnectivity();
boolean disableDataConnectivity();
boolean isDataConnectivityPossible();
Bundle getCellLocation();
List<NeighboringCellInfo> getNeighboringCellInfo();
int getCallState();
int getDataActivity();
int getDataState();
}
NeighboringCellInfo.aidl
// NeighboringCellInfo.aidl
package android.telephony;
parcelable NeighboringCellInfo;
0
投稿
猜你喜欢
- 本文实例讲述了C#使用winform简单导出Excel的方法。分享给大家供大家参考,具体如下:using Excel;在项目中引入Excel
- ProgressDialog的基本用法ProgressDialog为进度对话框。android手机自带的对话框显得比较单一,我们可以通过Pr
- 我们从书本上学到什么?最明显的,也是直观的方式,在Java中生成随机数只要简单的调用:java.lang.Math.random()在所有其
- 前言volatile相关的知识其实自己一直都是有掌握的,能大概讲出一些知识,例如:它可以保证可见性;禁止指令重排。这两个特性张口就来,但要再
- 前端页面功能模块化拆分当一个系统的功能很多时,不可能所有功能模块的页面都写在一个页面里面,这时就需要将不同功能模块的页面拆分出去,就像模板一
- DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送至多个客户端。其主
- 性能优化点:1.使用int不使用double。(单位用分不用元)也省去了还要用math.round四舍五入,把double类型数据只留小数点
- File类概述File类能新建、删除、重命名文件和目录,但不能访问文件内容本身,如果需要访问文件内容本身,则需要使用后续的输入/输出流。要在
- 重载,继承,重写和多态的区别:1)继承是子类获得父类的成员。2)重写是继承后重新实现父类的方法。 3)重载是在一个类里一系列参数不同名字相同
- RocketMq消息处理RocketMq消息处理整个流程如下:本系列RocketMQ4.8注释github地址,希望对大家有所帮助,要是觉得
- 此次简单的操作将数据从数据库导出生成excel报表以及将excel数据导入数据库首先建立数据库的连接池:package jdbc;impor
- Android RecyclerView小白今天第一次接触RecyclerView,前辈大神告诉我这是一个很神奇的控件,一看就是
- 一、静态静态的定时任务可以直接使用注解@Scheduled,并在启动类上配置@EnableScheduling即可@PostMapping(
- 1.刷新maven项目2.清理idea缓存3.maven clean install4.重新bulid5.如果使用了lombok插件开启之后
- 第一步:后端简单建个SpringBoot项目,提供一个 helloWorld接口;版本选用 2.2.6.RELEASEpackage com
- 项目里头需要做一个判断用户输入的号码是否是正确的手机号码,正确的手机号码应该是11位的,这里我们需要用一个正则表达式来进行判断,
- 周末了,觉得我还有很多作业没有写,针对目前大家对OOM的类型不太熟悉,那么我们来总结一下各种OOM出现的情况以及解决方法。我们把各种OOM的
- 最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下:1.函数本身(1)头文件#include&l
- 实例如下:import java.util.concurrent.CountDownLatch;import java.util.concu
- 线性表是其组成元素间具有线性关系的一种数据结构,对线性表的基本操作主要有,获取元素,设置元素值,遍历,插入,删除,查找,替换,排序等。而线性