Android MediaPlayer讲解

 你是不是在迷茫,我艹,这个Android 的MediaPlayer 怎么tm那么难用,用起来全tm问题,

1.为什么播着播着就闪退了,

2.为什么老子一切换 播放的path 也tm闪退

3.为什么老子结束了activity还tm在播放?

4.....


如果你遇到上述问题,莫慌请往下看:


今天跟往常一样,一个菜包,一个荠菜,一个鸡蛋,一个鲜牛奶。。。

 今天我来给大家简单讲解一下,在使用Mediaplayer 的时候遇到的坑,作为Android 原生 的东西,诶,这个Mediaplayer 是真tm坑,下面请听我慢慢道来。

1. Mediaplayer 的使用,这个东西大家一般都会用,无非

  mediaPlayer = new MediaPlayer();
    mediaPlayer.setDataSource(path);
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mediaPlayer.start();
                        }
                    });
就像这样的一个异步调用,一般不同步调用。 然后有几个注意的地方,它有几个监听你最好带上:

  mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {

                    Log.i("TEST", "onError-=-->" + what);
                    return false;
                }
            });


   //监听MediaPlayer播放完成
                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer paramMediaPlayer) {

                        mediaPlayer.release();
                        mediaPlayer = null;
                        callOver.setOnFinishListen(1);
                    }
                });
前一个是错误监听,后一个是播放完成的监听。

第一个错误的监听非常重要,最主要的功能就是看 服务器返回给你rul 地址对应的播放源 能否播放,mmp,然后做一些简单处理,没了。

第二个 完成的监听也很重要,我们可以在这个监听里面处理一些播放完成后的ui的页面上的变化。


前方高能:

下面我要说的是tm重中之重,你有没有发现,我上面再哪个环节漏了一个try,catch?

说真的,java中的try,catch 很多人都会忽视掉,觉得编译器需要我就写了一下,但实际不是这样的,


  try {
                    mediaPlayer.setDataSource(path);
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mediaPlayer.start();
                        }
                    });


                } catch (IoException e) {

                    onDestroy();
                    Log.i("TEST", "e--=>" + e);
                    return;
//                    e.printStackTrace();
                }


  try {
                    mediaPlayer.setDataSource(path);
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mediaPlayer.start();
                        }
                    });


                } catch (Exception e) {

                    onDestroy();
                    Log.i("TEST", "e--=>" + e);
                    return;
//                    e.printStackTrace();
                }

仔细看 上面两端貌似一样的代码,大声告诉我你看到了什么,没错,他们是一样的,请你在仔细点看,哦,原来 catch 后面的 Exception 不一样,

没错,默认的我们再写 media.setdatesouce 的时候,是catc ioException,然后实际使用过程中,很多是 mediaplayer 的生命周期所报出的 InstateException,即是类型转换错误, 说到这里,你需要去了解一下 Android Mediaplayer 的生命周期, 这里有个很变态的东西,

就是 setdatasouce 一个周期只能set 一次,想要重新set怎么办,没错,就是结束掉当前medialplayer,再重新new 一个,如果有更好的方法可以告诉我。

所以很多情况下 再执行到这一步的时候,就GG了,闪退了 mmp的,二系统默认给出的是 ioException,所以我们捕捉不到这个异常,当时我百思终骑姐,换成

catch Exception,这样,他么的就能捕捉到异常了,就不用再闪退了,made! 在里面做任何你想做的事情。


说到这里,其实大体上就差不多讲完了,如果还有问题,反正我也不知道。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值