实现思路
1.MyDBhelper 创建数据库和3张表格
public class MyDBhelper extends SQLiteOpenHelper{
public MyDBhelper(Context context) {
super(context, "phone.db", null, 1);//固话构造方法,避免输入错误
Log.i("TAG", "onCreate2");
}
@Override
public void onCreate(SQLiteDatabase db) {
// 创建3张表
//1黑名单电话表 backphone(id,number)
Log.i("TAG", "onCreate");
String sql = "create table if not exists backphone("
+ "_id integer primary key autoincrement,"
+ "number text not null"
+ ")";
db.execSQL(sql);
//2黑名单的电话记录 phonelist(id,number,type,date) 会话,谁,打进打出,时间
String sql2 = "create table if not exists phonelist("
+ "_id integer primary key autoincrement,"
+ "number text not null,"
+ "type integer,"
+ "date integer"
+ ")";
db.execSQL(sql2);
//3黑名单的短信记录 smslist(id,number,body,date)
String sql3 = "create table if not exists smslist("
+ "id integer primary key autoincrement,"
+ "number text not null,"
+ "body text,"
+ "date integer"
+ ")";
db.execSQL(sql3);
Log.d("TAG", "MyDBhelper onCreate ok");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//表结构有变化时候>修改版本>启动此方法
// TODO Auto-generated method stub
}
}
2.DBManager 判断是不是黑名单,存入黑名单表,存入黑名单通话记录表,存入短信记录表
public class DBManager {
MyDBhelper helper = null;
public DBManager(Context context){
helper = new MyDBhelper(context);
}
//添加黑名单电话
public void insertBlackNumber(String number){
SQLiteDatabase sdb = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("number", number);
sdb.insert("backphone", null, values);
Log.i("TAG", "加入黑名单成功");
}
//判断是不是黑名单电话
public boolean isBlackNunber(String number){
SQLiteDatabase sdb = helper.getReadableDatabase();
String selection = "number=?";
Cursor cursor = sdb.query("backphone",
null,
selection,
new String[]{number},
null,
null,
null);
if(cursor.moveToNext()){
return true;
}
cursor.close();
return false;
}
//打入的黑电话号码保存在列表中
public void insertPhone(Phone phone){
SQLiteDatabase sdb = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("number", phone.getNumber());
values.put("type", phone.getType());
values.put("date", phone.getDate());
sdb.insert("phonelist", null, values);
Log.d("TAG", "insertPhone ok");
}
//将黑名单发过来的短信保存在短信列表中
public void insertSMS(SMS sms){
SQLiteDatabase sdb = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("number", sms.getNumber());
values.put("body", sms.getBody());
values.put("date", sms.getDate());
sdb.insert("smslist", null, values);
}
}
3.PhoneService 拦截短信,拦截打出黑名单电话
/**
* 1.黑名单短信的拦截 2/3.黑名单打进(出)电话时候挂断电话
*
* @author tarena
*
*/
public class PhoneService extends Service {
public final static String SMS_RECEIVI = "android.provider.Telephony.SMS_RECEIVED";
public final static String OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL";
DBManager dbmanager;
@Override
public void onCreate() {
super.onCreate();
dbmanager = new DBManager(this);
// 服务中注册广播接收器
// 拦截短信,对黑名单处理
registerPhoneReceiver();
Log.e("TAG", "服务已经启动");
}
private void registerPhoneReceiver() {
receiver = new PhoneReceiver();
IntentFilter filter = new IntentFilter();
//定义接收短信广播
filter.addAction(SMS_RECEIVI);
//订阅打出电话的有序广播
filter.addAction(OUTGOING_CALL);
filter.setPriority(1000);
registerReceiver(receiver, filter);
}
PhoneReceiver receiver;
public class PhoneReceiver extends BroadcastReceiver {
// 收到短信内容会回调
@Override
public void onReceive(Context context, Intent intent) {
// 拆解短信1.拿到电话号码2.判断是否为黑名单
String action = intent.getAction();
if (SMS_RECEIVI.equals(action)) {//回掉原因是收到短信
Bundle b = intent.getExtras();
Log.i("TAG", "短信拦截广播");
String number = SMSManager.getNumberFromSMS(b);
// 判断是不是黑名单发过来的
if (dbmanager.isBlackNunber(number)) {
String body = SMSManager.getBodyFromSMS(b);
Log.i("TAG", "黑名单短信发过来");
// 拦截短信
abortBroadcast();
// 存入短信列表
SMS sms = new SMS();
sms.setBody(body);
sms.setDate(System.currentTimeMillis());
sms.setNumber(number);
}
}else if(OUTGOING_CALL.endsWith(action)){//回调原因是因为打出号码
Log.i("TAG", "打出电话");
String number = getResultData();//拿到的是一手数据(从广播中获取电话号码)
//如果是黑名单则拦截黑名单
if(dbmanager.isBlackNunber(number)){
Log.i("TAG", "打出黑名单电话号码");
//将电话置空
setResultData(null);
//记录信息
Phone phone = new Phone();
phone.setType(2);
phone.setDate(System.currentTimeMillis());
phone.setNumber(number);
//存入电话信息表
dbmanager.insertPhone(phone);
}
}
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(receiver!=null){
unregisterReceiver(receiver);
Log.i("TAG", "unregisterReceiver");
receiver=null;
}
}
}
4.Phone SMS 封装实体类
public class Phone {
private int _id;
private String number;
private int type;
private long date;
public Phone() {
super();
// TODO Auto-generated constructor stub
}
public Phone(int _id, String number, int type, long date) {
super();
this._id = _id;
this.number = number;
this.type = type;
this.date = date;
}
public int get_id() {
return _id;
}
public void set_id(int _id) {
this._id = _id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public long getDate() {
return date;
}
public void setDate(long date) {
this.date = date;
}
@Override
public String toString() {
return "Phone [_id=" + _id + ", number=" + number + ", type=" + type + ", date=" + date + "]";
}
}
public class SMS {
private int id;
private String number;
private String body;
private long date;
public SMS() {
super();
// TODO Auto-generated constructor stub
}
public SMS(int id, String number, String body, long date) {
super();
this.id = id;
this.number = number;
this.body = body;
this.date = date;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public long getDate() {
return date;
}
public void setDate(long date) {
this.date = date;
}
@Override
public String toString() {
return "SMS [id=" + id + ", number=" + number + ", body=" + body + ", date=" + date + "]";
}
}
5.SMSManager 获取短信号码 ,获取短信内容
public class SMSManager {
/** 根据拦击的短信来查询电话号码 */
public static String getNumberFromSMS(Bundle b) {
Object[] pdus = (Object[]) b.get("pdus");
SmsMessage[] smses = new SmsMessage[pdus.length];
smses[0] = SmsMessage.createFromPdu((byte[]) pdus[0]);
String number = smses[0].getOriginatingAddress();
return number;
}
/**
* 获得短信内容
*
* @return
*/
public static String getBodyFromSMS(Bundle b) {
//Android设备接收到的SMS是以pdu形式的(protocol description unit)。所以从intent提取数据时就会遇到pdus
Object[] pdus = (Object[]) b.get("pdus");
SmsMessage[] smses = new SmsMessage[pdus.length];
//提取短信内容
for (int i = 0; i < pdus.length; i++) {
smses[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
StringBuilder builder = new StringBuilder();
//短信内容拼接(大于140字节)
for (int i = 0; i < smses.length; i++) {
builder.append(smses[i].getMessageBody());
}
return builder.toString();
}
}
6.mainActivity 获取拦截号码,启动和拦截服务
public class MainActivity extends Activity {
private EditText etadd;
private DBManager dbmanager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etadd = (EditText) findViewById(R.id.etadd_blackphone);
dbmanager = new DBManager(this);
}
public void add(View v){//添加黑名单
String number = etadd.getText().toString();
dbmanager.insertBlackNumber(number);
Toast.makeText(this, "添加成功", 0).show();
etadd.setText("");
}
public void start(View v){//开启监听
Intent intent = new Intent(this, PhoneService.class);
startService(intent);
}
public void stop(View v){//停止监听
Intent intent = new Intent(this, PhoneService.class);
stopService(intent);
}
}
添加拦截号码后启动服务拦截短信(abortBroadcast())和电话广播(setResultData(null)),实现拦截;
附加:清单配置文件和布局文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.backphone"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<!-- 接收短信的权限(短信拦截) -->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<!-- 打电话权限 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
<!-- 订阅系统的打电话时发出的广播权限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.backphone.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.example.service.PhoneService"></service>
</application>
</manifest>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/etadd_blackphone"
android:inputType="phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入要加入黑名单的电话号码" />
<Button
android:id="@+id/btnadd_blackphone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/etadd_blackphone"
android:layout_below="@+id/etadd_blackphone"
android:layout_marginTop="26dp"
android:onClick="add"
android:text="添加" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/btnadd_blackphone"
android:layout_alignRight="@+id/btnadd_blackphone"
android:layout_below="@+id/btnadd_blackphone"
android:layout_marginTop="26dp"
android:onClick="start"
android:text="启动监听" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button1"
android:layout_alignRight="@+id/button1"
android:layout_below="@+id/button1"
android:layout_marginTop="26dp"
android:onClick="stop"
android:text="停止监听" />
</RelativeLayout>