Android(X06HT Desire) サウンドを再生するサンプル

音を鳴らしてみる。ノタの森 というすばらしいサイトがあったので、そこから 2、3 音源をダウンロード。

個人でも法人でも商用利用も可とのこと。音源の加工は不可で、著作表示が必要だが、利用料を支払うとどちらも不要にできるようだ

mp3 への変換

まず、落としてきたファイルを解凍し、mp3 に変換する。

Windows Media Player で変換できないかな~と思ったが、できなさそう。インターフェースが限りなくわかりにくいので探せてないだけかも。

ツールとかダウンロードしたりするの面倒くさいなーと思ったら、PCにバンドルされている、CyberLink Power2Go というソフトで変換できた。

書き込み - 音声の変換

wav_to_mp3_01 

対象のファイルを選択し、プルダウンを mp3 とし実行

wav_to_mp3_02

ジェスチャーに合わせて再生させてみる

ただ再生するだけでは面白くないので、ジェスチャーにあわせて再生させてみる(というほどのものでもないが)

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