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();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值