在 J2ME Polish 框架下開發多媒體應用時,若直接套用標準 J2ME 的 MMAPI (JSR 135) 視頻播放代碼,往往會遇到 ClassCastException 異常。本文深入剖析這一問題的根源,並提供經實戰驗證的解決方案,助你順利在 Polish 專案中實現視頻播放功能。
在一般 J2ME 專案中,播放本地視頻資源(如 /3.mpg)的標準流程如下:
getClass().getResourceAsStream() 獲取輸入流Manager.createPlayer(is, "video/mpeg") 創建 Playerp.realize()vc = (VideoControl)p.getControl("VideoControl")form.append((Item)vc.initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, null))display.setCurrent(form); p.start()將上述代碼直接移植到 Polish 專案時,運行期會拋出異常:
Generic/DefaultColorPhone: Java.lang.ClassCastException
at com.protel.MM.UI.MMMidlet.startApp(+224)
... form.append((Item)vc.initDisplayMode(...))
根本原因:J2ME Polish 在預處理階段會將所有 Screen 和 Item 類替換為 de.enough.polish.ui.* 包下的對應實現。而 MMAPI 返回的 VideoControl.initDisplayMode() 產生的是標準 javax.microedition.lcdui.Item,導致類型不匹配,無法強制轉換為 Polish 的 Item 類型。
在 Polish 專案中播放視頻,必須顯式引用標準 javax.microedition.lcdui.* 包下的類,繞過 Polish 的預處理機制。關鍵修改點:
Form → javax.microedition.lcdui.FormItem → javax.microedition.lcdui.ItemVideoControl 導入自 javax.microedition.media.control.VideoControltry {
InputStream is = getClass().getResourceAsStream("/3.mpg");
Player p = Manager.createPlayer(is, "video/mpeg");
p.realize();
VideoControl vc = (VideoControl) p.getControl("VideoControl");
if (vc != null) {
// 關鍵:使用全限定名引用標準 LCUI 類
javax.microedition.lcdui.Form form =
new javax.microedition.lcdui.Form("Video form");
javax.microedition.lcdui.Item videoItem =
(javax.microedition.lcdui.Item) vc.initDisplayMode(
VideoControl.USE_GUI_PRIMITIVE, null);
form.append(videoItem);
display.setCurrent(form);
}
p.start();
} catch (IOException ioe) {
// 處理 IO 異常
} catch (MediaException me) {
// 處理媒體異常
}
/3.mpg)已正確放置於 res 目錄並納入構建流程。MediaException 細化處理邏輯(如格式不支持、設備限制等),提升用戶體驗。J2ME Polish 的預處理機制雖然簡化了跨平台 UI 開發,但也帶來了與標準 API 交互時的類型隔離。掌握「關鍵路徑使用標準 LCUI 類」這一核心原則,即可在 Polish 專案中穩健集成 MMAPI 視頻播放功能,避免 ClassCastException 困擾。