VideoView不会显示在片段上

时间:2012-11-21 08:39:16

标签: android android-fragments android-canvas hardware-acceleration

我在三星S3(Android 4.1.1)中运行视频时遇到问题,问题似乎是因为视频片段在片段上,因为如果我把它放在活动上,它就可以了。 我还发现如果我打开GPU硬件加速,视频就可以工作了。 我还有一个通过在SurfaceView上绘图而制作的游戏,该视图也不起作用(仅在启用GPU的情况下)...应用程序内容的其余部分按其应该显示(按钮和其他布局)。

我在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;
    }

}

我不认为它与上下文(应用程序或活动)有关...因为在所有其他设备上显示视频和游戏.. 谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

我有类似的问题,我解决了这个问题:

 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

答案 1 :(得分:1)

如果硬件加速可以解决您的问题,那么我会在该设备上enable it for that view/window

一般情况下,我发现当代码在一台设备上运行但不在另一台设备上运行时,通常会由以下问题之一引起:

  1. 制造商API实施中的错误
  2. 制造商对API的不同解释
  3. 您自己的代码中的并发问题(例如竞争条件,不正确的同步)恰好会在特定设备上更频繁地触发
  4. 据我所知,你好像正在使用UI线程,所以我想你的问题属于前两个类别之一,你只需要解决它。

答案 2 :(得分:0)

MediaController mediaController = new MediaController(getActivity())onResume()移至onCreateView