在BlackBerry上播放音頻

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;
    }
   }
  }
 }

}

 

 

 

 

發佈了41 篇原創文章 · 獲贊 1 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章