3

ビデオを表示する videoView があり、デフォルトのメディア コントローラーを表示したいと考えています。何らかの理由で、コントローラーが表示されたくないようです。

私はxmlでMediaControllerを作成し、常に表示されるように設定し、メディアプレーヤーに接続しようとしましたが、何も機能してmMediaController.setMediaPlayer(mVideoView)いないようです。

ここで見つけることができる Google の従来のビデオ プレーヤー コードを使用しています

何が起こっている可能性がありますか?リスナーはイベントを失いますか? 実際の動画再生には付きませんか?使用しているコードに何か他のものを追加する必要がありますか (以下を参照)。

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.activity_content_video);

    [...]

    mVideoView = (VideoView) findViewById(R.id.surface);
    mainVideoHolder = (LinearLayout) findViewById(R.id.main_video_holder);


    holder = mVideoView.getHolder();
    holder.addCallback(this);

    mMediaController = new MediaController(this);

    mMediaController.show();
}



private void playVideo() {
    doCleanUp();
    try {
        mMediaPlayer = new MediaPlayer();
        Log.d(tag, "surfaceCreated");
        File f = new File(mAssetsPath);
        File[] files = f.listFiles();
        Log.d(tag, "File: " + files[0].toString());

        URI uri = URI.create("file://" + (files[0].toString()));
        File file = new File(uri);
        ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE);
        mMediaPlayer.setDataSource(parcel.getFileDescriptor());

        mMediaPlayer.setDisplay(holder);

        mMediaPlayer.prepare();

        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnPreparedListener(this);
        mMediaPlayer.setOnVideoSizeChangedListener(this);

        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        mMediaController.setMediaPlayer(mVideoView);

        mVideoView.setMediaController(mMediaController);
    } catch (Exception e) {
        Log.e(tag, "error: " + e.getMessage(), e);
    }
}


public void surfaceCreated(SurfaceHolder holder) {
    Log.d(tag, "surfaceCreated called");
    playVideo();
}

どんなアイデアでも大歓迎ですか?

アクティビティに適用されるテーマはなく、ビデオはエラーなしで正常に再生されます。メディア コントロールが表示されないだけです。

ありがとう。

4

4 に答える 4

1

できる限りのことを試した後、次のコードがうまくいきました!

        mVideoView = (VideoView) findViewById(R.id.video);

        mMediaController = new MediaController(this) {
            //for not hiding
            @Override
            public void hide() {}

            //for 'back' key action
            @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                    Activity a = (Activity)getContext();
                    a.finish();
                }
                return true;
            }
        };

        mMediaController.setAnchorView(mVideoView);
        mMediaController.setMediaPlayer(mVideoView);
        mVideoView.setMediaController(mMediaController);
        mMediaController.requestFocus();

        //only this showed the controller for me!!
        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mVideoView.start();
                mMediaController.show(900000000);
            }
        });

        //finish after playing
        mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                finish();
            }
        });
于 2014-08-21T19:23:52.947 に答える
0

この回答が少し遅れているかどうかはわかりませんが、他の誰かがその問題を抱えている可能性があります。ドクはフェローを言います:

このクラスを使用する方法は、プログラムでインスタンス化することです。MediaController は、コントロールのデフォルト セットを作成し、それらをアプリケーションの上に浮かぶウィンドウに配置します。具体的には、コントロールは setAnchorView() で指定されたビューの上に浮かびます。ウィンドウは 3 秒間アイドル状態のままにすると消え、ユーザーがアンカー ビューに触れると再び表示されます。

したがって、次のようにすることができます (この場合、MediaPlayer は VideoView です。

VideoView videoView = (VideoView) findViewById(R.id.videoView);
videoView.setVideoPath(uri);
MediaController controller = new MediaController(this);
controller.setAnchorView(videoView);
controller.setMediaPlayer(videoView);
videoView.setMediaController(controller);
videoView.start();

これは私にとってはうまくいきました。

于 2012-12-11T17:54:30.510 に答える
0
this work for me:

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        getWindow().setFormat(PixelFormat.UNKNOWN);

        mVideoView = (VideoView)findViewById(R.id.videoview);   
        mc = new MediaController(this){
            @Override
            public void hide() {} //dont hide control
        };

        new MyDelay2().execute("");
    }

    private class MyDelay2 extends AsyncTask<String,Void,String>{

        @Override
        protected String doInBackground(String... params) {                 
            Uri uri2 = Uri.parse("android.resource://com.blah/"+R.raw.cool);
            mVideoView.setVideoURI(uri2);
            return null;
        }


        @Override
        protected void onPostExecute(String result) {   
            dialog.dismiss();
            mc.setAnchorView(mVideoView);
            mc.setMediaPlayer(mVideoView);
            mc.setEnabled(true);
            mVideoView.setMediaController(mc);      

            mc.show();
        }       
    }
于 2014-07-18T14:08:41.757 に答える
0

コントローラーをレイアウトのどこに追加しますか? また、コンテナが十分な大きさであることを確認してください。ビデオ コントローラを追加する前に、背景を与えて、画面にうまく表示されるかどうかを確認します。

于 2012-02-01T17:00:59.790 に答える