Xử lý tin nhắn SMS trên Android

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

Thẻ: Android SMS broadcastreceiver

Đăng vào ngày 9 tháng 6 lúc 22:15