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

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); } }
画面を表示すると、まずActivity
のonCreate()
メソッドが実行されます。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