package com.tigertian.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("SMSReceiver, isOrderedBroadcast()="
+ isOrderedBroadcast());
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage smsMessage[] = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++) {
smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
if(smsMessage[n].getMessageBody().contains("hahaha")){
this.abortBroadcast();
}
System.out.println(smsMessage[n].getOriginatingAddress()+" "+smsMessage[n].getMessageBody()+" "+smsMessage[n].getIndexOnIcc());
}
}
}
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("SMSReceiver, isOrderedBroadcast()="
+ isOrderedBroadcast());
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage smsMessage[] = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++) {
smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
if(smsMessage[n].getMessageBody().contains("hahaha")){
this.abortBroadcast();
}
System.out.println(smsMessage[n].getOriginatingAddress()+" "+smsMessage[n].getMessageBody()+" "+smsMessage[n].getIndexOnIcc());
}
}
}
<receiver android:name=".SMSReceiver">
<intent-filter android:priority="10000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
上面的代碼是一個(gè)消息監(jiān)聽,監(jiān)聽接收短信的消息。我們可以從控制臺(tái)打印信息里面看到,他是一個(gè)OrderedBroadcast,根據(jù)這一點(diǎn)我們就可以對(duì)短信機(jī)制進(jìn)行攔截。如何攔截呢?<intent-filter android:priority="10000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
首先要聲明一個(gè)消息監(jiān)聽器,同時(shí)根據(jù)上面的配置文件需要在AndroidManifest.xml中配置好,注意它的優(yōu)先級(jí)是10000,這一點(diǎn)很關(guān)鍵,因?yàn)镺rderedBroadcast是根據(jù)優(yōu)先級(jí)來傳遞消息的,優(yōu)先級(jí)越高越先獲取到消息,待處理完后才會(huì)傳遞給下一個(gè)監(jiān)聽器,如果當(dāng)前監(jiān)聽器退出廣播,那么后面的所有監(jiān)聽器都將無法收到消息。
其次我們需要實(shí)現(xiàn)onReceive方法,根據(jù)上面的代碼,我們可以從bundle中拿到短信內(nèi)容并還原成SmsMessage,這樣我們可以根據(jù)特定條件來判斷哪些是需要我們攔截并且不要讓用戶知道的,哪些是我們可以放行的。需要我們攔截的短信,我們可以在收到后直接abortBroadcast()(上面的代碼中是判斷當(dāng)短信內(nèi)容包含hahaha的時(shí)候直接攔截),這樣系統(tǒng)收件箱將無法接收到該條短信,繼而也就不會(huì)有notification去通知用戶。
至此,應(yīng)用編寫好之后,短信攔截功能就完成了,當(dāng)然基于此還可以做一些其他功能,這方面就看需求了。注意,優(yōu)先級(jí)相同,則根據(jù)包名依次傳遞廣播。
想刪除收件箱中已存在的短信,請(qǐng)參考Android源碼SmsProvider類,可以在你的應(yīng)用中使用ContentProvider機(jī)制進(jìn)行操作。
---------------------------------------------------------
專注移動(dòng)開發(fā)
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian