您现在的位置是:首页
>
降压反射的机制及意义 JavaME程序 Run Anywhere-- 利用反射机制来动态加载声
JavaME程序 Ru A ywhere-- 利用反射机制来动态加载声 让JavaME程序 Ru A ywhere 利用反射机制来动态加载声音API 欢迎指教 t c Write o ce ru a
JavaME程序 Run Anywhere-- 利用反射机制来动态加载声
让JavaME程序 Run Anywhere 利用反射机制来动态加载声音API 欢迎指教 t cn Write once run anywhere 是JAVA的口号 但在J ME平台上做的应用 要想不改动代码就run anywhere 难度是很大的 如果要把一个应用程序做到让大多数的机型都适用 就让JavaME程序 Run Anywhere 利用反射机制来动态加载声音API Write once run anywhere 是JAVA的口号 但在J ME平台上做的应用 要想不改动代码就run anywhere 难度是很大的 如果要把一个应用程序做到让大多数的机型都适用 就要考虑到方方面面 其难度是相当大的 比如给百宝箱做游戏 上线机型大多是MIDP 的机器 感觉移植中最麻烦的还要数声音部分的API 必须根据各个机型来改动 虽然图象还比较容易做成自适应的 但声音部分就一般就只能根据各个机型来改动 下面提供一种解决方案 可以让J ME程序在运行时自动加载该机型支持的声音资源并用该机型的声音API来播放 关键问题 各机型提供的播放音乐的API都有所不同 特别是较老的机型 需要在运行时根据机型自动加载 各机型支持的声音的资源文件也不同 需要在运行时根据机型自动加载 各机型的JVM不同 多多少少有一些比较特别的BUG 解决方案 原则 能用标准API就用标准API 不能用的话 就用各个机型自身的API // Player types static final int STANDARD = ; //For MIDI static final int NOKIA = ; //For ott static final int SAMSUNG = ; //For mmf static final int NEC = ; //For MIDI static final String[] supportedPlayerTypes = { jadia Player //STANDARD API nokia mid sound Sound // Nokia samsung util AudioClip //samsung dia AudioClip //nec }; 下面利用反射机制来动态加载 public void determinePlayerType() { // use most > less use isSupportSound = true; for (int i = ; i < supportedPlayerTypes length; i ) { // try to load a proper sound Player try { Class forName(supportedPlayerTypes[i]); //加载当前的Player类型 playerType = i; //保存加载成功的类的类型 return; } catch (Exception e) { //加载不成功 说明不支持 继续加载下一种 e printStackTrace(); } } isSupportSound = false; } 下面就可以根据在载成功的类型来加载可以播放的声音资源了 public void createPlayer(String name) { if (!isSupportSound) return; switch (playerType) { case STANDARD: // for MIDI case NEC: createPlayerFactory( / name mid ); break; case NOKIA: //for ott createPlayerFactory( / name ott ); break; case SAMSUNG: // for mmf createPlayerFactory( / name mmf ); break; } } 对各个机型特有的BUG 是没有什么特别好的办法的 只能各个机型调试 这只能怪厂商了 该方案优点 在移植的时候就不用改动代码 只要在相应的机型JAR包中保留相关的资源就可以了 这样就不用为了各个机型都折腾一遍了 注意 用 System getProperty( microedition platform )来确定机型是不保险的 因为有的机型只是简单地返回J ME platform 遗留问题 NecN 在运行 Class forName( jadia Player );时候会立刻报 应用程序出错 而不是抛出 ClassNotFoundException 异常 这是该机型JVM的特性(BUG) 所以给NecN 的代码中必须注释掉jadia Player的一切信息 这就得改动代码 有违我们的初衷 的确是个遗憾 (估计NEC的机型都素这样的) 这个类还有待扩展 以支持更多机型 并加入震动部分的API 理论上可以包含所有的机型 但实际应用中只要包含需要用到的机型相关API就可以了 测试机型 在 三星E MOTOV NOKIA NecN (注释掉jadia Player相关内容)上均测试通过 下面是源程序 /** * Created on * This class is mainly for the games on various mobile platform * If U have any good ideas about the J ME contact me at t cn * * Version */ import javax microedition lcdui *; import java io *; //********************* STANDARD *********************** import jadia *; //********************* NOKIA *********************** import nokia mid sound *; //********************* SAMSUNG *********************** import samsung util *; // ********************* NEC *********************** import dia *; //********************* SonyEricsson *********************** // the same as J ME standard API /** * @author IntoTheDream */ public class MyPlayer { private static MyPlayer mp = null; //Sound types to be enlarged static final int MIDI = ; static final int MMF = ; static final int OTT = ; // Player types static final int STANDARD = ; //For MIDI static final int NOKIA = ; //For ott static final int SAMSUNG = ; //For mmf static final int NEC = ; //For MIDI static final String[] supportedSoundTypes = { mid mmf ott }; private static int soundType; static final String[] supportedPlayerTypes = { jadia Player //must be dimissed for NECN nokia mid sound Sound samsung util AudioClip dia AudioClip }; private static int playerType; // Note : first play sound to determine whether sound On or Off // Of course you can change it in the game static boolean isSupportSound; static boolean isSoundOn = true; // ********************* STANDARD *********************** Player player; // ********************* NOKIA *********************** Sound nokiaPlayer; // ********************* SAMSUNG *********************** samsung util AudioClip samsungPlayer; // ********************* NEC *********************** dia AudioClip necPlayer; // singleton private MyPlayer() { } public static MyPlayer getMyPlayer() { if (mp == null) { mp = new MyPlayer(); mp determinePlayerType(); } return mp; } // automatically run this first !! public void determinePlayerType() { // use most > less use isSupportSound = true; for (int i = ; i < supportedPlayerTypes length; i ) { // try to load a proper sound Player try { Class forName(supportedPlayerTypes[i]); playerType = i; return; } catch (Exception e) { e printStackTrace(); } } isSupportSound = false; } public void createPlayer(String name) { if (!isSupportSound) return; switch (playerType) { case STANDARD: // for MIDI case NEC: createPlayerFactory( / name mid ); break; case NOKIA: //for ott createPlayerFactory( / name ott ); break; case SAMSUNG: // for mmf createPlayerFactory( / name mmf ); break; } }
private void createPlayerFactory(String url) { if (isSupportSound && isSoundOn) { try { InputStream is; switch (playerType) { case NEC: necPlayer = Media getAudioClip(url); break; case STANDARD: //must be dimissed for NECN is = this getClass() getResourceAsStream(url); player = Manager createPlayer(is audio/midi ); break; case NOKIA: is = this getClass() getResourceAsStream(url); ByteArrayOutputStream baos = new ByteArrayOutputStream(); for (int b = is read(); b >= ; b = is read()) { baos write(b); } nokiaPlayer = new nokia mid sound Sound(baos toByteArray() nokia mid sound Sound FORMAT_TONE); break; case SAMSUNG: samsungPlayer = new samsung util AudioClip( samsung util AudioClip TYPE_MMF url); break; } } catch (Exception e) { e printStackTrace(); } } } public void play(int loop) { if (isSupportSound && isSoundOn) { try { switch (playerType) { case NEC: if (necPlayer == null) break; necPlayer setLoopCount(loop); necPlayer play(); break; case STANDARD: //must be dimissed for NECN if (player == null) break; player setLoopCount(loop); player start(); break; case NOKIA: if (nokiaPlayer == null) break; nokiaPlayer play(loop); break; case SAMSUNG: if (samsungPlayer == null) break; samsungPlayer play(loop ); // is volume break; } } catch (Exception e) { e printStackTrace(); } } } public void stopSound() { if (isSupportSound && isSoundOn) { try { switch (playerType) { case STANDARD: //must be dimissed for NECN if (player == null) break; player deallocate(); player stop(); player close(); player = null; break; case NOKIA: if (nokiaPlayer == null) break; nokiaPlayer stop(); nokiaPlayer = null; break; case SAMSUNG: if (samsungPlayer == null) break; samsungPlayer stop(); samsungPlayer = null; break; case NEC: if (necPlayer == null) break; necPlayer stop(); necPlayer = null; break; } System gc(); } catch (Exception e) { e printStackTrace(); } } } } lishixinzhi/Article/program/Java/hx/201311/26841
很赞哦! (1072)
- 上一篇
猫咪吐猫粮和黄水 这两天天很冷我家猫咪突然很嗜睡 今天又给他洗了个澡一直在睡觉 东西也不咋吃 本来给她换这个猫粮他就
这两天天很冷我家猫咪突然很嗜睡 今天又给他洗了个澡一直在睡觉 东西也不咋吃 本来给她换这个猫粮他就 这两天天很冷我家猫咪突然很嗜睡 今天又给他洗了个澡一直在睡觉 东西也不咋吃 本来给她换这个猫粮他就这
- 下一篇
西晒阳台适合封起来吗 我的房子窗户朝西, 西晒太阳太热很烦恼,有什么好办法呢?!
我的房子窗户朝西, 西晒太阳太热很烦恼,有什么好办法呢? 我的房子窗户朝西, 西晒太阳太热很烦恼,有什么好办法呢?太阳光中的红外线是产生热量的主要来源。绿光玻璃白金水能隔断92%以上的红外线,阻挡大部