我开发了一个应用程序,利用了本机Android的MediaPlayer。以下是使用媒体播放器的我的类的源代码。
问题在于,在某些设备上播放几毫秒后(我只听到声音,屏幕仍然黑色),我一直收到错误(100,0),根据文档的说法
“public static final int MEDIA_ERROR_SERVER_DIED” 媒体服务器已死。 在这种情况下,应用程序必须释放MediaPlayer对象并实例化新对象。
在论坛上,我发现每次获取它时都需要重置播放器...但是我很快就得到了它,然后它永远死亡。 每秒重置播放器是无用的。 我不明白为什么有些设备会出现这个问题,而其他设备则不会。 我知道其中一个设备具有Android OS> 4.0。
当然,首先调用
问题在于,在某些设备上播放几毫秒后(我只听到声音,屏幕仍然黑色),我一直收到错误(100,0),根据文档的说法
“public static final int MEDIA_ERROR_SERVER_DIED” 媒体服务器已死。 在这种情况下,应用程序必须释放MediaPlayer对象并实例化新对象。
在论坛上,我发现每次获取它时都需要重置播放器...但是我很快就得到了它,然后它永远死亡。 每秒重置播放器是无用的。 我不明白为什么有些设备会出现这个问题,而其他设备则不会。 我知道其中一个设备具有Android OS> 4.0。
当然,首先调用
init()
,然后调用showVideo()
。最后会调用错误代码为100的onError
。如何使流连续运行而不中断?可能的解决方案是什么?public class NativePlayer extends Player implements OnBufferingUpdateListener,
OnCompletionListener, OnErrorListener, OnInfoListener {
private VideoView videoview;
private PlayerListener listener;
private MainActivity context;
private final Logger logger = LoggerFactory.getLogger(NativePlayer.class);
@Override
public void init(MainActivity activity) {
this.videoview = (VideoView) activity.findViewById(R.id.video);
context = activity;
}
@Override
public void showVideo(final String url, final PlayerListener _listener) {
listener = _listener;
videoview.setVisibility(View.VISIBLE);
try {
Uri video = Uri.parse(url);
videoview.setVideoURI(video);
} catch (Exception e) {
logger.error("Error playing video", e);
listener.onVideoError();
return;
}
videoview.setOnCompletionListener(this);
videoview.setOnErrorListener(this);
videoview.requestFocus();
videoview.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
videoview.start();
if (listener != null) {
listener.onVideoStarted();
}
}
});
}
@Override
public void onStop() {
stop();
}
private void stop() {
if (videoview == null) {
return;
}
if (videoview.isPlaying()) {
videoview.stopPlayback();
}
}
@Override
public void onDestroy() {
}
@Override
public void onCompletion(MediaPlayer mp) {
stop();
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
if (listener != null) {
listener.onVideoError();
}
return false;
}
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (listener != null) {
listener.onInfo(what, extra);
}
return false;
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
if (listener != null) {
listener.onBufferingUpdate(percent);
}
}
}