Android多媒體—音頻技術

一、概述

視頻和音樂的操作思想其實都是差不多的。其中音樂的API圖已經概括了MedialPlayer的使用步驟,有兩個分支需要關注:

  • 本地音樂,可以直接 setDataSource–prepare—start
  • 網絡音樂,考慮到ANR,放到子線程中 setDataSource–prepareAsync–setOnPreparedListener(在其中的onPrepared方法中設置開始)–start
    這裏寫圖片描述

二、小技巧

  • 涉及到暫停再播放的問題,可以用SharedPreferences,存放播放的位置,再次打開時,用seekTo跳到指定的位置。
  • 爲了防止播放錯誤,可以對MediaPlayer設置錯誤的監聽事件setOnErrorListener.onError()
  • 當播放完時,執行如下,可以設置下一曲或循環等操作

    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.seekTo(0);
            mp.start();
        }
    }
  • 停止時注意release資源

三、本地音樂操作

public class MainActivity extends Activity {

    private Button start;
    private Button pause;
    private Button stop;
    private EditText et;
    private MediaPlayer mediaPlayer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        start = (Button) findViewById(R.id.start);
        pause = (Button) findViewById(R.id.pause);
        stop = (Button) findViewById(R.id.stop);

        et = (EditText) findViewById(R.id.editText1);


    }

    public void start(View v){

        //先拿到路徑
        String path = et.getText().toString().trim();
        //文件路徑不能爲空
        if(TextUtils.isEmpty(path)){
            Toast.makeText(this, "文件名不能爲空", 0).show();
            return; 
        }
        //文件路徑要對
        if(!(new File(path).exists())||!path.endsWith(".mp3")){
            Toast.makeText(this, "文件不存在或者不是音頻文件,請檢查。。。", 0).show();
            return; 
        }
        try {
            //1.創建一個多媒體對象

            mediaPlayer = new MediaPlayer();
            //2.設置資源
            mediaPlayer.setDataSource(path);

            //3.準備
            mediaPlayer.prepare();

            //4.開始讀
            mediaPlayer.start();
            //5.當音頻文件有錯時,執行如下
            mediaPlayer.setOnErrorListener(new OnErrorListener() {

                public boolean onError(MediaPlayer mp, int what, int extra) {
                    return false;
                }
            });
            //6.當播放完時,執行如下,可以設置下一曲或循環等操作
            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    mp.seekTo(0);
                    mp.start();

                }
            });

        } catch ( Exception e) {
            e.printStackTrace();
        }

    }
    public void pause(View v){
        if(mediaPlayer.isPlaying()){
            mediaPlayer.pause();
        }else {
            mediaPlayer.start();
        }
    }
    public void stop(View v){
        if (mediaPlayer != null){
            mediaPlayer.stop();
            mediaPlayer.seekTo(0);
            mediaPlayer.release();
        }
    }
}

四、網絡音樂的操作

public class MainActivity extends Activity {
    private EditText et;
    private MediaPlayer mediaPlayer;
    private ProgressDialog dialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        et = (EditText) findViewById(R.id.editText1);
        dialog = new ProgressDialog(this);
        dialog.setMessage("正在拼命加載中。。。");


    }

    public void start(View v){

        //先拿到路徑
        String path = et.getText().toString().trim();
        if(TextUtils.isEmpty(path)){
            Toast.makeText(this, "文件名不能爲空", 0).show();
            return; 
        }

        try {
            //1.創建一個多媒體對象

            mediaPlayer = new MediaPlayer();
            //2.設置資源
            mediaPlayer.setDataSource(path);

            //3.用異步去準備,從而讓子線程去執行
            dialog.show();
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

                @Override
                public void onPrepared(MediaPlayer mp) {
                    //4.準備
                    try {
                        mediaPlayer.start();
                        dialog.dismiss();
                    } catch ( Exception e) {
                        e.printStackTrace();
                    }
                    //4.開始讀
                }
            });


            //5.當音頻文件有錯時,執行如下
            mediaPlayer.setOnErrorListener(new OnErrorListener() {

                public boolean onError(MediaPlayer mp, int what, int extra) {
                    return false;
                }
            });
            //6.當播放完時,執行如下,可以設置下一曲或循環等操作
            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    mp.seekTo(0);
                    mp.start();

                }
            });


        } catch ( Exception e) {
            e.printStackTrace();
        }

    }
    public void pause(View v){
        if(mediaPlayer.isPlaying()){
            mediaPlayer.pause();
        }else {
            mediaPlayer.start();
        }
    }
    public void stop(View v){
        if (mediaPlayer != null){
            mediaPlayer.stop();
            mediaPlayer.seekTo(0);
            mediaPlayer.release();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章