在BlackBerry上播放音頻
播放音頻範例
本節介紹如何在BlackBerry上創建一個音頻播放器播放mp3,並提供播放,暫停,停止等控制。播放器如圖所示:
這個播放器應用運行在BlackBerry 9700模擬器上,界面顯示了歌曲名稱,歌曲時長,播放狀態,和操作按鈕暫停,播放,和停止。如下幾幅圖顯示其播放狀態的變化:
播放器狀態爲“正在播放”,歌曲All Rise正在被播放。
播放器狀態爲暫停,歌曲暫停播放,但是按下播放按鈕可以繼續播放。
播放器爲停止狀態。在停止狀態,播放器實例不能夠被重新利用。再按播放按鈕,應用程序會銷燬Player實例並創建新的Player進行播放。
播放器源代碼如下:
import java.io.InputStream;
import javax.microedition.media.Player;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;
public class MusicPlayerApp extends UiApplication{
public static void main(String[] args){
// 應用程序啓動入口
getInstance().enterEventDispatcher();
}
// MusicPlayerApp的單類
private static MusicPlayerApp m_instance;
private MusicPlayerScreen musicPlayerScreen;
public MusicPlayerApp(){
// 創建播放器屏幕
musicPlayerScreen = new MusicPlayerScreen();
// 推出屏幕堆棧,顯示播放器屏幕
pushScreen(musicPlayerScreen);
}
// 實現 MusicPlayerApp 單類,運行環境中只有一個MusicPlayerApp實例
public static synchronized MusicPlayerApp getInstance(){
if (m_instance == null){
m_instance = new MusicPlayerApp();
}
return m_instance;
}
// 播放器屏幕
class MusicPlayerScreen extends MainScreen implements FieldChangeListener{
public static final String SONG_NAME = "All Rise";
// 指向歌曲的URI
public static final String URI = "/sounds/all_rise.mp3";
// 歌曲的格式,audio/mpeg支持mp3
public static final String AUDIO_FORMAT = "audio/mpeg";
// 播放器的所有狀態
public static final int PLAYING = 0;
public static final int READY_FOR_PLAY = 1;
public static final int PAUSE = 2;
public static final int STOP = 3;
// 播放器的當前狀態
private int m_currentStatus = READY_FOR_PLAY;
// 播放器實例
private Player m_player;
// 播放器標籤Layout
private VerticalFieldManager m_labelManager;
// 播放器標籤
private LabelField m_songNameField;
private LabelField m_durationField;
private LabelField m_statusField;
// 播放按鈕Layout
private HorizontalFieldManager m_buttonManager;
// 播放器按鈕
private ButtonField m_pauseButton;
private ButtonField m_playButton;
private ButtonField m_stopButton;
public MusicPlayerScreen(){
super(Manager.NO_HORIZONTAL_SCROLL|Manager.NO_VERTICAL_SCROLL);
// 創建播放器並做好播放準備
createPlayer();
// 創建界面
initializeUI();
}
private void initializeUI(){
setTitle(new LabelField("黑莓播放器", Field.FIELD_VCENTER|Field.FIELD_HCENTER));
// 歌曲名稱標籤
m_songNameField = new LabelField("歌曲名稱: "+SONG_NAME, Field.USE_ALL_WIDTH);
// 歌曲時長
m_durationField = new LabelField("播放時長: " +m_player.getDuration()/1000000/60+"分鐘", Field.USE_ALL_WIDTH);
// 播放狀態
m_statusField = new LabelField("播放狀態: "+getStatus(), Field.USE_ALL_WIDTH);
m_labelManager = new VerticalFieldManager(Manager.NO_HORIZONTAL_SCROLL|Manager.NO_VERTICAL_SCROLL);
m_labelManager.add(m_songNameField);
m_labelManager.add(m_durationField);
m_labelManager.add(m_statusField);
add(m_labelManager);
// 暫停按鈕
m_pauseButton = new ButtonField("||", Field.FIELD_VCENTER|Field.FIELD_HCENTER);
m_pauseButton.setChangeListener(this);
// 播放按鈕
m_playButton = new ButtonField(">", Field.FIELD_VCENTER|Field.FIELD_HCENTER);
m_playButton.setChangeListener(this);
// 停止按鈕
m_stopButton = new ButtonField("O", Field.FIELD_VCENTER|Field.FIELD_HCENTER);
m_stopButton.setChangeListener(this);
m_buttonManager = new HorizontalFieldManager(Manager.NO_HORIZONTAL_SCROLL|Manager.NO_VERTICAL_SCROLL);
m_buttonManager.add(m_pauseButton);
m_buttonManager.add(m_playButton);
m_buttonManager.add(m_stopButton);
add(m_buttonManager);
}
// 獲取當前播放狀態
private String getStatus(){
switch(m_currentStatus){
case PLAYING:
return "正在播放";
case READY_FOR_PLAY:
return "準備完畢";
case PAUSE:
return "暫停";
case STOP:
return "停止";
}
return null;
}
// 根據設置的播放狀態更新狀態標籤
private void setPlayerStatus(int status){
m_currentStatus = status;
m_statusField.setText("播放狀態: "+getStatus());
}
// 創建播放器
private void createPlayer(){
try{
// 關閉當前播放器
if (m_player != null){
m_player.close();
m_player = null;
}
// 創建新播放器
InputStream is = this.getClass().getResourceAsStream(URI);
m_player = javax.microedition.media.Manager.createPlayer(is, AUDIO_FORMAT);
// 預裝媒體資源準備播放
m_player.prefetch();
}catch(Exception ex){
ex.printStackTrace();
}
}
// 阻止屏幕save菜單彈出
public boolean onSavePrompt(){
return true;
}
public void fieldChanged(Field field, int context) {
if (field == m_playButton){
// 當播放按鈕按下時
// 根據播放器當前狀態進行處理
switch (m_currentStatus){
case PLAYING:
this.setPlayerStatus(PLAYING);
return;
case READY_FOR_PLAY:
try{
m_player.start();
}catch(Exception ex){}
setPlayerStatus(PLAYING);
return;
case PAUSE:
try{
m_player.start();
}catch(Exception ex){}
setPlayerStatus(PLAYING);
return;
case STOP:
createPlayer();
try{
m_player.start();
}catch(Exception ex){}
setPlayerStatus(PLAYING);
return;
}
}else if (field == m_pauseButton){
// 當暫停按鈕按下時
// 根據播放器當前狀態進行處理
switch (m_currentStatus){
case PLAYING:
try{
m_player.stop();
}catch(Exception ex){}
setPlayerStatus(PAUSE);
return;
case READY_FOR_PLAY:
return;
case PAUSE:
return;
case STOP:
try{
m_player.close();
}catch(Exception ex){}
setPlayerStatus(STOP);
return;
}
}else if (field == m_stopButton){
// 當停止按按鈕按下時
// 根據播放器當前狀態進行處理
switch (m_currentStatus){
case PLAYING:
try{
m_player.stop();
m_player.close();
}catch(Exception ex){}
setPlayerStatus(STOP);
return;
case READY_FOR_PLAY:
try{
m_player.close();
}catch(Exception ex){}
setPlayerStatus(STOP);
return;
case PAUSE:
try{
m_player.close();
}catch(Exception ex){}
setPlayerStatus(STOP);
return;
case STOP:
return;
}
}
}
}
}