Android(X06HT Desire) サウンドを再生するサンプル
音を鳴らしてみる。ノタの森 というすばらしいサイトがあったので、そこから 2、3 音源をダウンロード。
個人でも法人でも商用利用も可とのこと。音源の加工は不可で、著作表示が必要だが、利用料を支払うとどちらも不要にできるようだ。
mp3 への変換
まず、落としてきたファイルを解凍し、mp3 に変換する。
Windows Media Player で変換できないかな~と思ったが、できなさそう。インターフェースが限りなくわかりにくいので探せてないだけかも。
ツールとかダウンロードしたりするの面倒くさいなーと思ったら、PCにバンドルされている、CyberLink Power2Go というソフトで変換できた。
書き込み – 音声の変換
対象のファイルを選択し、プルダウンを mp3 とし実行
ジェスチャーに合わせて再生させてみる
ただ再生するだけでは面白くないので、ジェスチャーにあわせて再生させてみる(というほどのものでもないが)
上記の mp3 ファイル を、/res/raw ディレクトリの配下に置く。
プログラムからは、R.raw.{サウンドファイル名(拡張子なし)} で ID が参照できるので、それをMediaPlayerに渡して再生する。
setVolumeControlStream(AudioManager.STREAM_MUSIC);
の記述をしておかないと、本体左側のハードウェアの音量ボタンで音量が制御できない。
(アプリ動作中に音量を変更しても、着信音の制御しかできない)
バイブレーターの使用には、パーミッションの設定が必要。
<uses-permission android:name=”android.permission.VIBRATE”></uses-permission>
package info.typea.soundapp; import android.app.Activity; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.os.Vibrator; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.Toast; /** * サウンド提供ノタの森 * http://nota.from.tv/ */ public class SoundAppActivity extends Activity { /** Called when the activity is first created. */ private GestureDetector gesture; private MediaPlayer player; private Vibrator vib; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); this.gesture = new GestureDetector(this, new GestureSoundListener()); // ハードウェアから音量の操作を可能にする setVolumeControlStream(AudioManager.STREAM_MUSIC); } @Override public boolean onTouchEvent(MotionEvent event) { if (this.gesture.onTouchEvent(event)) return true; return super.onTouchEvent(event); } class GestureSoundListener implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener, OnCompletionListener { /** * 指定されたリソースIDのサウンドを再生 * @param id */ private void startSound(int id) { if (player == null) { player = MediaPlayer.create(getApplicationContext(), id); player.setOnCompletionListener(this); player.seekTo(0); player.start(); } } /** * 再生を終了 */ private void stopSound() { if (player != null) { player.stop(); player.release(); player.setOnCompletionListener(null); player = null; } } @Override public boolean onDown(MotionEvent e) { return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { stopSound(); return false; } @Override public void onLongPress(MotionEvent e) { startSound(R.raw.se012_0083); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { startSound(R.raw.se012_0143); vib.vibrate(50L); return false; } @Override public void onShowPress(MotionEvent e) { Toast toast = Toast.makeText(getApplicationContext(), "サウンド提供\nノタの森\nhttp://nota.from.tv/", Toast.LENGTH_SHORT); toast.show(); } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onDoubleTap(MotionEvent e) { return false; } @Override public boolean onDoubleTapEvent(MotionEvent e) { return false; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { return false; } @Override public void onCompletion(MediaPlayer paramMediaPlayer) { stopSound(); } } }