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();
}
}
}
