拦截电话需要权限
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
清除来电记录需要权限
<uses-permission
android:name="android.permission.READ_CALL_LOG"></uses-permission>
<uses-permission
android:name="android.permission.WRITE_CALL_LOG"></uses-permission>
CallSafeService.java需要aidl来实现endCall()方法,内容观察者修改来电中黑名单的电话给删除,业务逻辑方法
package com.ldw.safe.service;
import java.lang.reflect.Method;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import com.android.internal.telephony.ITelephony;
import com.ldw.safe.db.dao.BlackNumberDao;
public class CallSafeService extends Service {
private BlackNumberDao dao;
private TelephonyManager tm;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
dao = new BlackNumberDao(this);
//拦截电话
//获取到TelephonyManager对象
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
//创建电话监听的对象
MyPhoneStateListener listener = new MyPhoneStateListener();
//监听电话的状态
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
//初始化短信的广播,拦截短信
InnerReceiver innerReceiver = new InnerReceiver();
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
intentFilter.setPriority(Integer.MAX_VALUE);
registerReceiver(innerReceiver, intentFilter);
}
private class MyPhoneStateListener extends PhoneStateListener{
//电话状态改变的监听
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
//TelephonyManager#CALL_STATE_IDLE 电话闲置
//TelephonyManager#CALL_STATE_RINGING 电话铃响的状态
//TelephonyManager#CALL_STATE_OFFHOOK 电话接通
switch (state){
//电话铃响的状态
case TelephonyManager.CALL_STATE_RINGING:
//获取来电的号码的拦截模式
String mode = dao.findNumber(incomingNumber);
/**
* 黑名单拦截模式
* 1 全部拦截 电话拦截 + 短信拦截
* 2 电话拦截
* 3 短信拦截
*/
if(mode.equals("1")|| mode.equals("2")){
System.out.println("挂断黑名单电话号码");
//利用内容观察者,清楚打进来的电话
Uri uri = Uri.parse("content://call_log/calls");
getContentResolver().registerContentObserver(uri,true,new MyContentObserver(new Handler(),incomingNumber));
//挂断电话
endCall();
}
break;
}
}
}
private class MyContentObserver extends ContentObserver{
String incomingNumber;
/**
* Creates a content observer.
*
* @param handler The handler to run {@link #onChange} on, or null if none.
* @param incomingNumber
*/
public MyContentObserver(Handler handler, String incomingNumber) {
super(handler);
this.incomingNumber = incomingNumber;
}
//当数据改变的时候调用的方法
@Override
public void onChange(boolean selfChange) {
getContentResolver().unregisterContentObserver(this);
//删除电话号码
deleteCallLog(incomingNumber);
super.onChange(selfChange);
}
}
//删掉电话号码
private void deleteCallLog(String incomingNumber) {
Uri uri = Uri.parse("content://call_log/calls");
//删除表中的电话号码
getContentResolver().delete(uri,"number=?",new String[]{incomingNumber});
}
//初始化短信的广播,拦截短信
private class InnerReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("短信来了");
Object[] objects = (Object[]) intent.getExtras().get("pdus");
for (Object object : objects) {// 短信最多140字节,
// 超出的话,会分为多条短信发送,所以是一个数组,因为我们的短信指令很短,所以for循环只执行一次
SmsMessage message = SmsMessage.createFromPdu((byte[]) object);
String originatingAddress = message.getOriginatingAddress();// 短信来源号码
String messageBody = message.getMessageBody();// 短信内容
//通过短信的电话号码查询拦截的模式
String mode = dao.findNumber(originatingAddress);
/**
* 黑名单拦截模式
* 1 全部拦截 电话拦截 + 短信拦截
* 2 电话拦截
* 3 短信拦截
*/
if(mode.equals("1")){
abortBroadcast();
}else if(mode.equals("3")){
abortBroadcast();
}
//智能拦截模式 发票 你的头发漂亮 分词
if(messageBody.contains("fapiao")){
abortBroadcast();
}
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
/*
* 挂掉电话
*/
public void endCall() {
try {
//通过类加载器加载ServiceManager
Class<?> clazz = getClassLoader().loadClass("android.os.ServiceManager");
//通过反射得到当前的方法
Method method = clazz.getDeclaredMethod("getService", String.class);
IBinder iBinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);
//利用aidl获取到endcalll方法
ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);
iTelephony.endCall();
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用aidl的步骤
1.再main下面创建一个aidl文件夹。

2.
再aidl目录下面创建一个包名的文件夹再将aidl文件拷贝到相关的目录下,NeighboringCellInfo也需要引入进来