MediaPlayer是Android設計的媒體播放器,不僅僅可以播放音頻文件,還可以播放視頻文件
播放:Audio(音頻,.mp3)相關
播放:Video(視頻,.mp4)相關
以下圖,是Android官方提供:MediaPlayer時序圖:
只要會看這個圖:就能實現音頻/視頻播放,暫停,繼續,停止,重播,等等
看圖規律:
1.藍色橢圓形是狀態,例如:Initialized已初始化狀態,Prepared准備狀態,Started啟動狀態,Stopped停止狀態,End結束狀態,等等;
2.單箭頭是方法調用:例如:調用reset方法重置,調用prepare方法准備,調用start方法播放,等等;
3.雙箭頭是監聽回調:例如:onError回調錯誤,等等
此MediaPlayer播放使用普通准備,不使用異步准備
package liudeli.my_media1; import android.database.Cursor; import android.media.MediaPlayer; import android.net.Uri; import android.os.SystemClock; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; /** * 此MediaPlayer播放使用普通准備,不使用異步准備 */ public class MediaPlayAudioActivity extends AppCompatActivity { private TextView tvPlayerPath; // 顯示播放的路徑 private TextView tvAudioInfo; // 歌曲時長/歌手/專輯 private TextView tvAudioThisDuration; // 當前播放的時長 /** * 媒體播放器,可以播放(音頻/視頻) * 播放(音頻/視頻)操作一模一樣 */ private MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_play_audio); tvPlayerPath = findViewById(R.id.tv_player_path); tvAudioInfo = findViewById(R.id.tv_audio_info); tvAudioThisDuration = findViewById(R.id.tv_audio_this_duration); mediaPlayer = new MediaPlayer(); // 為了測試,這樣寫,真實開發中,不這樣寫 new Thread(){ @Override public void run() { super.run(); while (true) { runOnUiThread(new Runnable() { @Override public void run() { if (mediaPlayer.isPlaying()) { tvAudioThisDuration.setText("當前時長:" + postions(mediaPlayer.getCurrentPosition())); } } }); SystemClock.sleep(1000); } } }.start(); /** * 監聽播放完成 */ mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Log.d("mp", "播放完成"); Toast.makeText(MediaPlayAudioActivity.this, "播放完成", Toast.LENGTH_SHORT).show(); tvAudioThisDuration.setText("當前時長:-"); } }); /** * 去獲取第一條外置存儲的音頻文件.mp3 的路徑 * 通過Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 獲取外置存儲音頻文件 * getContentResolver.query(uri) */ initAudioPlayerPath(); } /** * 去獲取第一條外置存儲的音頻文件.mp3 的路徑 */ private void initAudioPlayerPath() { Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; // 查詢的列 String[] projection = new String[]{MediaStore.Audio.Media.DATA, // 音頻路徑 MediaStore.Audio.Media.DURATION, // 音頻時長 MediaStore.Audio.Media.ARTIST, // 歌手 MediaStore.Audio.Media.ALBUM // 專輯 }; // 讓Android系統也會去讀取外置存儲 Cursor cursor = getContentResolver().query(uri, projection, null, null, null, null); if (cursor.moveToFirst()) { tvPlayerPath.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))); String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); tvAudioInfo.setText("歌曲時長:" + postions(Integer.parseInt(duration)) + " \n歌手:" + artist + " \n專輯:" + album); } } /** * 轉換時長值 */ private String postions(int postion) { int musicTime = postion / 1000; return musicTime / 60 + ":" + musicTime % 60; } /** * 開始播放:此次播放使用普通准備,不使用異步准備 * @param view */ public void player(View view) { try { // 重置 mediaPlayer.reset(); // 設置音頻文件路徑 mediaPlayer.setDataSource(tvPlayerPath.getText().toString().trim()); // 准備:是操作硬件在播放,所以需要准備 mediaPlayer.prepare(); // 開始 mediaPlayer.start(); } catch (Exception e) { e.printStackTrace(); } } /** * 暫停播放 繼續播放 * @param view */ public void pause(View view) { /** * 這種方式可以拿到控件 */ Button pause_continue = (Button) view; if (mediaPlayer.isPlaying()) { pause_continue.setText("繼續"); // 暫停 mediaPlayer.pause(); } else { pause_continue.setText("暫停"); // 繼續播放 mediaPlayer.start(); } } /** * 停止播放 */ public void stop(View view) { // 停止播放 mediaPlayer.stop(); } /** * 重播 * @param view */ public void recorded(View view) { try { /** * 一定要seekTo * 因為由於沒有執行reset,mediaPlayer不會從0開始播放,所以要設置 */ mediaPlayer.seekTo(0); // 准備:是操作硬件在播放,所以需要准備 mediaPlayer.prepare(); // 播放 mediaPlayer.start(); } catch (Exception e) { e.printStackTrace(); } } /** * 此Activity銷毀后,一定要 * mediaPlayer.release(); * mediaPlayer = null; * 因為 MediaPlayer 是操作硬件在播放,所以一定要釋放資源 */ @Override protected void onDestroy() { super.onDestroy(); mediaPlayer.release(); mediaPlayer = null; System.gc(); } }
AndroidManifest.xml 配置 外部存儲讀取權限:
Android系統也會去讀取外置存儲,需要讀取外部存儲的權限
<!-- getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, ...) Android系統也會去讀取外置存儲,需要讀取外部存儲的權限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MediaPlayAudioActivity" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放音頻.mp3路徑:" /> <TextView android:id="@+id/tv_player_path" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="/mnt/sdcard/" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="播放" android:onClick="player" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="暫停" android:onClick="pause" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="停止" android:onClick="stop" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="重播" android:onClick="recorded" /> </LinearLayout> <TextView android:id="@+id/tv_audio_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="test" /> <TextView android:id="@+id/tv_audio_this_duration" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="歌曲時長:-" /> </LinearLayout>
播放效果: