服务类
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import com.karen.db.DBUtil;
import com.karen.entity.Phone;
import com.karen.entity.SMS;
import com.karen.manager.SMSManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
public class MyService extends Service{
public static final String SMS_RECEIVE=
"android.provider.Telephony.SMS_RECEIVED";
public static final String OUTGOING_CALL=
"android.intent.action.NEW_OUTGOING_CALL";
DBUtil dbUtil=null;
MyReceiver receiver=null;
//电话服务管理器
TelephonyManager manager=null;
ITelephony ibinder=null;
@Override
public void onCreate() {
Log.i("TAG", "服务启动了");
manager=(TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
//通过反射方法拿该服务中的ITelephony对象
try {
Method method=manager.getClass().getDeclaredMethod("getITelephony", null);
//设置该私有方法是可以被调用的
method.setAccessible(true);
ibinder=(ITelephony) method.invoke(manager, null);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
dbUtil=new DBUtil(this);
//注册广播接收器
registMyReceiver();
//广播接收器能够接收到短信到来时的系统广播
//挂断黑名单电话
//监听电话的状态
listenPhoneState();
super.onCreate();
}
private void listenPhoneState() {
PhoneStateListener listener=new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, final String incomingNumber) {
//监听电话的状态
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://空闲状态
break;
case TelephonyManager.CALL_STATE_OFFHOOK://通话状态不干预
break;
case TelephonyManager.CALL_STATE_RINGING://响铃
//来电是否是黑名单电话
if(dbUtil.isBlackNumber(incomingNumber)){
try {
Log.i("TAG", "黑名单电话来电话了");
//挂断
ibinder.endCall();
//将系统通话记录表中生成的数据清空
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
dbUtil.deleteCalllog(MyService.this, incomingNumber);
}
}, 5000);
} catch (RemoteException e) {
e.printStackTrace();
}
}
default:
break;
}
super.onCallStateChanged(state, incomingNumber);
}
};
manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}
private void registMyReceiver() {
receiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(SMS_RECEIVE);
//过滤拨出电话的广播
filter.addAction(OUTGOING_CALL);
filter.setPriority(1000);
registerReceiver(receiver, filter);
}
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if(SMS_RECEIVE.equals(action)){
Log.i("TAG", "有短信发来");
//拿到短信的电话号码
Bundle bundle=intent.getExtras();
String number=SMSManager.getNumberFromSMS(bundle);
//判断电话是否是黑名单电话
if(dbUtil.isBlackNumber(number)){
Log.i("TAG", "黑名单短信");
//阻止短信继续向下传递
abortBroadcast();
//把发来的短信的内容存入短信黑名单列表
SMS sms=new SMS();
sms.setNumber(number);
sms.setBody(SMSManager.getBodyFromSMS(bundle));
sms.setDate(System.currentTimeMillis());
dbUtil.insertSMS(sms);
}
}
if(OUTGOING_CALL.equals(action)){
Log.i("TAG", "打出电话");
//获得打出的电话号码
String number=getResultData();
//判断是否是黑名单电话
if(dbUtil.isBlackNumber(number)){
Log.i("TAG", "打出的电话是黑名单电话");
//电话不再拨出
setResultData(null);
//把打电话的信息写入到拨出记录中
Phone phone=new Phone();
phone.setNumber(number);
phone.setDate(System.currentTimeMillis());
//拨出去的电话
phone.setType(2);
dbUtil.insertPhone(phone);
}
}
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
Log.i("TAG", "停止监听");
manager.listen(null, PhoneStateListener.LISTEN_CALL_STATE);
manager=null;
//注销广播接收器
unregisterReceiver(receiver);
super.onDestroy();
}
}
uitl 工具类
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.provider.CallLog;
import com.karen.entity.Phone;
import com.karen.entity.SMS;
/**
* 数据库的管理类
* 完成对数据库表的增删改查的操作
* @author pjy
*
*/
public class DBUtil {
MyDBHelper helper=null;
public DBUtil(Context context){
helper=MyDBHelper.getInstance(context);
}
//黑名单的电话的添加
public void insertBlackNumber(String number){
SQLiteDatabase database= helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("number", number);
database.insert("blacktable", null, values);
}
//判断是否是一个黑名单电话
public boolean isBlackNumber(String number){
SQLiteDatabase database=helper.getReadableDatabase();
String selection="number=?";
String args[]=new String[]{number};
Cursor cursor=database.query("blacktable", null, selection, args, null, null, null);
if(cursor.moveToNext()){
return true;
}
cursor.close();
return false;
}
/**
* 添加一条黑名单短信
*/
public void insertSMS(SMS sms){
SQLiteDatabase database=helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("number", sms.getNumber());
values.put("body", sms.getBody());
values.put("date", sms.getDate());
database.insert("smstable", null, values);
}
/**
* 插入一条拨出的黑名单电话
*/
public void insertPhone(Phone phone){
SQLiteDatabase database=helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("number", phone.getNumber());
values.put("type", phone.getType());
values.put("date", phone.getDate());
database.insert("phonetable", null, values);
}
//删除黑名单打来的通话记录
public void deleteCalllog(Context context,String number){
ContentResolver resolver=context.getContentResolver();
Uri uri=CallLog.Calls.CONTENT_URI;
String where="number=?";
String[] args=new String[]{number};
resolver.delete(uri, where, args);
}
}
创建的数据库
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBHelper extends SQLiteOpenHelper {
//实现数据库的创建 phone.db
//表的创建
//1.blacktable 黑名单电话表
//2.smstable 短信记录表
//3.phonetable 拨出电话表
private static MyDBHelper helper=null;
private MyDBHelper(Context context) {
super(context, "phone.db", null, 1);
}
public static synchronized MyDBHelper getInstance(Context context){
if(helper==null){
helper=new MyDBHelper(context);
}
return helper;
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建表的操作
String sql1="create table blacktable(id integer primary key autoincrement,number text not null)";//实现第一张表的创建
String sql2="create table " +
"smstable(id integer primary key autoincrement," +
"number text not null," +
"body text not null," +
"date integer not null)";
String sql3="create table " +
"phonetable(id integer primary key autoincrement," +
"number text not null," +
"type integer not null," +
"date integer not null)";
db.execSQL(sql1);
db.execSQL(sql2);
db.execSQL(sql3);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
短信管理类
import android.os.Bundle;
import android.telephony.SmsMessage;
public class SMSManager {
public static String getNumberFromSMS(Bundle bundle) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messagees = new SmsMessage[pdus.length];
messagees[0] = SmsMessage.createFromPdu((byte[]) pdus[0]);
String number = messagees[0].getOriginatingAddress();
return number;
}
public static String getBodyFromSMS(Bundle bundle){
Object[] pdus=(Object[])bundle.get("pdus");
SmsMessage[] messages=new SmsMessage[pdus.length];
StringBuilder builder=new StringBuilder();
for(int i=0;i<pdus.length;i++){
byte[] pdu=(byte[])pdus[i];
messages[i]= SmsMessage.createFromPdu(pdu);
builder.append(messages[i].getDisplayMessageBody()) ;
}
return builder.toString();
}
}
剩下的实体类和main类应该很简单了,另外需要在清单配置文件中注册几个权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>