У меня есть приложение, созданное для уровня API 2.2. Это приложение содержит видео, которое начинает воспроизводиться сразу после запуска. Видео воспроизводится внутри VideoView, и фактически видеофайл хранится в моем внутреннем хранилище (каталог файлов для пакета моих приложений).
Большую часть времени он запускается просто отлично. Но иногда я получаю всплывающее сообщение об ошибке «К сожалению, это видео не может быть воспроизведено». и имеет кнопку ОК. Как только я нажимаю кнопку ОК, видео начинает воспроизводиться правильно. Мне нужно выяснить, что является причиной этой ошибки, или, по крайней мере, как я могу поймать любую ошибку, и сделать это еще раз, так как она всегда работает идеально после того, как я нажму ОК. Внутри журналов, когда отображается это окно с ошибкой, я вижу следующие сообщения:
ERROR/PVOMXAudDecNode(21215): Ln 2232 OMX_EventError nData1 -2147479547 nData2 0
ERROR/PlayerDriver(21215): Command PLAYER_PREPARE completed with an error or info -18
ERROR/MediaPlayer(9282): message received msg=100, ext1=1, ext2=-18
ERROR/MediaPlayer(9282): error (1, -18)
ERROR/MediaPlayer(9282): callback application
ERROR/MediaPlayer(9282): back from callback
ERROR/MediaPlayer(9282): Error (1,-18)
DEBUG/VideoView(9282): Error: 1,-18
Где найти ссылку на то, что именно указывает код ошибки -18? И есть ли у кого-нибудь предложения, которые я мог бы попытаться предотвратить, в первую очередь. Я только наблюдал эту ошибку на Sprint Epic 4g.
Edit: насколько я могу судить, мне не бросают никаких исключений. Я предполагаю, что происходит то, что просмотр видео знает, как отследить любое исключение, вызывающее всплывающее окно. Внутри моего журнала нет трассировки стека исключений, только эта ссылка на ошибку -18.
Что касается того, как я звоню, готовьтесь. Я использую это:
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
mVideoView.start();
}
});
и это:
mVideoView.setVideoPath(file.getAbsolutePath());
он вызывает prepare как часть setVideoPath (я предполагаю, что это так или иначе, но этот метод недокументирован). что вызывает вызов onPrepared в моем слушателе.
Редактировать 2: сейчас я только что добавил onErrorListener следующим образом:
РЕДАКТИРОВАТЬ ВАЖНО! этот код вызовет цикл ошибок в ICS. Для устройств ICS я снял вызов setPath и вместо этого возвратил false. Он пробует снова один раз и успешно.
mVideoView.setOnErrorListener(new OnErrorListener(){
@Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
Log.i(myTag, "MP ERROR: "+ arg1 + " - " + arg2);
mVideoView.setVideoPath(file.getAbsolutePath());
return true;
}
});
это ловит ошибку, и я вижу в моих журналах, что arg2 = -18, когда эта ошибка происходит. Я просто повторяю и возвращаю истину, чтобы не вызывать диалог. До сих пор я никогда не видел, чтобы два раза подряд происходил сбой, поэтому это всегда правильно запускает видео и не делает бесконечный цикл.
Мне все еще очень интересно, может ли кто-нибудь сказать мне, что именно код ошибки -18 указывает.