11

Samsung 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;
    }

}

他のすべてのデバイスではビデオとゲームが表示されるため、コンテキスト(アプリケーションまたはアクティビティ)に関連するものではないと思います。助けてくれてありがとう!

4

3 に答える 3

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

于 2012-11-29T17:35:32.773 に答える
1

ハードウェアアクセラレーションで問題が解決した場合は、そのデバイスのそのビュー/ウィンドウで有効にします。

一般に、コードが1つのデバイスで機能するが、別のデバイスでは機能しない場合、通常、次のいずれかの問題が原因であることがわかりました。

  1. メーカーのAPI実装のバグ
  2. メーカーによるAPIの異なる解釈
  3. 特定のデバイスでより頻繁にトリガーされる独自のコードの同時実行の問題(競合状態、不適切な同期など)

私が知る限り、UIスレッドを適切に使用しているように見えるので、問題は最初の2つのカテゴリのいずれかに該当し、回避する必要があると思います。

于 2012-12-01T16:06:21.947 に答える
0

MediaController mediaController = new MediaController(getActivity())からonResume()に移動しonCreateViewます。

于 2016-04-16T07:28:46.547 に答える