音を再生するのに「リングトーンマネージャ」と「メディアプレイヤー」という2つの方法があります。
前者のほうが扱いが容易で、後者は高機能であるものの呼び出しが複雑です。
以下の機能を利用したい場合は本章のメディアプレイヤーを、そうでなければ別章の
リングトーンマネージャを利用すると良いでしょう。
(以下ならメディアプレイヤーを利用)
- 再生音量を指定したい(端末標準の音量ではなく)
- ループ状の再生をおこないたい
- 再生終了時のイベントを拾いたい
本章では「メディアプレイヤー」(MediaPlayer)によるによる音の再生を解説します。
(別の章でこれとは別に「リングトーンマネージャ」(RingtoneManager)による方法も解説しています)
文法
メディアプレイヤーを生成 → <ID>、真 (IDは32bit整数)
→ <ErrorMessage>、偽
(2019.06.20 成功の場合の戻値の間違いを訂正)
文字列 整数 真偽 整数 整数
<音源URI>と <音量(%)>と <ループ指定>と <ストリーム>と <ID>で メディアプレイヤーにロードして再生 →
成功の場合 真
失敗の場合 <ErrorMessage>、偽
ストリーム は以下のいずれかを指定します
0 (整数値 0 はストリーム指定無しを表す)
システム音のストリーム (=整数値 1)
呼び出し音のストリーム (=整数値 2)
ミュージックのストリーム (=整数値 3)
アラームのストリーム (=整数値 4)
通知のストリーム (=整数値 5)
<ID>を メディアプレイヤーを停止 → ・
<ID>を メディアプレイヤーを解放 → ・
再生終了時のイベントを拾う場合(この記述は任意)
再生終了時の処理とは 本定義 (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に 入れ
つぎに
〜略〜
■再生
次に、処理単語「
メディアプレイヤーにロードして再生」を使って再生を行います。
渡すデータが5個と多いので間違えないようにします。
記述例b
プレイヤー1は ID。 ←IDを記憶しておく変数の宣言
ボタンクリック処理とは (ボタンID → 戻値)
〜略〜
プレイヤー1が ゼロ?
ならば ※ 初回再生のみIDを生成 ※
メディアプレイヤーを生成し 偽?
ならば (ErrorMessageを) ちょっと表示し
0を 返し
終り
つぎに
プレイヤー1に 入れ
つぎに
"raw/phrase031.mp3"と 60%と 偽と アラームのストリームと プレイヤー1で
メディアプレイヤーにロードして再生し 偽?
ならば (ErrorMessageを) ちょっと表示し ←失敗時はスタックにエラーメッセージが積まれている
0を 返し
終り
つぎに (2019.06.20この付近の間違いを訂正)
0を 返すこと。
「メディアプレイヤーにロードして再生」に渡すデータについて以下に解説します。
<音源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ではなくファイル名ですがこれも使えます。拡張子もそのまま記述してください。
<音量(%)> (整数)
再生音量を0〜100のパーセント値(整数)で指定します。100で最大音量となります。
<ループ指定> (真偽)
真偽値(0または0以外)を指定します。真を指定するとその音源を最後まで再生したあと再び頭に戻って永久に再生し続けます。
普通は整数定数のシンボルである「真」または「偽」を書けば良いでしょう。「真」を指定した場合には永久に鳴り続けるので後述する「メディアプレイヤーを停止」で停止させてください。(時間経過で停止する、あるいは、ボタン押下で停止するなど)
<ストリーム> (整数)
ストリームの指定は以下のいずれかのシンボルを使ってください。
0 (整数値 0 はストリーム指定無しを表す)
システム音のストリーム (=整数値 1)
呼び出し音のストリーム (=整数値 2)
ミュージックのストリーム (=整数値 3)
アラームのストリーム (=整数値 4)
通知のストリーム (=整数値 5)
Androidでのストリーム、音量、マナーモードについて (2019.06.20訂正)
Androidでの再生音量はサウンドの種類ごとに管理されています。たとえば着信音量とアラームの音量はそれぞれ別に音量設定が可能となっています。このサウンドの種類のことを「ストリーム」と呼んでいます。
メディアプレイヤーで再生した時の音量は、端末の(ストリーム毎の)音量指定に本処理単語の音量を掛け合わせたものになります。
たとえば端末の(ストリームの)音量設定が80%で、本処理単語に与える音量が50%であるなら、最終的な音量は80%×50%=40%となります。
メディアプレイヤーでの再生は
マナーモード の設定状況に影響を受けるので注意が必要です。
Android OS のバージョンによるので一概には言えませんが、軽いマナーモード設定ではたとえば、通知のストリームを指定した再生が抑制される一方、アラームのストリームを指定した再生は音が出る・・といった違いがあることに留意してくだいさい。
たとえば、軽いマナーモードであってもアラームのストリームによる音を出さないようにする・・のなら、別途「マナーモードを取得」で状態取得することでアプリ側で対処する必要があります(たとえば、マナーモード中は再生しない、音量を強制ゼロにする、あるいはバイブ鳴動にするなど)。
<ID> (整数)
IDは「メディアプレイヤーを生成」で得られた値をそのまま指定してください。
<戻り値>
成功時と失敗時で異なる情報がスタックに返されるので注意してください。
成功時には 真 だけが返されます。失敗時には エラーメッセージ と 偽 が返されます。いずれにしてもスタックトップには真偽が積まれているので、呼び出し直後は 「偽? ならば ・・」 で受けてエラー分岐をおこなってください。(2019.06.20訂正)
本単語を呼び出した場合、サウンドの再生を開始するだけで直ちに戻って来ることに注意してください。短い音源であれば放置すれば自然に止まりますが、ループ指定に真を指定した場合や、音源が長い場合は明に停止させる必要があります。
ある音を再生中、再度のボタン押下などで再びおなじ音あるいは別の音が再生される可能性もあります。ただ、多くの場合は望まない動作になるため、「再生中は再び再生開始はしない」というロジックをアプリに組み込んで置くと良いでしょう。この仕組みみついては後述するサンプルを参考にしてください。
なお、短い音源のために明に止める必要が無い場合であっても、IDの破棄はおこなうようにしてください。(後述する「メディアプレイヤーを開放」)
■停止
指定したIDの再生を停止します。
記述例c
プレイヤー1は ID。 ←IDを記憶しておく変数の宣言
ボタンクリック処理とは (ボタンID → 戻値)
〜略〜
_ボタン番号が ○○に 等しい ※←停止ボタン
ならば プレイヤー1を メディアプレイヤーを停止し
0を 返し
終り
つぎに
〜略〜
0を 返すこと。
■IDの解放
「メディアプレイヤーを解放」を呼ぶことでIDを解放できます。しかしこの処理単語は存在はするものの必ずしも呼び出す必要はなく、サンプルプログラムでも記述していません。
■再生終了時のイベント (この記述は任意)
指定した音源を最後まで再生し終わった時のイベントを捕らえることができます。(その必要がなければこの処理単語の定義は不要です)
文法
再生終了時の処理とは 本定義 (ID → 戻値)
〜略〜
〜略〜。
上記のような記述をしておけば、再生終了のタイミングで何らかの処理をおこなうことができます。
再生途中にプログラムで停止した場合にはこのイベントは発生しません。
「再生終了時の処理」の最後では、戻値を1つ積むことを忘れないでくだこさい(これはすべてのイベント処理に共通の仕様です)。この戻値により、さらに後続のイベントを発生させることができます。
たとえば再生終了と同時にアプリも自動的に終了させるのなら「実行終り定数」を返します。あるいは、さらなるイベントを発生させる必要が無いのであれば数値0を返してください。
■メディアプレイヤーを全て停止して解放
同時に複数の音を鳴らしている可能性がある場合、それらすべてを停止させ、さらにIDを解放します。
プログラムの終了時には強制的にこの処理単語が呼び出されますが、それ以外でも使って構いません。
文法
メディアプレイヤーを全て停止して解放 → ・
メディアプレイヤーによる再生のサンプルプログラム) |
■
サンプルプログラム SpPlayer
既に
ログインからサンプルアプリのコンパイルまで - 1つのサンプルアプリを試しにコンパイル にて1つのサンプルアプリをコンパイルしていたはずですが、ここではそれらのサンプルの一つである音の再生をおこなう
SpPlayer をコンパイルしてみます。
サンプルプログラム群のうち、次のものを使います。
andrmindSample/
|-- 〜略〜
〜略〜
|-- MediaPlayer/ ←フォルダ内にあるファイルはすべてアプリ SpPlayer のためのもです
| |-- phrase031.mp3 ←サウンドファイル (こちらを二番目にアップロード)
| `-- SpPlayer.src ←Mindソース (こちらを先にアップロード)
〜略〜
(phrase031.mp3 はフリー素材 'Music is VFR' 様のものを使わせていただきました)
まず、
端末との連携(パッケージローダ) での解説に従って、パッケージローダを起動、さらにそこからサービスを起動しておいてください。
次に、Mind for Android のメイン画面で、「新しいアプリの作成」ボタンを押し、その状態で、サンプルプログラムの上記フォルダ内にある
SpPlayer.src をアップロードします。これにより SpPlayer というアプリが自動作成されます。
続いて、
サウンドファイル phrase031.mp3 もアップロードしてください。このうち mp3 ファイルは開発画面の右区画中段の「サウンドファイル (res/raw/)」という場所に表示されるはずです。(上・中・下段への振り分けは拡張子により自動的に行われます)
上の状態で「コンパイル」ボタンを押してコンパイルすると端末にダウンロードされるはずです。
SpPlayer のインストールが終ったら起動してください。次の画面が表示されます。
一番上のボタンを押すと、パッケージ内蔵の音源(さきほどアップロードしたファイル)が再生されます。こには単発再生です。
二番目のボタンを押すと、パッケージ内蔵の音源を繰り返し再生します。止めるには「停止」ボタンで停止させてください。
三番目のボタンを押すと、端末内蔵の標準音源(デフォルトのアラーム音)をそのURIを指定する方法で再生します。
四番目のボタンを押すと、端末内蔵の標準音源の一つを物理的なファイル名として指定する方法で再生をおこないます。
(注:端末あるいはAndroidのバージョンによにってはこのファイルが存在せずにエラーが表示されることがあります。ご承知ください)(2019.06.20追記)
(注:拡張子 .ogg はPCでは馴染みが薄いですがAndroidではよく使われます)
注:前2つ(apk内臓)は通知のストリームで、後2つ(システム標準音源)は「アラームのストリーム」で再生するようになっています。Androidでは音の種類ごとに音量設定が行えるため、ボタンを押しても音が出ない場合は、音の種類ごとの音量設定(音量ボリュームではなく)を、あるいはマナーモードの設定状況をご確認ください。(2019.06.20追記)
「再生音量設定」ボタンを押すと次のようなダイアログが開きます。
上記ダイアログで音量を変更することができます。(メディアプレイヤーで再生した時の音量は、端末の(ストリーム毎の)音量指定にプログラムで指定する音量を掛け合わせたものになります)
Copyright(C) 2000 Scripts Lab. Inc.