android 电话拦截

1. 床架aidl文件,ITelephony.aidl 这个文件创建在aidl文件夹下面的 com.android.internal.telephony包下面

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. 在页面中添加一个按钮,开启服务的时候就会动态的注册开启拦截电话的广播咯

时间: 2024-08-10 13:45:57

android 电话拦截的相关文章

Android短信拦截和电话拦截

MainActivity: package com.wyl.bctest; import android.support.v7.app.ActionBarActivity; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; i

电话拦截以及电话拦截后的提示音

1. 电话拦截 这个功能大家可能都知道了,就是利用反射原理调用ITelephony的隐藏方法来实现.这个就不说了,在附件的代码里有. 2.拦截后提示忙音/空号/已关机/已停机这个功能其实是要用到MMI指令,具体如何设置呼叫转移的指定可以参考这里 http://baike.baidu.com/view/206402.html?fromTaglist .在 本文中我们会用到“遇忙转移”转移的功能.中国移动的设置方式是 **67#电话号码#,取消方式为 ##67#.”无条件转移“用21代替67即可.这

初识安卓小程序(Android电话拨号器)

首先,先创建一个安卓项目(我的版本是4.4.2的),名字为"电话拨号器",创建的时候点击"clipart",如图: 然后在res文件夹下找到layout文件夹,找到activity_main.xml或fragment_main.xml,在里面输入或拖拽按钮 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="

Android电话拨号器

android电话拨号器的设计 具体的运行界面如上图所示. 具体操作过程: 1.新建一个Android项目.在Eclipse中依次单击“File”->“NEW”->"Android Project" 2.编写string.xml文件.具体代码如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 4 <string name="a

Android 时间拦截机制

对于Android事件拦截机制,相信对于大多数Android初学者是一个抓耳挠腮难于理解的问题.其实理解这个问题并不困难. 首先,你的明白事件拦截机制到底是怎么一回事?这里说的事件拦截机制,指的是对触摸事件的拦截机制.那何为触摸事件?所谓的触摸事件,就是指系统捕获的触摸屏幕所产生的事件.当我们点击按钮时候,此时其实就产生了三个事件.按钮按下,这是事件之一:如果你不小心滑动了一点儿,这是事件之二:如果你抬起,这是事件之三.Android为我们这个触摸事件封装了一个类--MotionEvent.在O

android 电话监听和拦截

一.首先在manifest.xml文件中获取监听电话权限,注册监听电话的Activity <receiver android:name=".PhoneReceiver"> <intent-filter android:priority="1000"> <action android:name="android.intent.action.PHONE_STATE"/> <action android:nam

Android之——拦截外拨电话

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46993859 这里,向大家简单介绍通过BroadcastReceiver来拦截外拨电话的方法. 1.创建PhoneReceiver继承自BroadcastReceiver 这个类是BroadcastReceiver的子类,具体的拦截操作在这个类中实现,我在这里只是简单的介绍一下方法,把获取到的外拨号码打印出来.具体的业务逻辑就要大家自己去实现了. 具体代码如下: package

Android四大组件应用系列——实现电话拦截和电话录音

一.问题描述 使用BordercastReceiver和Service组件实现下述功能: 1.当手机处于来电状态,启动监听服务,对来电进行监听录音. 2.设置电话黑名单,当来电是黑名单电话,则直接挂断. 当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理 二.加入AIDL文件 Android没有对外

android143 360 短信电话拦截

package com.itheima.mobileguard.services; import java.lang.reflect.Method; import android.app.Service; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; im