JSR 120 (WMA 1.1) 引入 MultipartMessage 支持 MMS,允許在單條消息中攜帶文本、圖片、音頻、視頻等多個部分。本文提供完整的發送與接收代碼範例,涵蓋連接構建、消息組裝、Part 添加、監聽器模式接收等核心流程。
MessageConnection:Connector.open("mms://...") 返回,負責發送/接收/設置監聽器。MultipartMessage:MMS 消息容器,addMessagePart() 添加部分,setSubject() 設置主題。MessagePart:單個媒體部分,包含 MIME 類型、數據字節、ID、編碼、Content-Location。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;
}
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,必須捕獲並友好提示。 |
MessageStore (收件箱/發件箱訪問)、MessageFilter、SIM 卡選擇、狀態報告、更豐富的 MIME 支持。