登山则情满于山,观海则意溢于海。这篇文章主要讲述android 电话拦截相关的知识,希望能为你提供帮助。
1. 床架aidl文件,ITelephony.aidl 这个文件创建在aidl文件夹下面的 com.android.internal.telephony包下面
【android 电话拦截】
文章图片
2. ITelephony文件里面添加接口与方法,这样自己写这个文件并且只添加这两个方法的话就不用再引入 CellInfo.aidl 这样的文件了(注意:这个文件的内容可以使用google提供的内容,里面有很多其他的接口,这里我没搞清楚这样自定义和使用google提供的那个文件之间的区别)
package com.android.internal.telephony; interface ITelephony{ boolean endCall(); // 这个是后面用来被调用结束通话的 void answerRingingCall(); }
3. 通过一个服务来动态开启一个监听电话的广播
3.1 监听的广播类
public class BlackListPhoneReceiver extends BroadcastReceiver { private TelephonyManager tm; @Override public void onReceive(Context context, Intent intent) { // 获取黑名单数据,和这个收信人进行比较 JXBlackListDao dao = new JXBlackListDao(context); List< BlackListContact> blackListContacts = dao.queryAll(); tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE); // 监听电话的状态,就是是否有电话呼入 switch (tm.getCallState()) { case TelephonyManager.CALL_STATE_RINGING:// 开始响铃 String incomingNum = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); // 获取来电的号码 // 这个来电号码和黑名单中的进行比较(这里是将手机里面的黑名单数据库,这个库是自己创建并且添加号码的),如果这个号码和黑名单中的号码相同那么就挂掉这个电话并且删除他的通话记录,这里删除通话记录的方式是最简单的 for (BlackListContact contact : blackListContacts) { if (contact.getPhone().equals(incomingNum) & & (contact.getType() == BlackListContact.BlackType.ALL || contact.getType() == BlackListContact.BlackType.PHONE)) { endCall(); SystemClock.sleep(1000); // 删除通话记录 ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("content://call_log/calls"); resolver.delete(uri, "number=?", new String[]{incomingNum}); } } Toast.makeText(context, "来电是" + incomingNum, Toast.LENGTH_SHORT).show(); break; } } // 挂断电话 private void endCall() { Log.e("John", "BlackListReceiver" + " # " + "end call method running "); Class< TelephonyManager> clz = TelephonyManager.class; try { Method getITelephony = clz.getDeclaredMethod("getITelephony", null); getITelephony.setAccessible(true); ITelephony iTelephony = null; Log.e("John", "BlackListReceiver" + " # " + "end call"); iTelephony = (ITelephony) getITelephony.invoke(tm, null); iTelephony.endCall(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (RemoteException e) { Log.e("John", "BlackListReceiver" + " # " + "endcall error"); e.printStackTrace(); } } }
3.2 注册广播的服务类
public class BlackListService extends Service {
private BlackListPhoneReceiver phoneReceiver; @Nullable @Override public IBinder onBind(Intent intent) { return null; }@Override public void onCreate() {// 电话监听的广播注册 phoneReceiver = new BlackListPhoneReceiver(); IntentFilter filter2 = new IntentFilter(); filter2.addAction("android.intent.action.NEW_OUTGOING_CALL"); filter2.addAction("android.intent.action.PHONE_STATE"); filter.setPriority(Integer.MAX_VALUE); registerReceiver(phoneReceiver, filter2); // 注册广播 }@Override public void onDestroy() { super.onDestroy(); // 关闭服务 msgReceiver = null; phoneReceiver = null; }}
4. 在页面中添加一个按钮,开启服务的时候就会动态的注册开启拦截电话的广播咯
推荐阅读
- Android之ScrollView嵌套ListView
- Android横屏下Fragment界面重叠问题
- Palo Alto Global Protect 使用Cisco VPN Client
- 用户组管理及提权
- 4.8练习题
- Redis(开发与运维):13---哈希/散列对象
- JNA实现远程线程注入
- Kubernetes——对外服务之Ingress
- Linux 内核 内存管理Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init )