黑名单来电自动挂断

来源:互联网 发布:怎么word数据导入excel 编辑:程序博客网 时间:2024/05/04 16:55

监听手机来电一文中,已经实现了监听手机来电的功能,本文在此基础上,增加黑名单来电自动挂断的功能,不幸的是,Android没有对外公开挂断电话的API,如果需要挂断电话,必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话。为了调用远程的AIDL Service,需要将Android源代码中的如下两个文件复制到项目的相应位置:

com.android.internal.telephony包下的ITelephony.aidl

android.telephony包下的NeighboringCellInfo.aidl

开发者需要在项目中建立对应的包,然后将这两个文件复制到相应的包下。ADT会在根目录下自动生成源文件。

接下来就可以使用ITelephony的endCall方法来挂断电话了。代码如下:

package com.guyun.activity;import java.lang.reflect.Method;import java.util.ArrayList;import com.android.internal.telephony.ITelephony;import android.app.Activity;import android.os.Bundle;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;public class MainActivity extends Activity {// 记录黑名单的集合ArrayList<String> blockList = new ArrayList<String>();// 声明电话管理器对象TelephonyManager tManager;// 声明监听通话状态的监听器CustomPhoneCallListener cpListener;public class CustomPhoneCallListener extends PhoneStateListener {@Overridepublic void onCallStateChanged(int state, String incomingNumber) {switch (state) {case TelephonyManager.CALL_STATE_IDLE:break;case TelephonyManager.CALL_STATE_OFFHOOK:break;case TelephonyManager.CALL_STATE_RINGING:// 如果该号码属于黑名单if (isBlock(incomingNumber)) {try {Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);// 获取远程TELEPHONY_SERVICE的IBinder对象的代理IBinder binder = (IBinder) method.invoke(null,new Object[] { TELEPHONY_SERVICE });// 将IBinder对象的代理转换为ITelephony对象ITelephony telephony = ITelephony.Stub.asInterface(binder);// 挂断电话telephony.endCall();} catch (Exception e) {e.printStackTrace();}}break;}super.onCallStateChanged(state, incomingNumber);}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 初始化黑名单集合initBlockList();// 获取系统的TelephonyManager管理器tManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);cpListener = new CustomPhoneCallListener();// 通过TelephonyManager监听通话状态的改变tManager.listen(cpListener, PhoneStateListener.LISTEN_CALL_STATE);}/** * 初始化黑名单集合 */private void initBlockList() {blockList.add("15402817757");blockList.add("15680768382");blockList.add("15680768383");blockList.add("15680768284");blockList.add("15680768385");blockList.add("15680768386");blockList.add("15680768387");blockList.add("15680768388");blockList.add("15680768389");}/** * 判断某个电话号码是否在黑名单之内 *  * @param phone *            来电号码 * @return */public boolean isBlock(String phone) {for (String s1 : blockList) {if (s1.equals(phone)) {return true;}}return false;}}

加上权限:

    <uses-permission android:name="android.permission.CALL_PHONE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />


注意:本文只是简单地初始化黑名单,此示例可以做如下改进:

1、黑名单来源应该从系统联系人中选取,即需要读取系统联系人,以ListView形式显示出来并提供复选框供用户选择。

2、选择的黑名单可以保存在文件或数据库中,当然判断某个号码是否为黑名单也是根据此文件或数据库,这样即使程序退出,手机关机,黑名单也不会消失。

3、添加黑名单可以在Activity实现,而监听来电和挂断黑名单可以在后台Service实现,并随系统开机而自动运行。