注:Android 4.3以及以後可能由使用者來控制程式的許可權,如果使用者關閉這個程式的許可權,意味著你無法監聽短信/操作短信內容

 

目前也有如小米系統在安裝時,讓使用者來控制許可權;360來監聽優先攔截短信等等(關於誰先安裝誰有優先權,動態註冊比靜態註冊優先順序別高等問題,在這些情況這裡就不講了)。。。

 

一,攔截廣播

 

import android.content.BroadcastReceiver;
import android.content.CoNtext;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

 

/**
* 短信廣播
* @author Admin
*
*/
public class SmsReceiver extends BroadcastReceiver {

 

public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";

 

@Override
public void onReceive(CoNtext coNtext, Intent intent)
{
if (intent.getAction().equals(SMS_RECEIVED_ACTION))
{
Bundle bundle = intent.getExtras();
if (bundle != null)
{
Object[] objArray = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[objArray.length];
for (int i = 0; i < objArray.length; i++)
{
messages[i] = SmsMessage.createFromPdu((byte[]) objArray[i]);
}

 

String phoneNum="";//電話號碼
StringBuilder sb = new StringBuilder();//短信內容

 

for (SmsMessage currentMessage : messages)
{
phoneNum=currentMessage.getDisplayOriginatingAddress();
sb.append(currentMessage.getDisplayMessageBody());
}

 

根據你策略的手機埠號/攔截關鍵字判斷進行是否中斷廣播(this.abortBroadcast();),
TODO
}
}
}
}

 

二、開啟一個服務開監聽資料庫

 

import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.os.IBinder;
import android.os.Process;

 

/**
* @author Administrator
*
*/
public class SmsService extends Service {

 

private SmsObserver mObserver;

 

@Override
public IBinder onBind(Intent intent) {
return null;
}

 

@Override
public void onCreate() {
在這裡啟動
ContentResolver resolver = getContentResolver();
mObserver = new SmsObserver(resolver, new SmsHandler(this));
resolver.registerContentObserver(Uri.parse("content://sms"), true, mObserver);
}

 

@Override
public void onDestroy() {
super.onDestroy();
this.getContentResolver().unregisterContentObserver(mObserver);
Process.killProcess(Process.myPid());
}
}

 

三、資料庫觀察者:

 

import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Message;



/**
* @author Administrator
*
*/
public class SmsObserver extends ContentObserver{

 

private ContentResolver mResolver;
public SmsHandler smsHandler;

 

public SmsObserver(ContentResolver mResolver,SmsHandler handler) {
super(handler);
this.mResolver=mResolver;
this.smsHandler=handler;
}

 

@Override
public void onChange(boolean selfChange) {
Cursor mCursor=mResolver.query(Uri.parse("content://sms/inbox"), new String[] { "_id", "address", "read", "body", "thread_id" }, "read=?", new String[] { "0" }, "date desc");

 

if(mCursor==null)
{
return;
}
else
{
while (mCursor.moveToNext())
{
SmsInfo _smsInfo=new SmsInfo();

 

int _inIndex=mCursor.getColumnIndex("_id");
if(_inIndex!=-1)
{
_smsInfo._id=mCursor.getString(_inIndex);
}

 

int thread_idIndex=mCursor.getColumnIndex("thread_id");
if(thread_idIndex!=-1)
{
_smsInfo.thread_id=mCursor.getString(thread_idIndex);
}

 

int addressIndex=mCursor.getColumnIndex("address");
if(addressIndex!=-1)
{
_smsInfo.smsAddress=mCursor.getString(addressIndex);
}

 

int bodyIndex=mCursor.getColumnIndex("body");
if(bodyIndex!=-1)
{
_smsInfo.smsBody=mCursor.getString(bodyIndex);
}

 

int readIndex=mCursor.getColumnIndex("read");
if(readIndex!=-1)
{
_smsInfo.read=mCursor.getString(readIndex);
}

 

根據你的攔截策略,判斷是否不對短信進行操作;將短信設置為已讀;將短信刪除
TODO
Message msg=smsHandler.obtainMessage();
_smsInfo.action=2;//0不對短信進行操作;1將短信設置為已讀;2將短信刪除
msg.obj=_smsInfo;
smsHandler.sendMessage(msg);
}
}

 

if(mCursor!=null)
{
mCursor.close();
mCursor=null;
}
}
}

 

四、短信處理類

 

import android.content.ContentValues;
import android.content.CoNtext;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;

 

/**
* @author 短信的處理
*
*/
public class SmsHandler extends Handler
{
private CoNtext mcoNtext;

 

public SmsHandler(CoNtext coNtext)
{
this.mcoNtext=coNtext;
}

 

@Override
public void handleMessage(Message msg)
{
SmsInfo smsInfo=(SmsInfo)msg.obj;

 

if(smsInfo.action==1)
{
ContentValues values = new ContentValues();
values.put("read", "1");
mcoNtext.getContentResolver().update(Uri.parse("content://sms/inbox"), values, "thread_id=?", new String[]{smsInfo.thread_id});
}
else if(smsInfo.action==2)
{
Uri mUri=Uri.parse("content://sms/");
mcoNtext.getContentResolver().delete(mUri, "_id=?", new String[]{smsInfo._id});
}
}
}

 

五、SmsInfo 資料結構

 

/**
* 主要用於短信攔截
* @author Administrator
*
*/
 
public class SmsInfo {
public String _id="";
public String thread_id = "";
public String smsAddress = "";
public String smsBody = "";
public String read="";
public int action=0;//1代表設置為已讀,2表示刪除短信
}

 

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()