動画を再生する方法 MediaPlayer
動画を再生するにはMediaPlayerとVideoViewを使用する方法があります。
MediaPlayerのほうが詳細な指定ができ、VideoViewのほうが容易に使用できます。
[参考記事] MediaPlayer のメソッド一覧
[参考記事] 動画を再生する方法 VideoView
[参考記事] 2.0/2.1以前で再生できる動画が2.2以降で再生できない
[参考記事] アプリからネットワーク通信を行う場合
動画ファイルは組み込みの動画であれば/res/rawフォルダ以下に置くようにします。
[参考記事] SDやdata、downloadなど各種ディレクトリパスの取得方法
MediaPlayerではlayoutにSurfaceViewを使用しますが、SurfaceViewを使用するにはSurfaceHolder.Callbackを使用する必要があります。
音声は再生できているが、映像が表示されないときはholderの渡し方が間違っています。
SurfaceHolder.Callbackを使うサンプルコード
setContentViewを使うサンプルコード
setContentViewを使いsurfaceCreated以外で表示するサンプルコード
またMediaPlayerを再生すると、アプリを閉じた後もバックグラウンドで再生されたままになるので、閉じるときにはMediaPlayerを破棄することを忘れないようにします。
@Override public void surfaceDestroyed(SurfaceHolder holder) { if(mp != null){ mp.release(); mp = null; } }
public boolean onDestroy(MediaPlayer mp, int what, int extra) { if(mp != null){ mp.release(); mp = null; } return false; }
SurfaceHolder.Callbackを使うサンプルコード
TestApp.java
package com.example.test; import java.io.IOException; import android.app.Activity; import android.graphics.PixelFormat; import android.media.MediaPlayer; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; public class TestApp extends Activity implements SurfaceHolder.Callback{ private static final String TAG = "VideoPlayer"; private SurfaceHolder holder; private SurfaceView mPreview; private MediaPlayer mp = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); getWindow().setFormat(PixelFormat.TRANSPARENT); mPreview = (SurfaceView) findViewById(R.id.surface); holder = mPreview.getHolder(); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.addCallback(this); } public boolean onDestroy(MediaPlayer mp, int what, int extra) { if(mp != null){ mp.release(); mp = null; } return false; } @Override public void surfaceCreated(SurfaceHolder paramSurfaceHolder) { String mediaPath = "/sdcard/test.3gp"; try { mp = new MediaPlayer(); mp.setDataSource(mediaPath); mp.setDisplay(paramSurfaceHolder); mp.prepare(); mp.start(); } catch (IllegalArgumentException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IllegalStateException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder paramSurfaceHolder, int paramInt1, int paramInt2, int paramInt3) { } @Override public void surfaceDestroyed(SurfaceHolder paramSurfaceHolder) { if(mp != null){ mp.release(); mp = null; } } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <SurfaceView android:id="@+id/surfaceView1" android:layout_width="wrap_content" android:layout_height="wrap_content"></SurfaceView> </LinearLayout>
setContentViewを使うサンプルコード
この場合layoutはなんでもいいです。
別メソッドでholderを受けるにはgetHolder()を使用します。
TestApp.java
package com.example.test; import java.io.IOException; import android.app.Activity; import android.content.Context; import android.media.MediaPlayer; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; public class TestApp extends Activity{ private static final String TAG = "VideoPlayer"; private MediaPlayer mp = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setContentView(new SurfaceTestView(this)); } class SurfaceTestView extends SurfaceView implements SurfaceHolder.Callback { public SurfaceTestView(Context context) { super(context); SurfaceHolder holder = getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO 自動生成されたメソッド・スタブ } @Override public void surfaceCreated(SurfaceHolder holder) { try { mp = new MediaPlayer(); mp.setDataSource(mediaPath); mp.setDisplay(holder); mp.prepare(); mp.start(); } catch (IllegalArgumentException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IllegalStateException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if(mp != null){ mp.release(); mp = null; } }; } }
setContentViewを使いsurfaceCreated以外で表示するサンプルコード
この場合layoutはなんでもいいです。
別メソッドでholderを受けるにはgetHolder()を使用します。
TestApp.java
package com.example.test; import java.io.IOException; import android.app.Activity; import android.content.Context; import android.media.MediaPlayer; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; public class TestApp extends Activity{ private static final String TAG = "VideoPlayer"; private MediaPlayer mp = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setContentView(new SurfaceTestView(this)); } class SurfaceTestView extends SurfaceView implements SurfaceHolder.Callback { public SurfaceTestView(Context context) { super(context); SurfaceHolder holder = getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO 自動生成されたメソッド・スタブ } @Override public void surfaceCreated(SurfaceHolder holder) { playMedia(); } public void playMedia() { try { mp = new MediaPlayer(); mp.setDataSource(mediaPath); mp.setDisplay(getHolder()); mp.prepare(); mp.start(); } catch (IllegalArgumentException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IllegalStateException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if(mp != null){ mp.release(); mp = null; } }; } }
関連記事
- ListViewにArrayAdapterを渡すサンプルコード(一覧項目から選択する場合のUI)
- assetsフォルダのファイルを扱う方法 AssetManager
- SDカードが接続されているかどうか知る方法 書き込み可能かどうか 読み込み可能かどうか
- SDカードの空き容量を調べる方法
- SDカードからサムネイル画像を取り出す getThumbnailメソッド
- 文字列の置き換えを行う方法 (replaceAllで気をつけること)
- 文字列の部分一致検索を行う方法
- 処理中を表すプログレスダイアログを表示する
- Java メモリー使用量を取得する方法
- SDカードに保存したファイルをギャラリーなどに反映させる方法
- 実行中のメソッド名やクラス名を取得する方法
- Singletonパターンを使ってクラスのインスタンスを1つにする(共有クラスのリソースを削減する方法)
- AndroidアプリでTextViewに使用できるフォントの一覧
- TextViewに独自フォントを使用する方法
- assetsフォルダには1MB以上の非圧縮ファイルを設置できない
- EditTextのソフトキーボードの『完了』を虫メガネアイコンなどに変更する方法
- Viewの表示・非表示を切り替える方法
- ファイルのテキストデータを読み込む
- テキストデータをファイルに書き込む BufferedWriterの使用例
- Webからダウンロードして保存する DefaultHttpClientの使用例
- ファイルをコピーする InputStream,OutputStreamの使用例
- 画像を拡大縮小する方法
- LinearLayout をスクロールさせる方法(ScrollViewの使用方法)
- アプリ起動時にスプラッシュ画面を表示させる方法
- WebViewの設定一覧
- WebViewを使ってWebサイトを表示する方法 WebKitからアプリ、アプリからWebKitへの連携処理
- 暗号化・複合化を行う ブロック暗号
- base64変換の一覧とその詳細サンプルコード
- 型変換の一覧(キャスト)
- 動画を再生する方法 VideoView
- Androidでマルチスレッド処理をする方法
- 処理を一定時間停止させる方法
- SDやdata、downloadなど各種ディレクトリパスの取得方法
- ファイルの拡張子を取得する
- 実機内やエミュレータ内のファイルを操作する DDMS、adbとサンプルコード
スポンサーリンク