在我的listView
我正在显示来自API的媒体内容。 API不包含有关媒体持续时间的任何信息,所以我想我会做一个帮助类来处理这个问题。
public static String getPodDuration(String url){
utils = new Utilities();
try{
mep = getInstance();
mep.reset();
mep.setDataSource(url);
mep.prepareAsync();
mep.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
duration = mep.getDuration();
Log.i("duration", String.valueOf(duration));
}
});
} catch(IllegalArgumentException e){
} catch(IllegalStateException e){
} catch(IOException e){
}
return String.valueOf(utils.milliSecondsToTimer(duration));
}
getInstance()
如下:
static MediaPlayer mep = null;
public static MediaPlayer getInstance(){
if(mep == null){
mep = new MediaPlayer();
}
return mep;
}
所以在这些方法的帮助下,在主类中我传递媒体文件的URL。但由于某种原因,它只给我0:00的价值。 utils.milliSecondsToTimer(duration)
方法可以正常工作。
我收到以下错误:
error (1, -107)
有人可以帮忙实现吗?我不需要播放这种媒体,我只需要获得它的持续时间。
答案 0 :(得分:1)
已编辑的回复:
错误error (1, -107)
来自玩家引擎即NuPlayer
引擎,其中玩家正在尝试连接URL
。错误代码-107
对应ENOTCONN
(参考:errno
)。请检查您提供给播放器的URL
的连接。
P.S:你可以试试基于file
的输入吗?
OLD回复:
错误prepareAsync called in state 8
表示MediaPlayer
处于PREPARED
状态,因此,在此状态下调用prepareAsync
是错误的。我觉得您的问题可能是由于reset
被调用作为实施的一部分。请参阅此link here,它解释了新创建和重置播放器之间的差异,尤其是状态图下方的段落。
我建议你修改你的获取实例实现以包含release
并删除重置如下。我觉得这可以解决你的问题。
public static String getPodDuration(String url){
utils = new Utilities();
try{
mp = getInstance();
mp.setDataSource(url);
mp.prepareAsync();
........
static MediaPlayer mp = null;
public static MediaPlayer getInstance(){
if(mp != null){
mp.release();
}
mp = new MediaPlayer();
return mp;
}
答案 1 :(得分:0)
您期望异步操作的同步输出。在getPodDuration
方法返回时,准备好的回调将不会发生,因此duration
将是它进入方法之前的任何内容。
此外,您只需要设置一次准备好的侦听器。将其设置在您创建MediaPlayer
的相同位置。就个人而言,在这种情况下,我不是单身模式的粉丝,但它应该仍然有效。您的duration
成员需要与MediaPlayer
一起保持静态。