編輯:關於android開發
前面我們把需要攔截的手機號都存儲和展示出來了,接下來是使用廣播接收者攔截短信了,這個廣播接收者需要和一個服務綁定,服務開啟的時候,接收者存在,服務停掉時,接收者關閉
在service包下定義一個類CallSmsSafeService繼承系統的Service
重寫onCreate()方法
獲取BroadcastReceiver對象,new出來
調用registerReceiver()方法,注冊廣播,參數:BroadcastReceiver對象,IntentFillter對象
重寫onDestory()方法
調用unregisterReceiver()方法,參數:BroadcastReceiver對象
BroadcastReceiver對象置為null
定義一個內部類InnerSmsReceiver繼承系統的BroadcastReceiver
重寫 onReceive()方法,傳遞進來參數:Context對象,Intent對象
調用Intent對象的getExtras().get(“pdus”)方法,獲取到Object[]數組
for循環Object[]數組,每個是Object對象
調用SmsMessage.createFromPdu()方法,獲取到SmsMessage對象,參數:byte[]數組,強轉Object對象
調用SmsMessage對象的getOriginatingAddress()方法,得到String發件人
調用Dao對象的查詢數據庫方法,查出這條短信的攔截模式
判斷攔截模式,如果是全部攔截3或者短信攔截2,就調用abortBroadcast()方法
在設置中心對上面的服務進行配置,達到開啟和關閉的功能
查看這篇:http://www.cnblogs.com/taoshihan/p/5468523.html
CallSmsSafeService.java
package com.qingguow.mobilesafe.service;
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.SmsMessage;
import com.qingguow.mobilesafe.db.ado.BlackNumberAdo;
/**
* 短息電話攔截服務
* @author taoshihan
*
*/
public class CallSmsSafeService extends Service {
private InnerSmsReceiver receiver;
private BlackNumberAdo ado;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
/**
* 服務創建
*/
@Override
public void onCreate() {
receiver=new InnerSmsReceiver();
IntentFilter filter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
ado=new BlackNumberAdo(getApplicationContext());
registerReceiver(receiver, filter);
super.onCreate();
}
/**
* 接收廣播
* @author taoshihan
*
*/
private class InnerSmsReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Object[] objs=(Object[]) intent.getExtras().get("pdus");
for(Object obj:objs){
SmsMessage sms=SmsMessage.createFromPdu((byte[]) obj);
String sender=sms.getOriginatingAddress();
String mode=ado.find(sender);
if(mode!=null){
if (mode.equals("2") || mode.equals("3")) {
System.out.println("攔截短信:" + sender);
abortBroadcast();
}
}
}
}
}
@Override
public void onDestroy() {
unregisterReceiver(receiver);
receiver=null;
super.onDestroy();
}
}

ado類
package com.qingguow.mobilesafe.db.ado;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.qingguow.mobilesafe.db.BlackNumberDBOpenHelper;
public class BlackNumberAdo {
private BlackNumberDBOpenHelper helper;
public BlackNumberAdo(Context context) {
helper = new BlackNumberDBOpenHelper(context);
}
/**
* 插入數據
*
* @param phone
* @param mode
*/
public void add(String phone, String mode) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("phone", phone);
values.put("mode", mode);
db.insert("blacknumber", null, values);
db.close();
}
/**
* 查詢全部
*
* @return
*/
public List<Map<String, String>> findAll() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery(
"select phone,mode from blacknumber order by id desc", null);
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
while (cursor.moveToNext()) {
Map<String, String> info = new HashMap<String, String>();
String phone = cursor.getString(0);
String mode = cursor.getString(1);
info.put("phone", phone);
info.put("mode", mode);
list.add(info);
}
cursor.close();
db.close();
return list;
}
/**
* 修改數據
*
* @param phone
* @param mode
*/
public void update(String phone, String mode) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("phone", phone);
values.put("mode", mode);
db.update("blacknumber", values, "phone=?", new String[] { phone });
db.close();
}
/**
* 刪除數據
*
* @param phone
*/
public void delete(String phone) {
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("blacknumber", "phone=?", new String[] { phone });
db.close();
}
/**
* 查找單條
*
* @param phone
*/
public String find(String phone) {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery(
"select mode from blacknumber where phone=?",
new String[] { phone });
if (cursor.moveToNext()) {
String mode = cursor.getString(0);
return mode;
}
return null;
}
}
android6.0權限管理工具EasyPermissionUtil
android6.0權限管理工具EasyPermissionUtil 前言 android6.0開始,權限的申請發生了改變,申請變的動態化,也就是運行時權限,和iOS相仿
Android幾種常見的多渠道(批量)打包方式介紹
Android幾種常見的多渠道(批量)打包方式介紹 多渠道打包,主要是為了統計不同的渠道上包的下載數量,渠道越多,我們需要打的包數量越多,這個時候,我們沒法去使用單純
Android自動化構建之Ant多渠道打包實踐分析(下)
Android自動化構建之Ant多渠道打包實踐分析(下) 前言 上一篇(Android自動化構建之Ant多渠道打包實踐分析(上))已經介紹了Android的apk是如何構
Android 不一樣的原生分享,android分享
Android 不一樣的原生分享,android分享Android做分享功能百度一下就兩種方案,其一是用系統原生的Activity,最終彈出一個對話框,下面這種的還好,像