Khi thiết bị Android nhận được tin nhắn SMS, hệ thống sẽ phát sóng broadcast với action android.provider.Telephony.SMS_RECEIVED. Để bắt sự kiện này, cần tạo BroadcastReceiver và đăng ký trong AndroidManifest.xml:
<receiver android:name=".SmsBroadcastReceiver">
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Giá trị android:priority xác định thứ tự ưu tiên xử lý broadcast. Mức ưu tiên cao (ví dụ 999) giúp ứng dụng tiếp nhận tin nhắn trước các ứng dụng khác và hệ thống.
Ví dụ lớp xử lý SMS:
package com.example.smsdemo;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
public class SmsBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Kiểm tra dữ liệu intent
Bundle extra = intent.getExtras();
if (extra == null) return;
// Phân tích dữ liệu SMS
Object[] pdus = (Object[]) extra.get("pdus");
if (pdus == null || pdus.length == 0) return;
// Khởi tạo mảng SMS
SmsMessage[] messages = new SmsMessage[pdus.length];
StringBuilder content = new StringBuilder();
String sender = "";
long timestamp = 0;
// Giải mã các gói tin SMS
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
content.append(messages[i].getDisplayMessageBody());
sender = messages[i].getDisplayOriginatingAddress();
timestamp = messages[i].getTimestampMillis();
}
// Định dạng thời gian
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timeStr = sdf.format(new Date(timestamp));
// Ghi log thông tin SMS
Log.d("SMS_RECEIVER", "So dien thoai: " + sender);
Log.d("SMS_RECEIVER", "Thoi gian: " + timeStr);
Log.d("SMS_RECEIVER", "Noi dung: " + content.toString());
// Hủy broadcast (ngan khong cho ung dung khac nhan tin)
this.abortBroadcast();
}
}
Lưu ý:
- Hàm
abortBroadcast()chỉ hoạt động khi receiver có cùng quyền ưu tiên với hệ thống - Tin nhắn dài sẽ được chia thành nhiều gói PDU, cần ghép nối nội dung các gói để có bản tin hoàn chỉnh
- Hủy broadcast sẽ ngăn hệ thống hiển thị thông báo SMS tiêu chuẩn