Androidプログラミング日記 (仮)  

サウンド?再生

あなたは

人目のプログラマーだよ。

Androidプログラミング日記 (仮).

 

 

 

 

サウンド再生

今回はサンド再生を勉強してみました。コードの使用方法などは難しくはないですね。その代わり使用するコードの書き込むタイミングや組み合わせがちょっと重要みたいです。基本的にAndroidの再生仕様では再生して停止させるとまた再生するのに手順がいるみたいなのです。それはメンドイのでってことで今回のコードがあるみたいです。

今回どういう仕様にしたかというとボタンが2つあり、それぞれ違うサウンドを再生し、バックグラウンドで常時サウンド再生をさせることにしました。

 

 

使用したサウンドなのですが・・・ぶっちゃけサウンドではありません。なにかの楽曲を使用するとなにかとめんどうなことになりそうですし、作成なんかそんなクリエイティブなことはできません。Androidで使用する形式はmp3らしいのでなにかをmp3に変換すればいいなと思い・・・

SofTalkさんのソフトでwav音声を作成し

零'sエンコーダ で mp3にエンコードしました。

使用ファイルをダウンロードしてもらいたいのですが、してもらい方もわからないのでごすごく簡単なので自分で作成してみたら楽しいですよ(ひとまかせ)。

ちなみに自分は作成ファイル3つで5分もかかりませんでした・・・作成したテキストは

test1.mp3 = "えへへへへへ"

test2.mps = "アンドロイド、サウンド再生プログラムだよ"

test3.mp3 = "ちゃっちゃちゃーーんちゃらららちゃっちゃちゃーーーーん"

test3は楽曲のつもりで・・・ループさせて・・・

レッツトライッ!

 

 

 

ファイル名「Sound1Activity.java」


package and.roid.sound1;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Display;
import android.view.Window;
import android.view.WindowManager;

public class Sound1Activity extends Activity {
	public float disp_w,disp_h;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        Window window = getWindow();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        WindowManager manager = window.getWindowManager();
        Display disp = manager.getDefaultDisplay();
        disp_w = disp.getWidth();
        disp_h = disp.getHeight();

        setContentView(new MainLoop(this));
    }

    //強制終了したら
    public void onStop(){
    	super.onPause();
    	System.exit(0);
    }
}
						

ファイル名「MainLoop.java」

package and.roid.sound1;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.media.MediaPlayer;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainLoop extends SurfaceView implements SurfaceHolder.Callback,Runnable{
	private SurfaceHolder holder;//お決まり
	private Thread thread;//お決まり

	//どのActivityを使用しているかのための変数
	private Sound1Activity s2a;
	private float disp_w,disp_h;
	//サウンド再生用ボタン2つ
	private Rect soundbtn1,soundbtn2;
	//再生サウンド3つ
	private MediaPlayer test1,test2,test3;
	//表示テキスト
	private String btnp = "PUSH再生";
	private String str1 = "青いボタンを押せばtest1.mp3が再生されます";
	private String str2 = "赤いボタンを押せばtest2.mp3が再生されます";
	private String str3 = "常時test3.mp3が再生されています";

	//コンストラクタが二つあるけど気にしないように
	//こちらのコンストラクタは、自前でViewを実装するときに
	//呼ばれるコンストラクタっぽい
	public MainLoop(Context context) {
		super(context);
		init(context);
	}
	//こちらはxml方式でViewを呼び出すときに呼ばれるぽい
	public MainLoop(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}

	public void init(Context context){
		holder = getHolder();//お決まり
		holder.addCallback(this);//お決まり
		holder.setFixedSize(getWidth(), getHeight());//お決まり
		s2a = (Sound1Activity)context;
		disp_w = s2a.disp_w;
		disp_h = s2a.disp_h;

		//サウンド再生用ボタン用座標
		soundbtn1 = new Rect(50,50,150,150);
		soundbtn2 = new Rect(300,50,400,150);

		//サウンド取り込み
		test1 = MediaPlayer.create(context, R.raw.test1);
		test2 = MediaPlayer.create(context, R.raw.test2);
		test3 = MediaPlayer.create(context, R.raw.test3);
		//test3だけ色々設定
		//サウンドをループさせるかどうか設定しなければfalse(しない)
		test3.setLooping(true);
		// サウンド音量設定0.0から1.0で設定
		test3.setVolume(0.5f, 0.5f);

		/*
		 * サウンド使用準備
		 * サウンド取り込みと同時に設定すると
		 * うまくいかなかったので別にしました
		 */
		try{
			test1.prepare();
			test2.prepare();
			test3.prepare();
		}catch (Exception e){}

	}

	//implements Runnableを実装するとこのメソッドが自動追加
	//ここがメインループとなります
	public void run() {//お決まり
		Canvas c;
		Paint p = new Paint();
		p.setAntiAlias(true);

		/*
		 * ここでtest3だけ再生
		 * while文の中で再生してしまうとカオスなのでここで再生
		 */
		playSound(test3);
		while(thread != null){
			c = holder.lockCanvas();//お決まり

			c.drawColor(Color.BLACK);
			Soundbtn(c,p,Color.BLUE,soundbtn1);
			Soundbtn(c,p,Color.RED,soundbtn2);
			setTextDraw(c,p,str1,0,400,Color.WHITE,20);
			setTextDraw(c,p,str2,0,450,Color.WHITE,20);
			setTextDraw(c,p,str3,0,500,Color.WHITE,20);


			holder.unlockCanvasAndPost(c);//お決まり

			try {
				Thread.sleep(50);//お決まり
			} catch (Exception e){}
		}
	}
	//サウンド再生ボタン表示メソッド
	public void Soundbtn(Canvas c, Paint p,int col,Rect rec){
		p.setColor(col);
		c.drawRect(rec, p);
		setTextDraw(c,p,btnp,rec.left,(rec.bottom-rec.top)/2,Color.WHITE,30);
	}
	//テキスト表示メソッド
	public void setTextDraw(Canvas c,Paint p,String str,int x,int y,int col,int size){
		p.setColor(col);
		p.setTextSize(size);
		c.drawText(str, x, y, p);
	}

	public boolean onTouchEvent(MotionEvent event){
		int action = event.getAction();
		int x = (int)event.getX();
		int y = (int)event.getY();
		switch(action){
		case MotionEvent.ACTION_DOWN:
			if(RectTap(x,y,soundbtn1)==true){
				playSound(test1);
			}
			if(RectTap(x,y,soundbtn2)==true){
				playSound(test2);
			}
			break;		}
		return true;
	}
	/*
	 * サウンド再生用メソッド
	 * 停止などもしたい場合拡張できるように別メソッド
	 * にしてみました
	 */
	public void playSound( MediaPlayer mp){
		   mp.seekTo(0);
		   mp.start();
	}
	public boolean RectTap(int x,int y,Rect gazou){
		return gazou.left < x && gazou.top < y && gazou.right > x && gazou.bottom > y;
	}

	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}//お決まり

	public void surfaceCreated(SurfaceHolder arg0) {thread = new Thread(this);thread.start();}//お決まり

	public void surfaceDestroyed(SurfaceHolder arg0) {thread = null;}//お決まり

}

						
 

こんな感じです。

 

3つのサウンドファイルがあり、test1は青ボタン、test2は赤ボタン、test3はバックグラウンドで常時再生されます。

今回は停止する必要性がなかったのでtest3以外の2つは再生して自然に終了・・・て感じですね。もし停止する必要がある場合は、ちょっとした工夫が必要になるみたいです。停止メソッドは、test1.pause()、やtest1.stop()、あどがあるのですが、冒頭で書いた通りちょっとAndroidにはサウンド再生にクセがあるようで、メソッドを書いて試してみると、一旦停止すると再生できません。わたくしもボタン押す=再生、ボタン押す=停止をやってみたのですが最初はうまくいきませんでした。そこで停止する場合、

test1.setOnCompletionListener( null );

で停止させれば次回も再生されるようになるみたいです。意味?アハハハ・・ワケノワカラナイコトヲ・・・

しかしやってみるとわかると思うのですが、このメソッドを使っても、長文のtext2を再生>text1再生>text1停止 の順番でするとtext1が再生されない状態に陥ってしまいます。わけがわからないので今回の再生のみという形になりました。

そのうち使用するときにでももっと詳しく勉強することにします(逃げ)

 

 

 

 

Androidプログラミング日記 (仮) | サイトマップ | 個人情報保護方針 | 応援メールテヘペロ | ©2012 Japan  相互リンク大募集中です