アラーム通知で、任意の音源をループ再生して任意のタイミングで停止する


アラーム通知で、任意の音源(ジングルなどのmp3ファイル)をループ再生して、好きなタイミングで止めるというのを実装してみます。
基本的には、下記の記事を参考に、組み合わせるだけです。
アプリで音声ファイルをループ再生して、任意のタイミングで止める
Androidアプリでアラーム通知をする その1

起動して、その1分後にアラーム通知が来るようにセットするコード。

[MainActivity]

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	//アラームを識別するコード、任意なので重複しない好きな数値を設定
	int REQUEST_CODE = 140707;

	//1分後に通知を鳴らす
	Calendar cal = Calendar.getInstance();
	cal.add(Calendar.MINUTE, 1);
	long init_alarm = cal.getTimeInMillis();

	//指定の時間になったら起動するクラス
	Intent intent = new Intent(this, AlarmReceiver.class);
	intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
	PendingIntent sender = PendingIntent.getBroadcast(this, REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);

	//AlramManagerにPendingIntentを登録
	AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
	am.set(AlarmManager.RTC_WAKEUP, init_alarm, sender);
}

[res]-[raw]フォルダの中に、「alarm.mp3」というファイルを入れている。
音量をマックスまで上げているが、これはサンプル用に記述しているだけで、普通の配布アプリではユーザーに無断で音量をあげたりしない。
アラームを鳴らす時間は「int timeout = 30*1000;」で30秒としている。

[AlarmReceiver]

public class AlarmReceiver extends BroadcastReceiver {
	// notifications
	@Override
	public void onReceive(Context context, Intent data) {
		Resources res = context.getResources();

		Notification n = new Notification();
		//アイコンの設定
		n.icon = R.drawable.ic_launcher;
		//メッセージの設定
		n.tickerText = "メッセージ1";
		//通知を選択した時に自動的に通知が消えるための設定
		n.flags = Notification.FLAG_AUTO_CANCEL;

		// 通知をタッチしたときに起動するActivity
		Intent i = new Intent(context, StopActivity.class);

		PendingIntent pi = PendingIntent.getActivity(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
		// 上から通知バーを下してきたときに表示される文章をセット
		n.setLatestEventInfo(context, res.getString(R.string.app_name), "メッセージ2", pi);

		//デフォルトLED点滅パターンを設定
		n.defaults |= Notification.DEFAULT_LIGHTS;

		// 設定したNotificationを通知する
		NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
		nm.notify(1, n);

		Uri uri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.alarm);

		//音量設定を取得
		AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
		int Vol = am.getStreamVolume(AudioManager.STREAM_MUSIC); //[res]-[raw]の音源を再生するときの音量
		int max = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); //[res]-[raw]の音源を再生するときの最大音量
		System.out.println("Vol:" + Vol);
		System.out.println("max:" + max);
		//音量を上げる
		am.setStreamVolume(AudioManager.STREAM_MUSIC, max, 0);

		final MediaPlayer mp = MediaPlayer.create(context, uri);
		mp.setLooping(true);
		mp.start();

		int timeout = 30*1000;
		Handler handler = new Handler();
		handler.postDelayed(new Runnable() {
			@Override
			public void run() {
				if (mp.isPlaying())
					mp.stop();
			}
		}, timeout);
	}
}

[AndroidManifest.xml]

<receiver
    android:name="com.example.alarm_test.AlarmReceiver"
    android:process=":remote" />

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください