我开发了一个利用原生 Android 的 MediaPlayer 的应用程序。我的班级使用媒体播放器的源代码如下。
问题是,只有在播放几毫秒后才在某些设备上(我只听到声音,屏幕保持黑色)我不断得到error(100,0)
根据文档说
public static final int MEDIA_ERROR_SERVER_DIED
媒体服务器死机。在这种情况下,应用程序必须释放 MediaPlayer 对象并实例化一个新对象。
在论坛上,我发现每次获得播放器时都需要重置播放器……但我在短短片刻后就获得了它,然后它就永远死了。我不能每秒都重置播放器,因为播放没用。我不明白为什么有些设备有这个问题而其他设备没有。我知道的有 Android OS > 4.0。
当然,首先init()
,然后showVideo()
是被调用。onError
然后调用代码为 100的最后一个。使流连续运行而不中断的潜在解决方案是什么?
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);
}
}
}