Android入門筆記 - 多媒體 - MediaPlayer

來源:互聯網
上載者:User

標籤:android   多媒體   mediaplayer   

今天我們來寫一個超級超級簡單的播放器,使用到的是android內建的音樂播放器類MediaPlayer,先上一張:

裡面只實現了播放器額準系統,介面就不做了,因為不是重點哈。

代碼:

1. layout/ activty_main.xml 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <Button            android:id="@+id/btn_pre"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="pre" />        <Button            android:id="@+id/btn_stop"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="stop" />        <Button            android:id="@+id/btn_pause"            android:layout_width="wrap_content"            android:layout_height="wrap_content"             />        <Button            android:id="@+id/btn_play"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="play" />        <Button            android:id="@+id/btn_next"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="next" />    </LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical" >        <ListView            android:id="@+id/music_listview"            android:layout_width="match_parent"            android:layout_height="wrap_content" >        </ListView>    </LinearLayout></LinearLayout>

2. MainActivity.java :

package com.example.ch7_01_mediaplayer;import java.io.File;import java.io.FilenameFilter;import java.io.IOException;import java.util.ArrayList;import java.util.List;import android.media.MediaPlayer;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.view.Menu;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;public class MainActivity extends Activity {private Context mContext = this;private static final String MUSIC_PATH = new String("/sdcard/");private List<String> mMusicList = new ArrayList<String>();private ListView mMusicListView;private int mCurrentMusicItem = 0;private MediaPlayer mMediaPlayer = null;private Button mBtnStop = null;private Button mBtnPause = null;private Button mBtnPlay = null;private Button mBtnNext = null;private Button mBtnPre = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mMediaPlayer = new MediaPlayer();mBtnStop = (Button) findViewById(R.id.btn_stop);mBtnPause = (Button) findViewById(R.id.btn_pause);mBtnPlay = (Button) findViewById(R.id.btn_play);mBtnNext = (Button) findViewById(R.id.btn_next);mBtnPre = (Button) findViewById(R.id.btn_pre);mMusicListView = (ListView) findViewById(R.id.music_listview);getMusicList(); // 擷取音樂播放清單mBtnStop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mMediaPlayer.isPlaying()) {mMediaPlayer.reset();}}});mBtnPause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mMediaPlayer.isPlaying()) {mMediaPlayer.pause();mBtnPause.setText("continue");} else {mMediaPlayer.start();mBtnPause.setText("pause");}}});mBtnPlay.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {playMusic(MUSIC_PATH + mMusicList.get(mCurrentMusicItem));}});mBtnNext.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {nextMusic();}});mBtnPre.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {preMusic();}});}private void playMusic(String path) {try {mMediaPlayer.reset();mMediaPlayer.setDataSource(path);mMediaPlayer.prepare();mMediaPlayer.start();mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {nextMusic();}});} catch (Exception e) {e.printStackTrace();}}private void getMusicList() {File home = new File(MUSIC_PATH);if (home.listFiles(new MusicFilter()).length > 0) {for (File file : home.listFiles(new MusicFilter())) {mMusicList.add(file.getName());}ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext, R.layout.music_item,R.id.music_item_tv, mMusicList);mMusicListView.setAdapter(adapter);mMusicListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> l, View view,int position, long id) {mCurrentMusicItem = position;playMusic(MUSIC_PATH + mMusicList.get(mCurrentMusicItem));}});}}private void nextMusic() {if (++mCurrentMusicItem >= mMusicList.size()) {mCurrentMusicItem = 0;}playMusic(MUSIC_PATH + mMusicList.get(mCurrentMusicItem));}private void preMusic(){if(--mCurrentMusicItem < 0){mCurrentMusicItem = mMusicList.size()-1;}playMusic(MUSIC_PATH + mMusicList.get(mCurrentMusicItem));}class MusicFilter implements FilenameFilter {@Overridepublic boolean accept(File dir, String filename) {return filename.endsWith("mp3");}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overrideprotected void onDestroy() {super.onDestroy();mMediaPlayer.stop();                mMediaPlayer.reset();                mMediaPlayer.release();        }@Overrideprotected void onResume() {super.onResume();if(mMediaPlayer.isPlaying()){mBtnPause.setText("pause");}else{mBtnPause.setText("continue");}}}
 

3. 這裡還用到了listview,所有還有一個資源檔: layout/ music_item.xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="50dp" >    <TextView        android:id="@+id/music_item_tv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerVertical="true" /></RelativeLayout>



講解篇:

代碼有點多,我們就調重點講。首先來介紹一下MediaPlayer這個類,是android中專門用來處理播放音樂請求的,在獨立的線程當中,生命週期不隨Anctivity一起消亡。

生命週期:

解釋一下:要使用MediaPlayer需要先new一個對象出來,然後調用其 reset() 方法進入 idle 狀態, 通過 setDataSource() 可以設定播放目錄,進入 initalized狀態, 然後調用 prepare()方法進入 prepare狀態,這個時候就可以調用 start()方法開始播放音樂。暫停和停止分別調用 pause() 和 stop() 方法。 在退出的時候最好是先回到 idle 狀態,就是調用 reset() ,然後再調用 release()就可以退出。

來看看代碼是怎麼寫的:

播放音樂:

private void playMusic(String path) {try {mMediaPlayer.reset();mMediaPlayer.setDataSource(path);mMediaPlayer.prepare();mMediaPlayer.start();mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {nextMusic();}});} catch (Exception e) {e.printStackTrace();}}
我們可以看到完全是按照生命週期來走的, reset() -> setDataSource() -> prepare() -> start() , 這裡path是音樂檔案的具體路徑(作為入參), 這裡設定了監聽事件: OnCompletionListener,就是當一首音樂播放完時自動觸發,這裡我們直接播放下一首音樂。如果你想做一個功能單曲迴圈的話,那麼直接再播當前的音樂就可以了,是不是很簡單。


停止(stop):如果再播放,直接reset 到初始狀態

if (mMediaPlayer.isPlaying()) {       mMediaPlayer.reset();}


暫停(pause):判斷是否在播放,如果在播放就暫停,並且設定暫停按鈕為 繼續, 如果是繼續按鈕,點擊之後播放音樂,設定按鈕為 暫停。我們這裡用文字來代替。

if (mMediaPlayer.isPlaying()) {mMediaPlayer.pause();mBtnPause.setText("continue");} else {mMediaPlayer.start();mBtnPause.setText("pause");}

下一首:這裡我們需要一個類變數 mCurrentMusicItem 標誌當前播放的是哪個位置上的歌曲,也就是第幾首歌。如果到最後就迴圈到0,繼續播放。

private void nextMusic() {if (++mCurrentMusicItem >= mMusicList.size()) {mCurrentMusicItem = 0;}playMusic(MUSIC_PATH + mMusicList.get(mCurrentMusicItem));}

上一首:和下一首的思想一樣,不做解釋

private void preMusic(){if(--mCurrentMusicItem < 0){mCurrentMusicItem = mMusicList.size()-1;}playMusic(MUSIC_PATH + mMusicList.get(mCurrentMusicItem));}


我們需要來看一看傳入到 playMusic(String path)參數到底是什嗎?

這裡將音樂播放路徑設定為 " mnt/sdcard/ " :

private static final String MUSIC_PATH = new String("/sdcard/");

然後在目錄下,將所有尾碼為“MP3”的檔案添加到 mMusicList<String> 當中,拼接就可以得到音樂的路徑,例如: mnt/sdcard/Dreamer.mp3 , 注意 " /sdcard/ " 的第一個 "/" 表示根目錄,其實就是 " mnt/“ , 這是從linux來的,大家不要誤會。

private List<String> mMusicList = new ArrayList<String>();
private void getMusicList() {File home = new File(MUSIC_PATH);if (home.listFiles(new MusicFilter()).length > 0) {for (File file : home.listFiles(new MusicFilter())) {mMusicList.add(file.getName());}ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext, R.layout.music_item,R.id.music_item_tv, mMusicList);mMusicListView.setAdapter(adapter);mMusicListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> l, View view,int position, long id) {mCurrentMusicItem = position;playMusic(MUSIC_PATH + mMusicList.get(mCurrentMusicItem));}});}}


最後我們需要在Activity生命週期中調用 MediaPlayer的生命週期,否則當你Activity被銷毀的時候,MediaPlayer還在那兒瞎放,豈不是很老火:

@Overrideprotected void onDestroy() {super.onDestroy();mMediaPlayer.stop();                mMediaPlayer.reset();                mMediaPlayer.release();        }


這裡已經把音樂播放器最核心的代碼謝了,如果要做擴充是很好擴充的,修改介面,修改音樂列表等,希望對大家有協助。



Android入門筆記 - 多媒體 - MediaPlayer

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.