Android多媒体—音频技术

来源:互联网 发布:c语言 戏说关键字 ppt 编辑:程序博客网 时间:2024/05/21 16:23

一、概述

视频和音乐的操作思想其实都是差不多的。其中音乐的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();        }    }}
0 0
原创粉丝点击