Android 4.4.4 在线播放mp3文件存在的问题

来源:互联网 发布:淘宝买至宝 编辑:程序博客网 时间:2024/04/30 06:44

Android写一个很简单的mediaplay播放:

在构造函数中创建对象,设置监听

<span style="white-space:pre"></span>mediaPlayer = new MediaPlayer();<span style="white-space:pre"></span>mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);<span style="white-space:pre"></span>mediaPlayer.setOnBufferingUpdateListener(this);<span style="white-space:pre"></span>mediaPlayer.setOnPreparedListener(this);<span style="white-space:pre"></span>mediaPlayer.setOnCompletionListener(this);<span style="white-space:pre"></span>mediaPlayer.reset();

点击listview的item后调用播放:

<span style="white-space:pre"></span>mediaPlayer.setDataSource(videoUrl);<span style="white-space:pre"></span>mediaPlayer.prepareAsync();// prepare之后自动播放
在设置监听 setOnPreparedListener 函数接口中实现mediaPlayer.start();

在代码逻辑上看着貌似没有任何问题。

在真正试用中发现,当网络状况不好,播放一首歌曲永远调用不了setOnPreparedListener函数一直在准备播放中,当网络好了就可以播放了,但网络一直不好的情况下,只能等下去,因为切下一首他会告诉你是无效操作,真个操作中断不了。

在Android源码4.4.4上通过framework层代码分析,问题一直追踪到url_request.cc文件中。

第二次reset是调用这个方法,被卡死,没有返回,


上面的步骤去调用下面的函数,取回包头,判断文件类型解码。

 

 

在解码类型文件中调用这个readat,去读取数据。并等待锁返回

如果数据不会来,循环,回来再解锁。

 


 在这儿循环在判断,

在访问网络的文件中

只有在网络有数据和失去连接后。这个锁才会被释放。

 

访问return没有调用上层onReadCompleted,时会出现问题。每次在return哪儿加调用,正常播放成为了概率事件。(网络特别好的情况下有几次能播)

整个过程交给了,

这个函数被底层net::URLRequest 

调用OnReadCompleted函数被底层调用。如果不调用,上层就被while锁住。

被锁的问题是在搞不定。Android5.1改变了访问网络的方式,使用mediahttp,最终调用api成的mediaplayhttpconnect去访问网络。

这个地方还可以怎么改一下???????????

 

0 0
原创粉丝点击