Android GetMediaPlayer错误的持续时间(1,-107)

Android GetMediaPlayer错误的持续时间(1,-107),android,android-mediaplayer,Android,Android Mediaplayer,在我的列表视图中我正在显示来自API的一些媒体内容。API不包含任何关于媒体持续时间的信息,所以我想我应该创建一个帮助器类来处理这个问题 public static String getPodDuration(String url){ utils = new Utilities(); try{ mep = getInstance(); mep.reset(); mep.setDataSource(url); mep.prepareAsync();

在我的
列表视图中
我正在显示来自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;
}
在这些方法的帮助下,我在main类中传递媒体文件的URL。但出于某种原因,它只给了我0:00的价值<代码>utils.millissecondstotimer(持续时间)方法工作正常

我得到以下错误:

error (1, -107)

有人能帮助实现这一点吗?我不必玩这种媒体,我只需要知道它的持续时间

编辑回复:

错误
错误(1,-107)
来自播放器引擎,即播放器试图连接到
URL
NuPlayer
引擎。错误代码
-107
对应于
ENOTCONN
(参考:)。请检查您提供给播放机的
URL
的连接

附言:你能尝试一下基于
文件的输入吗

旧的响应:

在状态8中调用的错误
prepareAsync
表示
MediaPlayer
处于
PREPARED
状态,因此在此状态下调用
prepareAsync
是错误的。我觉得您的问题可能是由于在实现过程中调用了
reset
。请参考这篇文章,它解释了新创建和重置播放器之间的区别,特别是状态图下面的段落

我建议您修改get实例实现,以包含
版本
,并按如下方式删除重置。我觉得这应该可以解决您的问题

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,-107)
来自播放器引擎,即播放器试图连接到
URL
NuPlayer
引擎。错误代码
-107
对应于
ENOTCONN
(参考:)。请检查您提供给播放机的
URL
的连接

附言:你能尝试一下基于
文件的输入吗

旧的响应:

在状态8中调用的错误
prepareAsync
表示
MediaPlayer
处于
PREPARED
状态,因此在此状态下调用
prepareAsync
是错误的。我觉得您的问题可能是由于在实现过程中调用了
reset
。请参考这篇文章,它解释了新创建和重置播放器之间的区别,特别是状态图下面的段落

我建议您修改get实例实现,以包含
版本
,并按如下方式删除重置。我觉得这应该可以解决您的问题

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;
}

您希望从异步操作获得同步输出。当
getPodDuration
方法返回时,准备好的回调将不会发生,因此
duration
将是进入该方法之前的状态


此外,只需设置一次准备好的侦听器。将其设置在创建
MediaPlayer
的同一位置。就我个人而言,我不喜欢这种情况下的单例模式,但它应该仍然有效。您的
持续时间
成员将需要与
MediaPlayer

一起保持静态。您希望从异步操作中获得同步输出。当
getPodDuration
方法返回时,准备好的回调将不会发生,因此
duration
将是进入该方法之前的状态


此外,只需设置一次准备好的侦听器。将其设置在创建
MediaPlayer
的同一位置。就我个人而言,我不喜欢这种情况下的单例模式,但它应该仍然有效。您的
duration
成员需要与
MediaPlayer

一起保持静态。谢谢您的帮助,但是实现冻结了用户界面,并提供了相同的输出。我之所以使用重置,是因为我要为几个URL调用此方法。请检查已编辑的问题。在状态8中调用的prepareAsync已不存在,但我在mediaplayer(1,-107)上仍有错误。。。顺便说一句,那是什么。。。我在任何地方都找不到这种类型的错误。@user2247689。。请检查我编辑的回复。您能否确认输入是流式输入还是基于文件的输入?它是流式输入,目前只能与流式url输入一起使用。我在一个单独的片段中使用相同的URL实现了mediaPlayer,效果很好。谢谢您的帮助,但该实现冻结了UI并提供了相同的输出。我之所以使用重置,是因为我要为几个URL调用此方法。请检查已编辑的问题。在状态8中调用的prepareAsync已不存在,但我在mediaplayer(1,-107)上仍有错误。。。顺便说一句,那是什么。。。我在任何地方都找不到这种类型的错误。@user2247689。。请检查我编辑的回复。您能否确认输入是流式输入还是基于文件的输入?它是流式输入,目前只能与流式url输入一起使用。我在一个单独的片段中使用相同的URL实现了mediaPlayer,效果很好。那么您有什么建议?我现在应该如何做,而不是使用单例模式?单例是在
服务中
还是在
活动中
?如果它不在
服务中
,我会把它放在那里。如果它在
服务中
,它不需要是单例,只需要一个普通成员即可(应该只有一个
服务的实例
)。我刚刚发现处理
MediaP更好