ネイティブ Android の MediaPlayer を利用するアプリを開発しました。Media Player を使用するクラスのソース コードは次のとおりです。
問題は、数ミリ秒の再生後に一部のデバイスでのみ発生することです(音声のみが聞こえ、画面は黒いままです)ドキュメント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);
}
}
}