Android电话拦截研究

    最近希望实现一个类似于360安全卫士的电话拦截功能,根据上网查找,代码分析,基本上实现了该功能。写个博客纪录下:


    要实现类似于360安全卫士的骚扰电话拦截功能,首先需要监听到来电,并且获取来电的电话号码。监听电话有两种方式:监听电话广播和使用TelephonyManager的listen方法。我结合了两种实现思路实现了来电监听,代码如下:

public class PhoneReceiver extends BroadcastReceiver {

private Context mContext;

@Override
public void onReceive(Context context, Intent intent) {
mContext = context;

TelephonyManager tm = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}

private PhoneStateListener listener = new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if(state == TelephonyManager.CALL_STATE_RINGING){

}
}
};
}
    在Android6.0系统以后,使用电话权限必须要在运行时申请权限,否则无法监听到系统广播。

    监听到来电后,判断是否为骚扰电话。如果是骚扰电话,就把电话挂断。怎么挂断电话呢?经查找发现,在TelephonyManager中有一个endCall方法,使用这个方法可以把电话挂断。如何获取TelephonyManager对象呢?这就需要使用aidl进行远程调用了。我们需要在Android源码中找到 ITelephony.aidl、 NeighboringCellInfo.aidl文件拷贝到我们的项目中。如:

    然后,把ServiceManager及相关代码也拷入项目代码中,如:
    
    这样就可以获取TelephonyManager的远程对象了:
private ITelephony getITelephony() {
ITelephony iTelephony = null;
try {
iTelephony = ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
} catch (Exception e) {
e.printStackTrace();
}
return iTelephony;
}
    使用远程对象调用endCall方法,即可把来电挂断:
ITelephony telephony = getITelephony();
try {
telephony.endCall();
} catch (Exception e) {
e.printStackTrace();
}
以上就可以实现简单的电话拦截功能了。
 
 
    另外,在Android 7.0系统开始内置电话拦截功能,系统维护了一个黑名单表,可以使用ContentProvider对黑名单表进行增加、删除等操作。系统也提供了BlockedNumberContract类的api进行黑名单表的增、删等功能。但是目前来说只能由系统短信、电话等应用才能操作这个黑名单表,如何在APP中使用系统的电话拦截功能还需要再深入研究。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值