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

J2ME WMA 發送與接收 MMS 完整實現代碼 (JSR 120)

     編輯:J2ME

Wireless Messaging API 實戰:構建 MMS 多媒體消息收發功能

JSR 120 (WMA 1.1) 引入 MultipartMessage 支持 MMS,允許在單條消息中攜帶文本、圖片、音頻、視頻等多個部分。本文提供完整的發送與接收代碼範例,涵蓋連接構建、消息組裝、Part 添加、監聽器模式接收等核心流程。

核心類與接口

  • MessageConnection:Connector.open("mms://...") 返回,負責發送/接收/設置監聽器。
  • MultipartMessage:MMS 消息容器,addMessagePart() 添加部分,setSubject() 設置主題。
  • MessagePart:單個媒體部分,包含 MIME 類型、數據字節、ID、編碼、Content-Location。

發送 MMS 完整流程

public void sendMMS() {
    String appID = getAppProperty("MMS-ApplicationID"); // JAD 中配置
    String addr = "mms://+5550000:" + appID;            // 目標號碼 + AppID
    MessageConnection conn = null;

    try {
        conn = (MessageConnection) Connector.open(addr);
        MultipartMessage msg = (MultipartMessage) conn.newMessage(
                MessageConnection.MULTIPART_MESSAGE);
        msg.setAddress(addr);

        MessagePart[] parts = buildParts(); // 見下文
        for (MessagePart p : parts) msg.addMessagePart(p);

        msg.setSubject("MMS Demo");
        conn.send(msg);
    } catch (Exception e) { e.printStackTrace(); }
    finally { closeQuietly(conn); }
}

private MessagePart[] buildParts() {
    Vector parts = new Vector();

    // Part 1: 純文本
    String text = "Hello MMS!";
    byte[] txtBytes = text.getBytes("UTF-8");
    MessagePart tp = new MessagePart(txtBytes, 0, txtBytes.length,
            "text/plain", "id0", "text.txt", "UTF-8");
    parts.addElement(tp);

    // Part 2: 圖片 (從 JAR 資源讀取)
    try {
        InputStream is = getClass().getResourceAsStream("/hello.png");
        byte[] imgBytes = new byte[is.available()];
        is.read(imgBytes); is.close();
        MessagePart ip = new MessagePart(imgBytes, 0, imgBytes.length,
                "image/png", "id1", "hello.png", null);
        parts.addElement(ip);
    } catch (Exception e) { e.printStackTrace(); }

    MessagePart[] arr = new MessagePart[parts.size()];
    parts.copyInto(arr);
    return arr;
}

接收 MMS:監聽器模式 (推薦)

public void startMMSListener() {
    String appID = getAppProperty("MMS-ApplicationID");
    String listenAddr = "mms://:" + appID; // 冒號前為空 = 監聽所有發給此 AppID 的消息
    MessageConnection conn = null;

    try {
        conn = (MessageConnection) Connector.open(listenAddr);
        conn.setMessageListener(this); // 實現 MessageListener 接口
    } catch (IOException e) { e.printStackTrace(); }
}

// 實現 MessageListener 接口
public void notifyIncomingMessage(MessageConnection conn) {
    try {
        Message msg = conn.receive();
        if (msg == null) return;

        String sender = msg.getAddress(); // 如 "mms://+8613800000000:AppID"
        String phone = sender.substring(6, sender.indexOf(':'));

        if (msg instanceof MultipartMessage) {
            MultipartMessage mms = (MultipartMessage) msg;
            String subject = mms.getSubject();
            Date time = new Date(mms.getTimestamp());

            MessagePart[] parts = mms.getMessageParts();
            if (parts != null) {
                for (MessagePart p : parts) {
                    String mime = p.getMimeType();        // text/plain, image/png...
                    String loc = p.getContentLocation();  // 文件名
                    byte[] data = p.getData();            // 原始字節

                    // 文本直接解碼
                    if (mime.startsWith("text/")) {
                        String body = new String(data, "UTF-8");
                        // 顯示...
                    }
                    // 圖片創建 Image
                    else if (mime.startsWith("image/")) {
                        try {
                            Image img = Image.createImage(data, 0, data.length);
                            // 顯示/保存...
                        } catch (IllegalArgumentException iae) { /* 數據損壞 */ }
                    }
                    // 其他類型 (audio/, video/) 同理處理
                }
            }
        }
    } catch (IOException e) { e.printStackTrace(); }
}

關鍵配置與避坑指南

項目說明
JAD 屬性必須配置 MMS-ApplicationID: com.example.mmsdemo,發送/接收地址均引用此 ID。
權限簽名 MIDlet 才能靜默發送/接收;未簽名每條彈窗確認,體驗極差。
大小限制單條 MMS 通常 ≤ 300KB (視運營商),大圖需壓縮/縮放。
編碼文本 Part 建議 UTF-8,指定 charset 參數;二進制 Part charset 為 null。
雙卡/多設備部分雙卡手機需指定 SIM 卡槽,WMA 2.0 (JSR 205) 支持 sim:// 協議選擇。
異常處理網絡錯誤、存儲滿、格式不支持均拋 IOException,必須捕獲並友好提示。

WMA 1.1 vs 2.0

  • WMA 1.1 (JSR 120):基礎 SMS/MMS/Multipart,同步/監聽器收發。
  • WMA 2.0 (JSR 205):新增 MessageStore (收件箱/發件箱訪問)、MessageFilter、SIM 卡選擇、狀態報告、更豐富的 MIME 支持。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved