亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【android學習之十四】——多媒體1:音樂播放

系統 2916 0

聲明:學習的書籍《Android應用開發揭秘》,這里記錄學習該書籍的日志,引用的相關代碼與總結描述,沒有商業的用途,完全是自我學習的一個記錄,剛剛學習不可避免會出現很多問題,若是有錯誤還請大家多多批評。

今天開始學習多媒體相關的操作,因為我們的智能手機一部分重要的作用就是播放音頻,視頻,顯示圖片等操作。Android主要是通過Open Core作為多媒體框架的核心,也被稱作為PV,支持多種格式的音頻,視頻。Open Core框架主要包含兩部分:

(1) PVPlayer:提供媒體播放器功能。

(2) PVAuthor:提供媒體流記錄的功能,完成各種音頻,視頻的流以及圖像的捕捉功能。

當然我們開發中,不會直接操作底層的PV,主要使用Android提供的Media API。

1. MediaPlayer類

該類主要用來播放,音頻,視頻和流媒體,包含了Audio和Video的播放功能,具體的生命周期與相關方法,可以參考下面音樂播放實例。

2. MediaRecorder類

該類主要用于媒體的采樣,包括音頻視頻。MediaRecorder作為狀態機運行,需要設置不同的,比如源設備和格式。設置后,可以執行任何時間長度的錄制,直到用戶停止。

一、多媒體之音樂播放

下面就以音樂播放的例子來驗證MediaPlayer的生命周期以及相關方法,關于音樂播放其實之前例子已經實現,當時是播放的raw目錄下得mp3文件,本例子自動播放SDCard下的mp3例子。

關鍵源碼:

    public class SDCardMusicPlayActivity extends ListActivity {
	private ImageButton mFrontImageButton = null;
	private ImageButton	mStopImageButton	= null;
	private ImageButton	mStartImageButton	= null;
	private ImageButton	mPauseImageButton	= null;
	private ImageButton	mNextImageButton	= null;
	
	public MediaPlayer mMediaPlayer = null;		//MediaPlayer對象
	private List<String> mMusicList = new ArrayList<String>();//播放列表
	private int currentListItem = 0;			//當前播放歌曲的索引
	private static final String MUSIC_PATH = new String("/mnt/sdcard/");//音樂的路徑

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        musicList();							//更新顯示播放列表
        mMediaPlayer = new MediaPlayer();		
        mFrontImageButton = (ImageButton) findViewById(R.id.LastImageButton); 
		mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton);
		mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton); 
		mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);
		mNextImageButton = (ImageButton) findViewById(R.id.NextImageButton); 
		
		//停止按鈕
		mStopImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View v) {
				if(mMediaPlayer.isPlaying()){	//當前是否正在播放
					mMediaPlayer.reset();		//重置MediaPlayer到初始狀態
				}
			}
		});
		//開始按鈕
		mStartImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View v) {
				playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
			}
		});
		//暫停按鈕
		mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View v) {
				if(mMediaPlayer.isPlaying()){
					mMediaPlayer.pause();
				}else{
					mMediaPlayer.start();
				}
			}
		});
		//下一首
		mNextImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View arg0){
				nextMusic();
			}
		});
		//上一首
		mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View arg0){
				FrontMusic();
			}
		});
    }

    //播放列表
	private void musicList() {
		//取得指定位置的文件,設置顯示到播放列表
		File home = new File(MUSIC_PATH);
		if(home.list(new MusicFilter()).length > 0){
			for(File file : home.listFiles(new MusicFilter())){
				mMusicList.add(file.getName());
			}
			ArrayAdapter<String> musicListAdapter = new ArrayAdapter<String>(SDCardMusicPlayActivity.this, R.layout.musicitme, mMusicList);
			this.setListAdapter(musicListAdapter);
		}
	}
	
	private void playMusic(String path){
		try {
			mMediaPlayer.reset();//重置MediaPlayer
			mMediaPlayer.setDataSource(path);//設置要播放的文件路徑
			mMediaPlayer.prepare();//準備播放
			mMediaPlayer.start();
			mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
				public void onCompletion(MediaPlayer mp) {
					// TODO Auto-generated method stub
					nextMusic();//播放完成一首之后進行下一首
				}
			});
		} catch (IOException e) {
			// TODO: handle exception
		}
	}
	
	//下一首
	private void nextMusic() {
		// TODO Auto-generated method stub
		if(++currentListItem >= mMusicList.size()){
			currentListItem = 0;
		}else{
			playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
		}
	}
	
	//上一首 
	private void FrontMusic(){
		if (--currentListItem >= 0){
			currentListItem = mMusicList.size();
		}else{
			playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
		}
	}
	
	public boolean onKeyDown(int keyCode, KeyEvent event){
		if ( keyCode ==  KeyEvent.KEYCODE_BACK){
			mMediaPlayer.stop();
			mMediaPlayer.release();
			this.finish();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}
	
	//播放被點擊的音樂 
	protected void onListItemClick(ListView l, View v, int position, long id){
		currentListItem = position;
		playMusic(MUSIC_PATH + mMusicList.get(position));
	}

}

class MusicFilter implements FilenameFilter{

	@Override
	public boolean accept(File dir, String filename) {
		//這里還可以設置其他格式的音樂文件
		return (filename.endsWith(".mp3"));
	}
	
}
  

運行效果:

【android學習之十四】——多媒體1:音樂播放

【遇到問題】

在往模擬器的SDCard里放置mp3文件的時候,報:Failed to push selection: Read-only file system 錯誤。

切換到DDMS視圖下,看到mnt下的sdcard文件夾的操作權限為可讀,后來在AVD Edit的時候,之前SDCard沒設置大小,所以設置了大小重新啟動AVD,該sdcard文件夾就可以可以編輯的了。


【android學習之十四】——多媒體1:音樂播放


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中文字幕亚洲精品久久 | 国产情侣普通话刺激对白 | 日本精品在线视频 | 久久久受www免费人成 | 国产成人精品综合久久久软件 | 欧美日韩色视频 | 妖精视频免费在线观看 | 尤物视频一区 | 久久不卡 | 国产精品久草 | 七月婷婷精品视频在线观看 | 日本99热 | 亚洲欧美高清在线 | 亚洲欧美乱综合图片区小说区 | 免费观看成人www精品视频在线 | 国产真实偷人视频在线播放 | 日韩久久一级毛片 | 插久久 | 亚洲天天干 | 国产福利视频一区二区三区 | 色悠综合 | 国产精品第7页 | 亚洲热线99精品视频 | 日本亚欧乱色视频在线网站 | 久久国产免费一区二区三区 | 国产福利视频在线观看 | 狠狠色丁香婷婷综合激情 | 午夜剧j| 成人午夜视频免费看欧美 | 日本一级爰免费视频 | 乱人伦中文视频在线 | 中文字幕日韩在线观看 | 奇米线在人线免费视频 | 天天操夜夜操免费视频 | 欧美激情一区二区 | 99久久免费国产精品特黄 | 中文字幕一区二区三区在线播放 | 手机看片在线精品观看 | 视频一区二区国产无限在线观看 | 狠狠色丁香婷婷综合精品视频 | 亚洲国产品综合人成综合网站 |