1.开启服务后,自动监听短信和电话,查询黑名单数据库,如果需要拦截就拦截。
2.内部类,短信广播类和电话监听的类都是内部类
package com.example.mobilesafe.service;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import com.example.mobilesafe.db.dao.blackNumberDao;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.util.Log;
public class blackNumberService extends Service {
private smsReceiver smsReceiver;
private TelephonyManager tm;
private myPhoneStateListener mpsl;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// 注册广播接受者,屏蔽短信
IntentFilter ifr = new IntentFilter();
ifr.addAction("android.provider.Telephony.SMS_RECEIVED");
ifr.setPriority(1000);
smsReceiver = new smsReceiver();
registerReceiver(smsReceiver, ifr);
// 屏蔽通话
abordPhone();
super.onCreate();
}
/**
* 屏蔽通话
*/
private void abordPhone() {
// 得到电话管理者
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 监听通话
mpsl = new myPhoneStateListener();
tm.listen(mpsl, PhoneStateListener.LISTEN_CALL_STATE);
}
private class myPhoneStateListener extends PhoneStateListener {
@Override
public 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:
blackNumberDao dao = blackNumberDao
.getInstence(getApplicationContext());
// 得到电话是否在黑名单中,不在返回0,在黑名单中,返回屏蔽类型
int mode = dao.getMode(incomingNumber);
Log.d("来电mode", "" + mode);
// 判断是否需要屏蔽电话
if (mode == 2 || mode == 3) {
endCall();
}
break;
default:
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
@Override
public void onDestroy() {
if (smsReceiver != null)
unregisterReceiver(smsReceiver);
super.onDestroy();
}
public void endCall() {
// ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
try {
// 通过反射得到关闭通话的方法
// 1,获取ServiceManager字节码文件
Class<?> sm = Class.forName("android.os.ServiceManager");
// 2,获取方法
Method method = sm.getMethod("getService", String.class);
// 3,反射调用此方法
IBinder iBinder = (IBinder) method.invoke(null,
Context.TELEPHONY_SERVICE);
// 4,调用获取aidl文件对象方法
ITelephony telephony = ITelephony.Stub.asInterface(iBinder);
// 5,调用在aidl中隐藏的endCall方法
telephony.endCall();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class smsReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
// 收到短信就会运行这个方法
// 得到短信
Object[] objects = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : objects) {
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
String body = smsMessage.getMessageBody();
// 得到电话号码
String address = smsMessage.getOriginatingAddress();
blackNumberDao dao = blackNumberDao
.getInstence(getApplicationContext());
// 得到电话是否在黑名单中,不在返回0,在黑名单中,返回屏蔽类型
int mode = dao.getMode(address);
// 判断是屏蔽短信
if (mode == 1 || mode == 3) {
// 结束这个系统有序短信广播,屏蔽短信
abortBroadcast();
}
}
}
}
}