FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

【ぐっと萌ーニングコール】じゅわーすぴーかーで囁くようになりました!

こんにちは!
最近アンチエイジングに目覚めた@tsumakkyです。

本日、わたくしのアプリ、【ぐっと萌ーニングコール】バージョンアップいたしました!
前々からアプリのコメントで、
「キャラの声がスピーカーから聞こえるのがイヤだ」
というご指摘を多々受けておりました。


私も耳元から聞こえなきゃ本当のモーニングコールじゃない!
耳元から聞こえるように直したい!と思いつつも、アプリ制作は本業じゃないため
忙しさにかまけて延ばし延ばしになっていました・・・
しかし、先週末から別の案件もちょっと絡まって、バージョンアップしていいこととなったので、
やっと、やっと…!対応することができましたー❤
是非是非お気に入りのキャラのメッセージを、耳元で聞いて目覚めてみてください!

f:id:k_chindamaikul:20150722135922p:plain


さて、宣伝はここまでにして。
今回耳元から聞こえるように対応した時、ひよっこJavaエンジニアとしてはちょっと苦労したので
そのコードを公開してみたいと思います!
もし誰かのお役に立てれば・・・。

私のアプリは、音関係は全てMediaPlayerを使っています。
音の素材はresフォルダのrawのなかに、拡張子oggで入れています。
なので、今まではごく一般的に、
(id:素材のパス)

public void startSound(Context context, int id, float volume ){
		MediaPlayer mediaplayer = MediaPlayer.create(context, id);
		mediaplayer.setVolume(volume, volume);
		mediaplayer.start();

		mediaplayer.setOnCompletionListener(this);
}


と書いていました。
むしろ、MediaPlayer.create して id もしくは uri でしか指定できないのだと思っていました。

しかし、耳元から流すには、スピーカーを指定しなければならない。
むしろどうやって、どんなコードで指定するの?
ってか、耳元のスピーカーの名称何?
わかんないから、ググれないよ!

そんな私に、救いの手が・・・!
となりの山田さんがスピーカー名を教えてくれました!
「じゅわーすぴーかー」とのこと。
ググる私。
でも一向にヒットしない!
それもそのはず、「ジュワースピーカー」じゃなく「受話スピーカー」らしい(笑)
みんな大爆笑で、大変恥ずかしい思いをしました・・・
間違えないで下さい、受話スピーカーです!(笑)

長くなりましたが、受話スピーカーからの音の出し方。
ぐっと萌ーニングコールの場合、着信音は普通のスピーカーから出したいので、
着信のときと通話の時を if文 で分けてみました!
(audiotype 0が着信 1が通話)

public void startSound(Context context, int id, float volume , int audiotype ){

		//着信音の場合
		if(0 == audiotype){
			mediaplayer = MediaPlayer.create(context, id);
			mediaplayer.setVolume(volume, volume);
			mediaplayer.start();
		}
		//通話の場合
		else{
			mediaplayer = new MediaPlayer();
			mediaplayer.setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/" + id ));
			mediaplayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

			mediaplayer.prepare();
			mediaplayer.start();
		}

		mediaplayer.setOnCompletionListener(this);
	}


そう、setAudioStreamType でスピーカーを指定するのです。
ちなみに他のスピーカーは、以下のようになっています。

タイプ
STREAM_ALARMアラーム音
STREAM_DTMFプッシュダイヤル音
STREAM_MUSIC音楽
STREAM_NOTIFICATION通知音
STREAM_RING着信音
STREAM_SYSTEMシステム音
STREAM_VOICE_CALL通話音

この場合、setDataSource で音を指定しなければならないみたいです。
(MediaPlayer.create(context, id)では指定できませんでした…)
で、うちの娘の場合、内部に素材を持っているので、uriで内部パスを指定。
setDataSource(this, Uri.parse("android.resource://" + getPackageName() + "/" + id ))
実は、内部パスが android.resource://" + getPackageName() になるの知りませんでした…
大変お勉強になりました!

どうでしょう?
久々に娘を触ると、愛くるしくて、楽しいなーと思ってしまうのです(笑)
結構色々コメントでキツく言われてるので(笑)ユーザー満足度高めるために
できるだけ対応していこうと思っています!
そして近々、違うバージョンリリース予定…なはず!
ご期待くださいませ!!!


↓↓↓DLはこちらから↓↓↓
f:id:k_chindamaikul:20150722140006p:plain