import com.example.mobilesafe.db.dao.BlackNumber;
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.gsm.SmsManager;
import android.telephony.gsm.SmsMessage;
//创建一个service类,并设置在某个时刻开启和关闭
public class CallSafeService extends Service {
//这是我项目的需要自己写的类,实际上跟短息服务没啥大的关系
public BlackNumber bk;
public IBinder onBind(Intent arg0)
{
// TODO Auto-generated method stub
return null;
}
//服务创建时会调用的方法
public void onCreate()
{
super.onCreate();
//自定义的内部类
InnerReceiver inner=new InnerReceiver();
//设置过滤器,接收收到信息的广播
IntentFilter intentFilter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
//android.provider.Telephony.SMS_RECEIVED 是android内置的接收消息的内容提供者,你可以根据自己的需要选择其他的内容提供者
//设置权限
intentFilter.setPriority(Integer.MAX_VALUE);
//注册广播(这是动态的注册广播)也可以配置文件里手动为服务增加过滤项
registerReceiver(inner, intentFilter);
bk=new BlackNumber(this);
}
//定义一个广播接收者的内部类
public class InnerReceiver extends BroadcastReceiver
{
//当有信息到来时回调的方法
public void onReceive(Context context, Intent intent)
{
System.out.println("短信来了");
//拿到短信的对象
Object[] objects=(Object[]) intent.getExtras().get("pdus");
//// 短信最多140字节,
// 超出的话,会分为多条短信发送,所以是一个数组,因为我们的短信指令很短,所以for循环只执行一次
for(Object ob:objects)
{
SmsMessage sms = SmsMessage.createFromPdu((byte[]) ob);
String originAddress=sms.getOriginatingAddress();//得到电话
String body=sms.getMessageBody();//得到内容主体
//通过短信的电话号码查询拦截的模式
String mode = bk.findNumber(originAddress);
//下面这些是我项目需要的业务逻辑,实际上拦截只需要 abortBroadcast();这句就够啦,你也可以根据自己的条来选择性的拦截
/**
* 黑名单拦截模式
* 1 全部拦截 电话拦截 + 短信拦截
* 2 电话拦截
* 3 短信拦截
*/
if(mode.equals("1"))
{
//终止信息传播
abortBroadcast();
}else if(mode.equals("3"))
{
abortBroadcast();
}
}
}
}
//服务结束
public void onDestroy()
{
// TODO Auto-generated method stub
super.onDestroy();
}
}