Подтвердить что ты не робот

Видеофрагмент не отображается на фрагменте

У меня возникла проблема с запуском видео в 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;
    }

}

Я не думаю, что это связано с контекстом (приложение или активность).. потому что на всех других устройствах отображается видео и игры. Спасибо за помощь!

4b9b3361

Ответ 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.