J2ME播放聲音的幾個問題(nokia). - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- J2ME播放聲音的幾個問題(nokia). (http://www.webasp.net/article/18/17273.htm) |
| -- 作者:未知 -- 發佈日期: 2005-03-31 |
| Nokia的手機對聲音播放支持的好像不太好。
本文根據我做j2me的經驗,總結一下Nokia三個機型的聲音播放方法。 1。Nokia S40(7210,3300) 和 S60(3650,7650) /* 這四款機子不支持MIDP2.0的media。 我只針對我做過的機型說明,其他的機型沒有用真機試驗, 不知道是否支持MIDP2.0中的media */ import com.nokia.mid.sound.*; public class MyClass extends Canvas { …… private Sound kSound = null; private byte[] dataKill = { (byte)0x02, (byte)0x4a, (byte)0x3a, (byte)0x40, (byte)0x04, (byte)0x00, (byte)0x0b, (byte)0x28, (byte)0x83, (byte)0x28, (byte)0x28, (byte)0xd2, (byte)0x28, (byte)0x00 }; private Fun() { if(kSound != null) { kSound.stop(); kSound = null; } kSound = new Sound(dataKill, Sound.FORMAT_TONE); kSound.setGain(255); //設置音量 kSound.play(1); //播放,循環一次 } } //End MyClass. /* 註: 1。關於dataKill數據怎麼得到。 首先,要有一個midi聲音文件; 其次,需要nokia的Nokia_Developers_Suite_for_J2ME。 用這個工具中的audio converter把midi文件轉換成字節數據。 然後把得到的東東copy到你的代碼中。 2。關於WTK怎麼用nokia的lib。 在nokia的開發工具目錄 ..\Nokia\Devices\Nokia_7210_MIDP_SDK_v1_0\lib 或者 ..\Nokia\Devices\Series_60_MIDP_Concept_SDK_Beta_0_3_Nokia_edition\lib 中找到class.zip。打開,找到Sound.class,解壓,應該可以得到com\nokia\ui\Sound\sound.class, 然後把整個目錄再打包成一個zip文件,放到你的項目的lib下。就行了。 或者直接一點,把class.zip直接方到lib下也可以。 用wtk編譯打好package後,再打開你的jar文件,把包含sound.class的那個com文件夾 刪除,最後再把jad中的jar-size根據實際情況改一下。 ok。 反正我就是這麼做的,麻煩是很麻煩。但是實在是不想用JBuilder。 不知道還有沒有更簡單的辦法。 */ 2。Nokia 7610 /*此機型支持MIDP2.0*/ import javax.microedition.media.*; public class MyClass extends Canvas …… { private Player player = null; …… private void Fun() { …… playSound("kill.mid"); //此處調用播放函數 /*對於WTK2.1,kill.mid文件放在res目錄下*/ } protected void playSound(String source) { //創建播放器 try { if(player != null) { player.close(); player = null; } player = Manager.createPlayer(getClass().getResourceAsStream("/"+source), "audio/midi"); player.addPlayerListener(this); player.setLoopCount(1); player.realize(); player.start(); } catch(Exception pe) { pe.printStackTrace(); } } public void playerUpdate(final Player p, final String event, final Object eventData) { // queue a call to updateEvent in the user interface event queue Display display = Display.getDisplay(myColorBall); display.callSerially(new Runnable() { public void run() { updateEvent(p, event, eventData); } }); } private void updateEvent(Player p, String event, Object eventData) { if (event == END_OF_MEDIA) { p.close(); } else if (event == CLOSED) { p = null; } } } //End MyClass. =================================================== /* 談另外一個問題。 當切換出程序,遊戲聲音仍然繼續播放的解決辦法。 */ //MyClass裡增加一個函數 void stopTone() { if(kSound != null) { kSound.stop(); } } //在MIDlet裡的pauseApp()裡添加如下代碼 public void pauseApp() { if(myClass != null //播放聲音的界面存在 && sound_s == 1) //聲音開關打開了 { myClass.stopTone(); } } /*這還只是一個構想,過兩天有時間了再上真機實測*/ |
| webasp.net |