當裝置接收到一條新的SMS消息時,就會廣播一個包含了android.provider.Telephony.SMS_RECEIVED動作的Intent。注意,這個動作是一個字元串值,SDK 1.0不再包含對這個字元串的引用,是以,在你的應用程式中,你需要顯式的指定它。
對于應用程式監聽SMS Intent廣播,首先需要添加RECEIVE_SMS權限。通過在應用程式manifest中添加一個uses-permission,如下面的片段所示:
<uses-permission android:name=”android.permission.RECEIVE_SMS”/>
SMS廣播Intent包含了新來SMS的細節。為了提取包裝在SMS廣播Intent的Bundle中的SmsMessage對象數組,使用pdus key來提取SMS pdus數組,其中,每個對象表示一個SMS消息。将每個pdu位元組數組轉化成SmsMessage對象,調用SmsMessage.createFromPdu,傳入每個位元組數組,如下面的片段所示:
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get(“pdus”);
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++)
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
每個SmsMessage對象包含SMS 消息的細節,包括源位址(手機号),時間和消息體。
下面的例子示範了一個Broadcast Receiver實作了onReceive函數來檢查新來的短信是否以@echo字元串開始,如果是,發送相同的文本給那個手機:
public class IncomingSMSReceiver extends BroadcastReceiver
{
private static final String queryString = “@echo “;
private static final String SMS_RECEIVED = “android.provider.Telephony.SMS_RECEIVED”;
public void onReceive(Context _context, Intent _intent)
if (_intent.getAction().equals(SMS_RECEIVED))
SmsManager sms = SmsManager.getDefault();
Bundle bundle = _intent.getExtras();
if (bundle != null)
for (SmsMessage message : messages)
String msg = message.getMessageBody();
String to = message.getOriginatingAddress();
if (msg.toLowerCase().startsWith(queryString))
String out = msg.substring(queryString.length());
sms.sendTextMessage(to, null, out, null, null);
為了監聽短信,使用Intent Filter來注冊Broadcast Receiver,使其監聽android.provider.Telephony.SMS_RECEIVED動作,如下面的片段所示:
final String SMS_RECEIVED = “android.provider.Telephony.SMS_RECEIVED”;
IntentFilter filter = new IntentFilter(SMS_RECEIVED);
BroadcastReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
==============================================