facebook twitter hatena line email

Android/VideoView/イベント

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

動画プレイヤーサンプル(イベント)

import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.VideoView;
public class MainActivity extends AppCompatActivity {
    private VideoView mVideoView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mVideoView = new VideoView(this);
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        layoutParams.gravity = Gravity.CENTER;
        FrameLayout layout = (FrameLayout)findViewById(R.id.videoLayout);
        layout.addView(mVideoView, layoutParams);
                // タッチイベント(タッチしてるときはずっと発行される)
                mVideoView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View arg0, MotionEvent arg1) {
                        Log.i(TAG, "onTouch");
                        return true;
                    }
                });
                // 最後まで再生したらイベント発行
                mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        Log.i(TAG, "onCompletion");
                    }
                });
                // 再生準備完了したらイベント発行(ライフサイサイクルでpauseになっても発行)
                // setVideoPathを設定し準備できたら発行される
                mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        Log.i(TAG, "onPrepared");
                        //mVideoView.start();
                    }
                });
                // エラーイベント
                mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                    @Override
                    public boolean onError(MediaPlayer media, int what, int extra) {
                        Log.i(TAG, "onError");
                        return true;
                    }
                });
        mVideoView.setVideoPath("~.mp4");
        Button playButton = (Button)findViewById(R.id.playbutton);
        playButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mVideoView.start();
            }
        });
        Button btnpauseButton = (Button)findViewById(R.id.pausebutton);
        btnpauseButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mVideoView.pause();
            }
        });
        Button seekButton = (Button)findViewById(R.id.seekbutton);
        seekButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mVideoView.seekTo(7000); // msecで指定。7秒目に移るかと思ったが、初回から再生された。
            }
        });
        Button stopPlaybackButton = (Button)findViewById(R.id.stopplaybackbutton);
        stopPlaybackButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mVideoView.stopPlayback(); // これなぜかとまる。
            }
        });
        Button replayButton = (Button)findViewById(R.id.replaybutton);
        replayButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mVideoView.seekTo(0);
                mVideoView.start();
            }
        });
    }
}

res/layout/activity_main.xml

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical"
            >
        <Button
            android:text="動画再生"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/playbutton">
        </Button>
        <Button
            android:text="動画停止"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/pausebutton">
        </Button>
        <Button
            android:text="動画seek"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/seekbutton">
        </Button>
        <Button
            android:text="動画再生停止"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/stopplaybackbutton">
        </Button>
        <Button
            android:text="リプレイ"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/replaybutton">
        </Button>
                <VideoView
                    android:id="@+id/VideoView1"
                    android:layout_width="match_parent"
                    android:layout_height="100dp"
                    />
    </LinearLayout>
    </ScrollView>

イベント周り調査

onPreparedイベントを発生させる条件

3つ条件がありand条件となる

  • setVideoPathを設定
  • setVisibility(View.VISIBLE)
  • viewの縦幅横幅の両方が0でない

その他イベント

  • onPrepared内でstartするのが良さそう。
  • start,pause,seekToを実行してもonPrepared,onCompletion,onTouchのイベントは走らない
  • stopPlaybackを実行するとstart,pause,seekToあたりが動かなくなる(謎)

参照

VideoView公式:https://developer.android.com/reference/android/widget/VideoView