1. 创建黑名单服务
2.在服务中创建TelephoneyManager,并给电话管理者设置来电监听事件
3.在实现监听事件未实现的方法中,switch电话管理者的状态 ,在电话处于来电状态时判断来电号码是否存在黑名单中
4.如果来电号码在黑名单数据库中,查找出号码对应的mode
5.如果mode的值是"1"||"3" , 挂掉来电电话,删除呼叫记录
-----------------------------------------------------------------------------------
挂掉来电电话:
<!--黑名单拦截权限 -->
<uses-permission android:name ="android.permission.CALL_PHONE" />
/**
* 挂断电话的方法: 利用发射技术找到系统隐藏的挂断电话的API
*/
public void endCall(){
try {
Class clazz = getClassLoader().loadClass("android.os.ServiceManager" );
Method method = clazz.getDeclaredMethod("getService",new Class[]
{ String. class });
IBinder b = (IBinder) method.invoke( null, new Object[]
{ TELEPHONY_SERVICE });
//调用导入系统文件 aidl中的方法
ITelephony iTelephony = ITelephony.Stub.asInterface(b);
iTelephony.endCall();
} catch (Exception
e) {
e.printStackTrace();
}
}
-----------------------------------------------------------------------------
删除呼叫记录: 查询系统联系人数据库,在calls表中删除来电号码对应的数据
<!--删除呼叫记录的权限 -->
<uses-permission android:name ="android.permission.READ_CONTACTS"/>
<uses-permission android:name ="android.permission.WRITE_CONTACTS" />
<uses-permission android:name ="android.permission.READ_CALL_LOG" />
<uses-permission android:name ="android.permission.WRITE_CALL_LOG" />
/**
* 删除呼叫记录
* @param incomingNumber
*/
public void deleteCallLog(String
incomingNumber) {
ContentResolver resoler = getContentResolver();
resoler.delete(Uri. parse("content://call_log/calls"), "number=?",new String[]
{ incomingNumber });
}
--------------------------------------------------------------------------------------------
ublic class CallSmsSafeService extends Service
{
private static final String TAG = "CallSmsSafeService";
private TelephonyManager tm;
private BlackNumberDao dao;
private myListener listener;
@Override
public IBinder
onBind(Intent intent) {
return null;
}
/**
* 服务创建时
*/
@Override
public void onCreate()
{
Log. i(TAG, "意图创建时" );
dao= new BlackNumberDao( this);
//1.创建电话管理者
tm=(TelephonyManager)
getSystemService( TELEPHONY_SERVICE);
listener= new myListener();
//2.给电话管理者设置来电监听事件
tm.listen( listener,
PhoneStateListener. LISTEN_CALL_STATE); //开启监听
super.onCreate();
}
/**
* 服务销毁时
*/
@Override
public void onDestroy()
{
Log. i(TAG, "意图销毁时" );
tm.listen( listener,
PhoneStateListener. LISTEN_NONE); //关闭监听
listener= null;
super.onDestroy();
}
/**
* 创建来电监听器
* @author Administrator
*
*/
private class
myListener extends PhoneStateListener{
private static final String TAG = "myListener";
//当来电状态发生改变时
@Override
public void onCallStateChanged( int state,
String incomingNumber) {
super.onCallStateChanged(state,
incomingNumber);
switch (state)
{
case TelephonyManager. CALL_STATE_RINGING: //来电时
//查询来电号码是否在黑名单数据库中
String mode= dao.findMode(incomingNumber);
if(mode.equals( "1")||mode.equals( "3")){
Log. i(TAG, "拦截黑名单电话" );
endCall(); //调用拦截电话的方法
/*Log.i(TAG, "删除呼叫记录");
deleteCallLog(incomingNumber); //删除呼叫记录*/
// 挂断电话 呼叫记录不是立刻产生出来的.
// deleteCallLog(incomingNumber);
// 在呼叫记录产生之后, 才能去移除呼叫记录.
// 注册一个内容观察者 观察呼叫记录的变化.
getContentResolver().registerContentObserver(
Uri. parse("content://call_log/calls"), true,
new MyObserver( new Handler(),
incomingNumber));
}
break;
case TelephonyManager. CALL_STATE_IDLE: //空闲时候
break;
}
}
}
/**
* 挂断电话的方法: 利用发射技术找到系统隐藏的挂断电话的API
*/
public void endCall(){
try {
Class clazz = getClassLoader().loadClass("android.os.ServiceManager" );
Method method = clazz.getDeclaredMethod("getService",new Class[]
{ String. class });
IBinder b = (IBinder) method.invoke( null, new Object[]
{ TELEPHONY_SERVICE });
//调用导入系统文件 aidl中的方法
ITelephony iTelephony = ITelephony.Stub.asInterface(b);
iTelephony.endCall();
} catch (Exception
e) {
e.printStackTrace();
}
}
/**
* 创建内容观察者
*/
public class MyObserver extends ContentObserver{
private String incomingNumber; //来电号码
public MyObserver(Handler
handler,String incomingNumber) {
super(handler);
this. incomingNumber =
incomingNumber;
}
//当数据发生变化的时候
@Override
public void onChange( boolean selfChange)
{
super.onChange(selfChange);
getContentResolver().unregisterContentObserver( this);
Log. i(TAG,"观察到数据库内容变化.删除呼叫记录" );
deleteCallLog( incomingNumber);
}
}
/**
* 删除呼叫记录
* @param incomingNumber
*/
public void deleteCallLog(String
incomingNumber) {
ContentResolver resoler = getContentResolver();
resoler.delete(Uri. parse("content://call_log/calls"), "number=?",new String[]
{ incomingNumber });
}
}