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 ボタンです 1 Play Music ボタンが 押 されたときに 実 行 されるものです MediaPlayer を 作 りま す 2 Stop Music ボタンが 押 されたときに 実 行 されるものです 3 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 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 ondestroy(){ super.ondestroy(); mpres.release(); private View.OnClickListener listener1 = new View.OnClickListener() { public onclick(view v) { //Media Player start mpres = MediaPlayer.create(getApplicationContext(), R.raw.jazz_01); 1 mpres.start(); 2 ; private View.OnClickListener listener2 = new View.OnClickListener() { public onclick(view v) { mpres.stop(); 3 ; 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 のメソッド 一 覧 149 static 返 り 値 メソッド 機 能 static MediaPlay er create(context context, int resid) 指 定 したリソースを 再 生 するためのMediaPlayer を 作 ります static MediaPlay er create(context context, Uri uri) 指 定 したUriを 再 生 するためのMediaPlayerを 作 り ます static MediaPlay create(context context, Uri uri, 指 定 したUriを 再 生 するためのMediaPlayerを 作 り er SurfaceHolder holder) ます サーフェイスSurfaceHolderを 指 定 します int getcurrentposition() 現 在 の 再 生 ポジションを 返 します int getduration() ファイルの 長 さ( 時 間 )を 返 します int getvideoheight() 動 画 の 高 さ(サイズ)を 返 します int getvideowidth() 動 画 の 幅 (サイズ)を 返 します boolean isplaying() 再 生 中 かどうか 返 します pause() 一 時 停 止 prepare() 準 備 ( 同 期 ) prepareasync() 準 備 ( 非 同 期 ) release() リソース 開 放 reset() プレーヤーをリセット seekto(int msec) 再 生 位 置 を 指 定 のところにする setaudiostreamtype(int streamtype) 音 楽 のストリームタイプをセットする setdatasource(context contex Uriを 指 定 してデータソースをセットする t, Uri uri) setdatasource(filedescriptor fd) FileDescripterを 指 定 してデータソースをセットす る setdatasource(filedescriptor FileDescripterを 指 定 してデータソースをセットす fd, long offset, long length) る lengthは 再 生 する 時 間 setdatasource(string path) ファイルのパスを 指 定 してデータソースをセットす る setdisplay(surfaceholder sh) SurfaceHolderをセットする setlooping(boolean looping) ループ 再 生 の 設 定 trueはループ falseはルー setonbufferingupdatelistener (MediaPlayer.OnBufferingUpd atelistener l) setoncompletionlistener(med iaplayer.oncompletionlistene r l) プなし ネットワークからバッファに 読 み 込 む 場 合 にバッ ファに 変 化 があった 場 合 にコールされるコール バックメソッド バッファリングのメーターを 更 新 す るのに 使 ったりする 再 生 中 にデータファイルのENDが 現 れた 場 合 に コールされるコールバックメソッド setonerrorlistener(mediaplay er.onerrorlistener l) 再 生 中 にエラーがあった 場 合 にコールされるコー ルバックメソッド setonpreparedlistener(media メディアファイルが 再 生 可 能 状 態 になった 場 合 に Player.OnPreparedListener l) コールされるコールバックメソッド setonseekcompletelistener( シーク( 指 定 の 位 置 に 再 生 ポイントを 移 動 するこ MediaPlayer.OnSeekComplet と)が 完 了 した 場 合 にコールされるコールバックメ elistener l) ソッド setscreenonwhileplaying(bo olean screenon) setvolume(float leftvolume, float rightvolume) setwakemode(context contex t, int mode) start() スタート stop() ストップ アタッチしたSurfaceHolderを 動 画 再 生 中 に 維 持 するかどうかを 指 定 する 左 右 の 音 量 設 定 setdatasource()メソッドの 後 にコールする ユーザーが 音 量 調 整 できるように なっていないアプリの 場 合 AudioManagerクラス のsetStreamVolumeメソッドよりこのメソッドのほ うが 推 奨 されます ユーザーインターフェースを 作 る 場 合 には 音 量 は 聴 覚 の 特 性 に 合 わせて 対 数 的 に 変 更 するようにしてください プレーヤーが 再 生 状 態 でないとき (setdisplay(surfaceholder)が 実 行 された SurfaceHolderによって) 使 用 します 再 生 を 行 お うとしたときにデバイスのパワーコントロールサー ビスにアクセスすることができます これを 使 うに はWAKE_LOCKパーミッションが 必 要 です デフォ ルトで デバイスは 再 生 中 にウェークアップを 維 持 するようになっていません (スリープになると 305