Programming Style

メニュー

初心者がアプリ開発者になるためのプログラミング学習サイト

[Android] SurfaceView:動画を再生する

android-surfaceview-video-01

VideoViewクラスを使うと動画を再生させることができます。VideoViewクラスはSurfaceViewをクラス継承し、MediaPlayerクラスを使って動画を再生しています。ここでは、SurfaceViewとMediaPlayerを使って動画を再生させる方法について説明します。

 

広 告

 

目次

前提条件

動作確認端末

  • Google Nexus 7 – 5.1.1 – API22(実機)

1. 動画を読み込む

 

ここではSurfaceViewクラスを使って動画を読み込む手順を説明します。まずは以下のようにレイアウトXMLで<SurfaceView>タグを記述します。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<SurfaceView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/surfaceview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    />

 

Activity側のコードは以下のとおりです。

MainActivity.java

import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private SurfaceView mSurfaceView;
    private SurfaceHolder mHolder;
    private MediaPlayer mMediaPlayer;

    private final SurfaceHolder.Callback mCallback = new SurfaceHolder.Callback() {

        /** SurfaceViewが生成された時に呼び出される */
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            final String path = "ファイルパスかURL";
            try {
                // MediaPlayerを生成
                mMediaPlayer = new MediaPlayer();
                // 動画ファイルをMediaPlayerに読み込ませる
                mMediaPlayer.setDataSource(path);
                // 読み込んだ動画ファイルを画面に表示する
                mMediaPlayer.setDisplay(holder);

            } catch (IllegalArgumentException e) {
                e.printStackTrace();

            } catch (SecurityException e) {
                e.printStackTrace();

            } catch (IllegalStateException e) {
                e.printStackTrace();

            } catch (IOException e) {
                e.printStackTrace();

            } finally {

            }
        }

        // 
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        /** SurfaceViewが終了した時に呼び出される */
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (mMediaPlayer != null) {
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
        }

    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        // SurfaceViewにコールバックを設定
        mHolder = mSurfaceView.getHolder();
        mHolder.addCallback(mCallback);
    }
}

画面を表示すると、まずActivityonCreate()メソッドが実行されます。onCreate()メソッド内でSurfaceHolder#addCallback()を使って、SurfaceViewにコールバックを設定します。するとSurfaceViewが生成された時(surfaceCreated())、状態が変化した時(surfaceChanged())、終了した時(surfaceDestoryed())のイベントを受け取れるようになります。

 

SurfaceHolder.Callback#surfaceCreated()SurfaceViewが生成されたイベントを受け取ったら、MediaPlayerを生成し、MediaPlayer#setDataSource()を使って動画ファイルを読み込みます。次にMediaPlayer#setDisplay()SurfaceHolder.Callback#surfaceCreated()から渡されてきたSurfaceHolderオブジェクトを設定し、画面に読み込んだ動画ファイルを表示します。

 

 

 

 

 

2. 動画を再生・停止する

 

動画を開始させるためには以下のコードを実行します。

動画を再生する

mMediaPlayer.prepare();
mMediaPlayer.start();

 

動画を停止させるためにはMediaPlayer#stop()を実行します。

動画を停止する

mMediaPlayer.stop();

 

 

 

3. 動画を一時停止・再開する

 

動画を一時停止させるためにはMediaPlayer#pause()を実行します。

動画を一時停止する

mMediaPlayer.pause();

 

動画を再開させるためにはMediaPlayer#start()を実行します。

動画を再生再開する

mMediaPlayer.start();

 

 

 

 

 

4. 参考URL

 

SurfaceView | Android Developers

http://developer.android.com/intl/ja/reference/android/view/SurfaceView.html

 

MediaPlayer | Android Developers

http://developer.android.com/intl/ja/reference/android/media/MediaPlayer.html

 

広 告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です