音を再生するのに「リングトーンマネージャ」と「メディアプレイヤー」という2つの方法があります。
前者のほうが扱いが容易で、後者は高機能であるものの呼び出しが複雑です。
以下の機能を利用したい場合は別章のメディアプレイヤーを、そうでなければ本章のリングトーンマネージャを利用すると良いでしょう。
(以下なら
メディアプレイヤーを利用)
- 再生音量を指定したい(端末標準の音量ではなく)
- ループ状の再生をおこないたい
- 再生終了時のイベントを拾いたい
本章では「リングトーンマネージャ」(RingtoneManager)による音の再生を解説します。
(別の章でこれとは別に「メディアプレイヤー」(MediaPlayer)による方法も解説しています)
文法
リングトーンマネージャを生成 → <ID>、真 (IDは32bit整数)
→ <ErrorMessage>、偽
↓文字列 ↓整数
<音源URI>と <ID>で リングトーンマネージャで再生
(成功)→ <ID>、真
(失敗)→ <ErrorMessage>、偽
<ID>を リングトーンマネージャを停止 → ・
<ID>を リングトーンマネージャを解放 → ・
上記を解説します。
まず「
リングトーンマネージャを生成」を呼び出してリングトーンマネージャのIDを取得し、引き続き、そのIDに対して再生や停止を行ないます。
一度取得したIDに対し、何度も再生/停止を繰り返すことができますから、1回の再生ごとにIDの取得/解放を繰り返す必要はありません。プログラムの組み方としては、初回の再生時にIDを取得する方法を勧めます。(IDの解放は処理単語としては存在しますが、必ずしも実行する必要はありません)
成功時と失敗時で異なる情報がスタックに返されるので注意してください。いずれにしてもスタックトップには真偽が積まれているので、呼び出し直後は 「偽? ならば ・・」 で受けてエラー分岐をおこないます。下のコードをご覧ください。
記述例a1 (改善の余地有り)
プレイヤー1は ID。 ←IDを記憶しておく変数の宣言
ボタンクリック処理とは 本定義 (ボタンID → 戻値)
〜略〜
リングトーンマネージャを生成し 偽?
ならば (ErrorMessageを) ちょっと表示し
0を 返し
終り
つぎに
プレイヤー1に 入れ
〜略〜
上記では成功時にスタックに積まれているIDを大域変数「プレイヤー1」に格納しています。このIDはしばらくしてから再生を停止するのに、あるいはIDを破棄するのに必要な情報なので(局所変数ではなく)大域変数に格納しておく必要があります。
記述例では、生成したプレイヤーのIDを格納する変数宣言に 「
プレイヤー1は ID」 と書いています。整数の格納なので 「
プレイヤー1は 変数」 としても良いのですが、IDを格納する変数であることが分かるように「ID」という変数型を使っています。(「ID」は「変数」を等価定義したものに過ぎません)
ところで先の 記述例a1 は再生ボタンが押される都度、IDが生成されます。一つのIDで何度も再生・停止が可能なのに上記例ではボタンを押すごとにIDを消費してしまい無駄です。実際のプログラムとして以下のような記述にすれば初回の再生時のみIDを取得するようにできます。
記述例a2 (改善後)
プレイヤー1は ID。 ←IDを記憶しておく変数の宣言
ボタンクリック処理とは 本定義 (ボタンID → 戻値)
〜略〜
プレイヤー1が ゼロ?
ならば ※ 初回再生のみIDを生成 ※
リングトーンマネージャを生成し 偽?
ならば (ErrorMessageを) ちょっと表示し
0を 返し
終り
つぎに
プレイヤー1に 入れ
つぎに
〜略〜
次に音源のURIとリングトーンマネージャのIDを渡して「
リングトーンマネージャで再生」を実行することて再生が行われます。この処理単語は再生をキックするだけで直ちに戻ってきます。(戻ってきたときまだ再生中であることに注意してください)
記述例b
プレイヤー1は ID。 ←IDを記憶しておく変数の宣言
ボタンクリック処理とは 本定義 (ボタンID → 戻値)
〜略〜
プレイヤー1が ゼロ?
ならば ※ 初回再生のみIDを生成 ※
リングトーンマネージャを生成し 偽?
ならば (ErrorMessageを) ちょっと表示し
0を 返し
終り
つぎに
プレイヤー1に 入れ
つぎに
"raw/phrase031.mp3"を プレイヤー1で リングトーンマネージャで再生し 偽?
ならば (ErrorMessageを) ちょっと表示し
0を 返し
終り
つぎに
0を 返す。
注:音源 phrase031.mp3 はフリー素材 'Music is VFR' 様のものを使わせていただきました。
<音源URI> (文字列)
「リングトーンマネージャで再生」に渡す 音源URI には3つの指定方法があります。
一つ目として、Mind for Android の開発画面からサウンドファイルをアップロードしておき、それを指定する方法があります。つまり、アプリのパッケージに内蔵させた音源を指定するものです。
Mind for Android の画面でアップロードされたサウンドファイルはパッケージ内の res/raw/ というリソース用ディレクトリに格納されるので、そのパスを res/ の次からの相対パスで指定します。たとえば、
(正)
"raw/phrase031.mp3"
のように指定します。URI中の拡張子(上記の .mp3 の部分)は有っても無くても構いません(有っても無視されます)。逆に言えば主ファイル名が同じで拡張子が異なる複数のサウンドファイルは同時に使えません。
音源URIをファイル名で指定する場合、ファイル名に文字種の制限があるので注意してください。たとえば、
(誤)
"raw/Phrase03-1.mp3" ←大文字は使えない、ハイフンは使えない
は使えません(Mind for Android の画面でアップロード時にエラー検出します)。使える文字種の詳細は Mind for Android の画面の左区画「ローカル上のソース/データ」の下段にある「ファイル名の命名規則」にあるヘルプボタンで確認願います。
二つ目は、本来のURI形式で音源を指定するものです。たとえば、
"content://settings/system/alarm_alert"
のようなものです。上記は端末のデフォルトのアラーム音を表します。
(一つ目のURI指定は内部的にはこの形式に強制変換されます)
この形式のURIをソースコードに直接書くことは少なく、たとえば後述するサウンドピッカーを使って標準音源の一つを選択したようなケースでデータとして得ることが多いです。
三つ目は、内部ストレージなどにあるサウンドファイルを絶対パスで指定するものです。たとえば、
"/system/media/audio/alarms/Alarm_Beep_01.ogg" ←パスが'/'で始まっていると第二の方法と解釈されます
のように指定します。厳密にはURIではなくファイル名ですがこれも使えます。拡張子もそのまま記述してください。
音量について
リングトーンマネージャによる再生では音量は指定できず端末の設定音量で鳴ります。音量が指定できない代わりに、マナーモードがオンの時の抑制などは自動的に行われるのでプログラムで細かなことを考えなくて済む利点があります。
ストリームについて
Androidでの再生音量はサウンドの種類ごとに管理されています。たとえば呼び出し音量とアラームの音量はそれぞれ別に音量設定が可能となっています。このサウンドの種類のことを「ストリーム」と呼んでいます。
リングトーンマネージャで再生をおこなう場合、「呼び出し音のストリーム」が適用されます。最も代表的な音量で通常、端末の音量調整ボタンで変化するのがこれになります。たとえシステム標準のアラームの一つを指定音源にしたとしても「アラームのストリーム」ではなく、固定的に「呼び出し音のストリーム」が使われることに注意します。(もし、音量管理を厳格におこないたいなら、リングトーンマネージャによる再生ではなく、メディアプレーヤによる再生を利用ください。ストリームを指定できます)
再生中の再生について
再生中に再生をおこなった場合(同じIDの場合)、先行する再生は強制的に停止となり、改めて新しい再生をおこないます。(これは Android API の仕様ではなく、Mind for Android としての挙動です)
もし先行音を再生したまま次の音も重ねて再生したい場合には、新しくIDを取得してそれに対して再生をおこなってください。
再生停止について
指定した音源が最後まで再生されると再生は自動的に停止します。ただ、システム標準の中には(たとえば、アラーム音源の一つ「Alarm Classic」)音源自体が繰り返し再生になるものもあります。
再生時間が長いものや繰り返してしまう音源の再生に対しては、プログラムで停止させることもできます。処理単語「リングトーンマネージャを停止」を使います。たとえば「停止」ボタンを設置してそのイベントで「リングトーンマネージャを停止」を呼び出す方法になるでしょう。
記述例c
プレイヤー1は ID。 ←IDを記憶しておく変数の宣言
ボタンクリック処理とは 本定義 (ボタンID → 戻値)
〜略〜
_ボタン番号が ○○に 等しい ※←停止ボタン
ならば プレイヤー1を リングトーンマネージャを停止し
0を 返し
終り
つぎに
〜略〜
0を 返すこと。
IDの解放について
「リングトーンマネージャを解放」を呼ぶことでIDを解放できます。しかしこの処理単語は存在はするものの必ずしも呼び出す必要はなく、サンプルプログラムでも記述していません。
リングトーンマネージャによる再生のサンプルプログラム) |
■
サンプルプログラム SpRingtone
既に
ログインからサンプルアプリのコンパイルまで - 1つのサンプルアプリを試しにコンパイル にて1つのサンプルアプリをコンパイルしていたはずですが、ここではそれらのサンプルの一つ
SpRingtone をコンパイルしてみます。
サンプルプログラム群のうち、次のものを使います。
andrmindSample/
|-- 〜略〜
〜略〜
|-- Ringtone/ ←フォルダ内にあるファイルはすべてアプリ SpRingtone のためのもです
| |-- phrase031.mp3 ←サウンドファイル (こちらを二番目にアップロード)
| `-- SpRingtone.src ←Mindソース (こちらを先にアップロード)
〜略〜
(phrase031.mp3 はフリー素材 'Music is VFR' 様のものを使わせていただきました)
まず、
端末との連携(パッケージローダ) での解説に従って、パッケージローダを起動、さらにそこからサービスを起動しておいてください。
次に、Mind for Android のメイン画面で、「新しいアプリの作成」ボタンを押し、その状態で、サンプルプログラムの上記フォルダ内にある
SpRingtone.src をアップロードします。これにより SpRingtone というアプリが自動作成されます。
続いて、
サウンドファイル phrase031.mp3 もアップロードしてください。この mp3 ファイルは開発画面の右区画中段の「サウンドファイル (res/raw/)」という場所に表示されるはずです。(上・中・下段への振り分けは拡張子により自動的に行われます)
上の状態で「コンパイル」ボタンを押してコンパイルすると、MindPkgLoaderが動作して端末に自動ダウンロードされるはずです。
SpRingtone のインストールが終ったら起動してください。次の画面が表示されます。
一番上のボタンを押すと、パッケージ内蔵の音源(さきほどアップロードしたファイル)が再生されます。こには単発再生です。
二番目のボタンを押すと、端末内蔵の標準音源(デフォルトのアラーム音)をそのURIを指定する方法で再生します。
三番目のボタンを押すと、端末内蔵の標準音源の一つを物理的なファイル名として指定する方法で再生をおこないます。
拡張子 .ogg はPCでは馴染みの薄いものですがAndroidではよく使われます。PC向けのメディア変換プログラムの中にはこの拡張子に変換できるものがあります。
Copyright(C) 2000 Scripts Lab. Inc.