Видеофрагмент не отображается на фрагменте
У меня возникла проблема с запуском видео в Samsung S3 (Android 4.1.1), похоже, проблема связана с тем, что видеообзор находится на фрагменте, потому что, если я его включу и активирую, он будет работать.
Также я узнал, что если я включу аппаратное ускорение GPU, видео будет работать.
У меня также есть игра, созданная с помощью SurfaceView, и это представление не работает (только с включенным графическим процессором)... Остальная часть содержимого приложения отображается как предполагается (кнопки и другие макеты).
Я тестировал приложение на Nexus S и на эмуляторе, и он отлично работает, а также на других устройствах.
Кто-нибудь знает, в чем проблема?
Спасибо!
И вот код:
public class VideoFragment extends Fragment implements MediaPlayer.OnCompletionListener,
MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener {
private Video mVideo;
private VideoView mVideoView;
// The video position
private int mPosition;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.screen_video, container, false);
mVideoView = (VideoView) fragmentView.findViewById(R.id.VideoView);
return fragmentView;
}
@Override
public void onPause() {
super.onPause();
// Pause the video if it is playing
if (mVideoView.isPlaying()) {
mVideoView.pause();
}
// Save the current video position
mPosition = mVideoView.getCurrentPosition();
}
@Override
public void onResume() {
super.onResume();
mVideoView.setOnCompletionListener(this);
mVideoView.setOnPreparedListener(this);
mVideoView.setOnErrorListener(this);
mVideoView.setKeepScreenOn(true);
// Initialize the media controller
MediaController mediaController = new MediaController(getActivity());
mediaController.setMediaPlayer(mVideoView);
// Set-up the video view
mVideoView.setMediaController(mediaController);
mVideoView.requestFocus();
mVideoView.setVideoPath(mVideo.getUrl());
if (mVideoView != null) {
// Restore the video position
mVideoView.seekTo(mPosition);
mVideoView.requestFocus();
}
}
@Override
public void onDestroy() {
super.onDestroy();
// Clean-up
if (mVideoView != null) {
mVideoView.stopPlayback();
mVideoView = null;
}
}
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
Log.e("VIDEO PLAY", "end video play");
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
// Start the video view
mediaPlayer.start();
Log.e("VIDEO PLAY", "video ready for playback");
}
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
Log.e("VIDEO PLAY", "error: " + i);
return true;
}
}
Я не думаю, что это связано с контекстом (приложение или активность).. потому что на всех других устройствах отображается видео и игры.
Спасибо за помощь!
Ответы
Ответ 1
Если аппаратное ускорение исправляет вашу проблему, я бы включить его для этого вида/окна на этом устройстве.
В общем, я обнаружил, что, когда код работает на одном устройстве, но не в другом, он обычно вызван одной из следующих проблем:
- Ошибка в реализации API-интерфейса производителя
- Различная интерпретация API производителем.
- Concurrency проблема (например, состояние гонки, неправильная синхронизация) в вашем собственном коде, который чаще срабатывает на определенном устройстве.
Насколько я могу судить, вы, кажется, используете поток пользовательского интерфейса, поэтому я бы предположил, что ваша проблема попадает в одну из первых двух категорий, и вам просто нужно будет обойти ее.
Ответ 2
У меня есть аналогичная проблема, и я решил ее изменить:
MediaController mediaController = new MediaController(getActivity().getApplicationContext());
к этому (в фрагменте):
MediaController mediaController = new MediaController(getActivity());
Надеюсь, что это поможет,...
ИЗМЕНИТЬ
Посмотрите на этот класс
http://code.google.com/p/sinaweibo-honeycomb/source/browse/branches/sinaweibo-merged/src/com/lenovo/dll/SinaWeibo/VideoFragment.java?r=71
Ответ 3
Переместите MediaController mediaController = new MediaController(getActivity())
с onResume()
на onCreateView
.