首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 發送簡訊 (SMS) 完整實作指南:WMA API 詳解與程式碼範例

     編輯:J2ME

簡訊發送三大模式對比

模式原理適用場景
網關發送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)

權限與簽名 (關鍵部署門檻)

實際商用專案務必解決簽名問題,否則用戶每發一條簡訊需確認一次,留存率極低。

完整 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 {
            // 失敗提示
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
保護域發送權限備註
Untrusted每次彈窗詢問用戶體驗極差,不適合生產
Trusted / 簽名可設為「允許永不詢問」需向運營商/廠商申請簽名證書
Manufacturer/Operator靜默發送無提示預置應用專用