Android-MediaPlayer-音頻播放-普通准備


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>

 

播放效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM