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>
上面的代碼是一個消息監聽,監聽接收短信的消息。我們可以從控制臺打印信息里面看到,他是一個OrderedBroadcast,根據這一點我們就可以對短信機制進行攔截。如何攔截呢?<intent-filter android:priority="10000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
首先要聲明一個消息監聽器,同時根據上面的配置文件需要在AndroidManifest.xml中配置好,注意它的優先級是10000,這一點很關鍵,因為OrderedBroadcast是根據優先級來傳遞消息的,優先級越高越先獲取到消息,待處理完后才會傳遞給下一個監聽器,如果當前監聽器退出廣播,那么后面的所有監聽器都將無法收到消息。
其次我們需要實現onReceive方法,根據上面的代碼,我們可以從bundle中拿到短信內容并還原成SmsMessage,這樣我們可以根據特定條件來判斷哪些是需要我們攔截并且不要讓用戶知道的,哪些是我們可以放行的。需要我們攔截的短信,我們可以在收到后直接abortBroadcast()(上面的代碼中是判斷當短信內容包含hahaha的時候直接攔截),這樣系統收件箱將無法接收到該條短信,繼而也就不會有notification去通知用戶。
至此,應用編寫好之后,短信攔截功能就完成了,當然基于此還可以做一些其他功能,這方面就看需求了。注意,優先級相同,則根據包名依次傳遞廣播。
想刪除收件箱中已存在的短信,請參考Android源碼SmsProvider類,可以在你的應用中使用ContentProvider機制進行操作。
---------------------------------------------------------
專注移動開發
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian