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更好