簡訊發送三大模式對比
| 模式 | 原理 | 適用場景 |
| 網關發送 | App → 運營商網關 → 手機 | 網站服務、大量群發、伺服器端 |
| AT 指令 (PC 連手機) | PC 透過資料線 + AT 指令控制手機發送 | PC 端工具、同步軟體 |
| 手機端 J2ME 發送 (本文重點) | 手機上運行的 MIDlet 直接發送 | 行動應用、即時通訊、位置回報 |
WMA (Wireless Messaging API) 基礎
- MIDP 2.0 內建支援
javax.wireless.messaging
- MIDP 1.0 需廠商擴展 JAR (API 基本相容)
- 支援文字簡訊 (
TEXT_MESSAGE) 與二進位簡訊 (BINARY_MESSAGE)
核心發送程式碼 (工具類)
package my.util;
import javax.wireless.messaging.*;
import javax.microedition.io.*;
public class SMSUtil {
/**
* 發送文字簡訊
* @param content 簡訊內容
* @param phoneNumber 手機號碼 (不含 + 號)
* @return 成功 true / 失敗 false
*/
public static boolean send(String content, String phoneNumber) {
boolean result = true;
try {
// 協議格式:sms://+國碼號碼
String address = "sms://+" + phoneNumber;
// 開啟連線
MessageConnection conn = (MessageConnection) Connector.open(address);
// 建立文字簡訊
TextMessage msg = (TextMessage) conn.newMessage(MessageConnection.TEXT_MESSAGE);
msg.setPayloadText(content);
// 發送
conn.send(msg);
conn.close();
} catch (Exception e) {
result = false;
// 生產環境建議記錄 e.getMessage() 或錯誤碼
}
return result;
}
}
關鍵細節補充
號碼格式處理
- 標準格式:
sms://+886912345678 (含國碼、前綴 +)
- 特殊號碼 (如 106 開頭的短碼):**不加 + 號**,格式:
sms://106xxxx
異常處理建議
catch (IOException e) {
// 網路/協議錯誤:訊號差、SIM 卡問題、運營商不支援
} catch (SecurityException e) {
// 權限不足:用戶拒絕、簽名問題、保護域限制
} catch (IllegalArgumentException e) {
// 參數錯誤:號碼格式、內容過長 (單條 160 字元/70 中文字)
}
進階功能
- 二進位簡訊:
BinaryMessage + setPayloadData(byte[]),用於 WAP Push、OTA 設定、資料傳輸
- 接收簡訊:註冊
MessageListener 或輪詢 conn.receive(),需在 JAD 宣告 MIDlet-Push-1 實現啟動攔截
- 多段簡訊:內容超長時自動分段,或手動控制 UDH (User Data Header)
權限與簽名 (關鍵部署門檻)
| 保護域 | 發送權限 | 備註 |
| Untrusted | 每次彈窗詢問用戶 | 體驗極差,不適合生產 |
| Trusted / 簽名 | 可設為「允許永不詢問」 | 需向運營商/廠商申請簽名證書 |
| Manufacturer/Operator | 靜默發送無提示 | 預置應用專用 |
實際商用專案務必解決簽名問題,否則用戶每發一條簡訊需確認一次,留存率極低。
完整 MIDlet 範例架構
public class SMSSender extends MIDlet implements CommandListener {
private Form form;
private TextField tfNumber, tfContent;
private Command cmdSend, cmdExit;
protected void startApp() {
// UI 初始化...
}
private void doSend() {
String num = tfNumber.getString();
String msg = tfContent.getString();
if (SMSUtil.send(msg, num)) {
// 成功提示
} else {
// 失敗提示
}
}
}
- 上一篇文章: Java 源碼級解析:java.lang.System 核心實現與 J2ME 差異
- 下一篇文章: J2ME 遊戲開發:MIDP 2.0 Media API 音樂播放完整指南
Copyright ©
程式碼之家 All Rights Reserved