当前位置:首页 > 行业动态 > 正文

安卓广播 短信数据库

安卓广播处理系统事件,短信数据库存储信息,应用监听广播可读写 数据库

安卓广播机制

广播类型

类型 说明 触发场景
系统广播 由系统事件触发(如网络变化、电量不足) 系统级事件通知
应用内广播 同一应用内组件间通信 自定义事件传递
有序广播 按优先级顺序传递,可中断 需按顺序处理的事件(如闹钟)
无序广播 无顺序广播,无法被截断 全局通知(如屏幕熄灭)

核心组件

  • BroadcastReceiver:接收广播的组件
  • IntentFilter:声明接收的广播类型
  • LocalBroadcastManager:应用内广播管理器(避免跨应用泄露)

注册方式

方式 特点 适用场景
静态注册(AndroidManifest) 常驻生效,系统重启后仍有效 系统级广播(如开机启动)
动态注册(代码) 需在运行时注册,灵活性高 临时性广播监听

短信数据库操作

内容提供者(ContentProvider)

  • 访问入口content://sms/(Android Q以下)
  • 权限要求
    • READ_SMS:读取短信
    • WRITE_SMS:发送/删除短信
    • RECEIVE_SMS:监听短信到达

短信URI结构

URI 说明
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿箱
content://sms/outbox 发件箱(部分ROM支持)

常用字段

字段名 类型 说明
_id INTEGER 唯一标识
address TEXT 手机号
date INTEGER 时间戳
body TEXT
type INTEGER 短信类型(1=收件,2=发件)

操作示例

// 查询收件箱短信
Uri uri = Uri.parse("content://sms/inbox");
Cursor cursor = getContentResolver().query(uri, null, null, null, "date DESC");
while (cursor.moveToNext()) {
    String address = cursor.getString(cursor.getColumnIndex("address"));
    String body = cursor.getString(cursor.getColumnIndex("body"));
    // 处理数据
}

广播与短信数据库关联场景

场景 广播类型 触发条件 处理逻辑
短信到达通知 RECEIVE_SMS 新短信接收 通过BroadcastReceiver读取数据库并解析内容
短信发送状态 SENT_SMS_ACTION 短信发送完成 更新数据库状态字段

相关问题与解答

问题1:如何监听短信到达并获取内容?

解答

安卓广播 短信数据库

  1. AndroidManifest.xml中注册RECEIVE_SMS权限和广播接收器:
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <receiver android:enabled="true" android:exported="true">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>
  2. BroadcastReceiver中通过Bundle提取短信内容:
    public class SmsReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            Object[] pdus = (Object[]) bundle.get("pdus");
            for (Object pdu : pdus) {
                SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
                String content = sms.getMessageBody();
                // 处理短信内容
            }
        }
    }

问题2:Android Q以上版本如何访问加密短信数据库?

解答

安卓广播 短信数据库

  1. 使用Telephony.Sms.CONVERSATIONS替代传统URI:
    Uri conversationUri = Uri.parse("content://telephony/smsinbox"); // Android Q+推荐
  2. 通过Conversation表关联消息:
    SELECT  FROM sms JOIN conversations 
    ON sms.conversation_id = conversations._id;
  3. 注意动态申请READ_EXTERNAL_STORAGE权限(部分厂商兼容