301 OGG(Ogg はコンテナであり、1 つないし複数の音声や動画

OGG(Ogg はコンテナであり、1 つないし複数の音声や動画コーデックを内容物
¾
として格納する)
¾
MPEG
¾
MP3
¾
Bitmap
14.1. 音楽や動画再生
Android で音楽再生や動画再生をサポートしているのは MediaPlayer クラスです。メ
ディアのデータファイルはアプリケーションのリソースディレクトリ内にあるもの、
ローカルファイル、ネットワーク URI です。
再生する手順は次のとおりです。ここでは Android のシステムに内蔵されているリン
グトーンの ogg 音声ファイルを使っています。prepare()メソッドは再生のための準備
で す 。 prepare() メ ソ ッ ド は setDataSource() あ る い は stop() メ ソ ッ ド の 後 、
MediaPlayer クラスのほかのメソッドの前に実行するようにします。setLooping()メ
ソッドはループ再生するかどうかの設定です。false はループ再生しないということで
す。
Uri file = Uri.fromFile(new File("/system/media/audio/ringtones/BeatPlucker.ogg"));
MediaPlayer mp = new MediaPlayer();
try {
mp.setDataSource(file.toString());
mp.setLooping(false);
mp.prepare();
mp.start();
} catch (Exception e) {}
あるいは setDataSource は別のメソッドを使って、青の Context を指定して、第 2 引
数で Uri をそのまま使うこともできます。
mp.setDataSource(MediaPlay.this, file);
再生を停止する場合には次のようにします。
mp.stop();
mp.prepare();
res/raw ディレクトリに音楽ファイル my_sound.mp3 がある場合には次のようにしま
301
す。少し簡単になります。prepare()は create()メソッドが面倒みてくれますので、明
示的に実行する必要はありません。拡張子は指定しませんが、再生可能なものなら何
でもかまいません。
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.my_sound);
mp.start();
メディアプレーヤのサンプルを示します。このサンプルはボタンを押すと音楽を再生
したり停止したりするものです。プロジェクト名とアクティビティ名は MediaPlay で
す。準備として Eclipse の res/raw ディレクトリに mp3 の音楽ファイルを入れます。
このサンプルでは jazz_01.mp3 です。
▲音楽ファイル
151
アクティビティでボタンを 2 つ作ります。1 つは Play Music ボタン、もうひとつは
Stop Music ボタンです。
① Play Music ボタンが押されたときに実行されるものです。MediaPlayer を作りま
す。
② Stop Music ボタンが押されたときに実行されるものです。
③
★MediaPlay.java
package com.myandroid;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
302
import android.view.View;
import android.widget.Button;
public class MediaPlay extends Activity {
MediaPlayer mpRes;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bt1 = (Button)findViewById(R.id.bt1);
bt1.setOnClickListener(listener1);
Button bt2 = (Button)findViewById(R.id.bt2);
bt2.setOnClickListener(listener2);
}
@Override
public void onDestroy(){
super.onDestroy();
mpRes.release();
}
private View.OnClickListener listener1 = new View.OnClickListener()
{
public void onClick(View v) {
//Media Player start
mpRes = MediaPlayer.create(getApplicationContext(), R.raw.jazz_01);・①
mpRes.start();・・・②
}
};
private View.OnClickListener listener2 = new View.OnClickListener()
{
public void onClick(View v) {
mpRes.stop();・・・③
}
};
}
★res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
303
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Media Player"/>
<Button android:id="@+id/bt1"
android:text="@string/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button android:id="@+id/bt2"
android:text="@string/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
実行すると次のような画面になり、ボタンに応じて再生、停止を行います。パソコン
の音声はミュートしていないことを確認して実行しましょう。
▲実行結果
150
MediaPlayer のメソッド一覧を以下に示します。
304
▲MediaPlayer のメソッド一覧
static 返り値
static
MediaPlay
er
static
MediaPlay
er
static
MediaPlay
er
int
int
int
int
boolean
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
149
メソッド
機能
create(Context context, int
指定したリソースを再生するためのMediaPlayer
を作ります。
resid)
create(Context context, Uri uri) 指定したUriを再生するためのMediaPlayerを作り
ます。
create(Context context, Uri uri, 指定したUriを再生するためのMediaPlayerを作り
ます。サーフェイスSurfaceHolderを指定します。
SurfaceHolder holder)
getCurrentPosition()
現在の再生ポジションを返します。
getDuration()
ファイルの長さ(時間)を返します。
getVideoHeight()
動画の高さ(サイズ)を返します。
getVideoWidth()
動画の幅(サイズ)を返します。
isPlaying()
再生中かどうか返します。
pause()
一時停止
prepare()
準備(同期)
prepareAsync()
準備(非同期)
release()
リソース開放
reset()
プレーヤーをリセット
seekTo(int msec)
再生位置を指定のところにする
setAudioStreamType(int
音楽のストリームタイプをセットする
streamtype)
setDataSource(Context contex
Uriを指定してデータソースをセットする
t, Uri uri)
setDataSource(FileDescriptor FileDescripterを指定してデータソースをセットす
る
fd)
setDataSource(FileDescriptor FileDescripterを指定してデータソースをセットす
る。lengthは再生する時間
fd, long offset, long length)
ファイルのパスを指定してデータソースをセットす
setDataSource(String path)
る
setDisplay(SurfaceHolder sh) SurfaceHolderをセットする
setLooping(boolean looping) ループ再生の設定。trueはループ、falseはルー
プなし
setOnBufferingUpdateListener ネットワークからバッファに読み込む場合にバッ
(MediaPlayer.OnBufferingUpd ファに変化があった場合にコールされるコール
バックメソッド。バッファリングのメーターを更新す
ateListener l)
るのに使ったりする。
setOnCompletionListener(Med
再生中にデータファイルのENDが現れた場合に
iaPlayer.OnCompletionListene
コールされるコールバックメソッド
r l)
setOnErrorListener(MediaPlay 再生中にエラーがあった場合にコールされるコー
ルバックメソッド
er.OnErrorListener l)
setOnPreparedListener(Media メディアファイルが再生可能状態になった場合に
Player.OnPreparedListener l) コールされるコールバックメソッド
setOnSeekCompleteListener( シーク(指定の位置に再生ポイントを移動するこ
MediaPlayer.OnSeekComplet と)が完了した場合にコールされるコールバックメ
ソッド
eListener l)
setScreenOnWhilePlaying(bo アタッチしたSurfaceHolderを動画再生中に維持
するかどうかを指定する
olean screenOn)
左右の音量設定。setDataSource()メソッドの後
setVolume(float leftVolume,
にコールする。ユーザーが音量調整できるように
float rightVolume)
なっていないアプリの場合、AudioManagerクラス
のsetStreamVolumeメソッドよりこのメソッドのほ
うが推奨されます。ユーザーインターフェースを
作る場合には、音量は聴覚の特性に合わせて対
数的に変更するようにしてください。
setWakeMode(Context contex プレーヤーが再生状態でないとき
(setDisplay(SurfaceHolder)が実行された
t, int mode)
SurfaceHolderによって)使用します。再生を行お
うとしたときにデバイスのパワーコントロールサー
ビスにアクセスすることができます。これを使うに
はWAKE_LOCKパーミッションが必要です。デフォ
ルトで、デバイスは再生中にウェークアップを維
持するようになっていません。(スリープになると
start()
スタート
stop()
ストップ
305