向 content://sms 插入一條未讀短信,並觸發系統通知欄提示,效果等同真實收到短信,且無需重啟模擬器/手機。
ContentValues 插入短信數據庫SMS_RECEIVED_ACTION 廣播通知系統短信應用ContentValues values = new ContentValues();
values.put("address", phoneNumber); // 發送方號碼
values.put("body", messageBody); // 短信內容
values.put("date", System.currentTimeMillis());
values.put("read", 0); // 0=未讀
values.put("type", 1); // 1=接收
context.getContentResolver().insert(Uri.parse("content://sms"), values);
系統短信應用監聽 android.provider.Telephony.SMS_RECEIVED 廣播,發送該廣播即可觸發原生通知:
Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED");
// 構造模擬 PDU 數據(簡化版,完整需編碼 PDU)
intent.putExtra("pdus", new Object[]{/* 模擬 SmsMessage PDU */});
intent.putExtra("format", "3gpp");
context.sendBroadcast(intent, "android.permission.RECEIVE_SMS"); // 需權限
注意:Android 4.4+ 只有默認短信應用能接收此廣播,且需 RECEIVE_SMS 權限。普通應用無法直接發送帶權限的廣播。
若無法發送系統廣播,可自行構建通知引導用戶進入短信應用:
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_sms)
.setContentTitle(phoneNumber)
.setContentText(messageBody)
.setAutoCancel(true)
.setContentIntent(PendingIntent.getActivity(context, 0,
new Intent(Intent.ACTION_VIEW, Uri.parse("content://sms")), 0));
NotificationManagerCompat.from(context).notify(1, builder.build());
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" /> // 僅系統應用可用
content://sms 需為默認短信應用或獲取 WRITE_SMS 權限(用戶手動授予)。結合數據庫寫入與自建通知,可實現「插入短信並提醒」的業務閉環,但完全模擬系統級推送受限於權限機制。