前提・実現したいこと
firebaseを使った通知アプリを作っていて、通知音とバイブレーションが通知領域を表示するまで続くようになっています。またダイアログを表示するようになっていて、ダイアログのボタンを押したときにこの通知音とバイブレーションが停止するようにしたいのですが、方法が分かりません。
画面遷移の流れ
通知を受け取るとまずMyFireMessagingServiceのonMessageReceiedに入ります。ここでshowNotificationを使って通知を作り、さらにAlertActivityに遷移します。AlertActivityでDialogを作成します。ここでPositiveButtonを押したときに、AlertActivityのIntent_to_MainActivityを呼び出します。ここで通知音とバイブレーションを停止させてMainActivityに遷移させたいです。onResumeやonPauseを使ってフォアグラウンドとバッググラウンドで切り替わるときに停止させることができないかどうかを検討したのですが、うまくいきませんでした。宜しくお願いします。
MainActivity
1public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState){ 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 // アプリのTokenを取得しLogに表示 8 FirebaseInstanceId.getInstance().getInstanceId() 9 .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { 10 @Override 11 public void onComplete(@NonNull Task<InstanceIdResult> task) { 12 if (!task.isSuccessful()) { 13 Log.w("FIREBASE", "getInstanceId failed", task.getException()); 14 return; 15 } 16 17 // Get new Instance ID token 18 String token = task.getResult().getToken(); 19 20 // Log 21 String msg = getString(R.string.msg_token_fmt, token); 22 Log.d("FIREBASE", msg); 23 } 24 }); 25 } 26}
MyFireMessagingService
1public class MyFirebaseMessagingService extends FirebaseMessagingService { 2 3 @Override 4 public void onMessageReceived(RemoteMessage remoteMessage) { 5 super.onMessageReceived(remoteMessage); 6 7 /* 8 通知音量の設定 9 */ 10 AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 11 12 audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 13 // ストリームごとの最大音量を取得する 14 int ringMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION); 15 // 音量を設定する(UI表示かつサウンドを再生する) 16 int flags = AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_PLAY_SOUND; 17 // 最大音量に設定する 18 audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, ringMaxVolume, flags); 19 20 /* 21 通知メッセージの表示 22 */ 23 String title=""; 24 String message=""; 25 26 // 通知メッセージは使わないが残しておく 27 /* 28 if (remoteMessage.getNotification() != null) { 29 title = remoteMessage.getNotification().getTitle(); 30 message = remoteMessage.getNotification().getBody(); 31 } 32 */ 33 // データメッセージを受け取る 34 if(remoteMessage.getData() != null){ 35 Map<String, String> data = remoteMessage.getData(); 36 title = data.get("title"); 37 message = data.get("message"); 38 } 39 showNotification(title, message); 40 41 // ダイアログの表示 42 ShowAlertDialog(); 43 } 44 45 46 // 通知を表示するメソッド 47 public void showNotification(String title, String message) { 48 // 音声ファイルのURI文字列を作成 49 String alarmUriStr = "android.resource://" + getPackageName() + "/" + R.raw.alarm1; 50 // 音声ファイルのURIオブジェクトを生成 51 Uri mediaUri = Uri.parse(alarmUriStr); 52 53 // 通知の作成 54 Intent intent = new Intent(this, MainActivity.class); 55 intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 56 PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 57 PendingIntent.FLAG_ONE_SHOT); 58 NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "MyNotification") 59 .setContentTitle(title) 60 .setSmallIcon(R.drawable.ic_stat_name) 61 .setAutoCancel(true) 62 .setContentText(message) 63 .setSound(mediaUri) 64 .setDefaults(Notification.DEFAULT_VIBRATE 65 | Notification.DEFAULT_LIGHTS) 66 .setContentIntent(pendingIntent); 67 68 // 着信音とバイブをループさせる処理 69 Notification notification = builder.build(); 70 notification.flags |= Notification.FLAG_INSISTENT; 71 72 NotificationManagerCompat manager = NotificationManagerCompat.from(this); 73 manager.notify(0, notification); 74 } 75 76 // ダイアログを表示するメソッド 77 public void ShowAlertDialog(){ 78 Intent intent2 = new Intent(MyFirebaseMessagingService.this, AlertActivity.class); 79 intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 80 startActivity(intent2); 81 } 82}
AlertActivity
1public class AlertActivity extends AppCompatActivity { 2 3 AudioManager manager; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_alert); 9 // ダイアログフラグメントオブジェクトを生成 10 AbnormalNotificationDialogFragment dialogFragment = new AbnormalNotificationDialogFragment(); 11 // ダイアログ表示 12 dialogFragment.show(getSupportFragmentManager(), "AbnormalNotificationDialogFragment"); 13 } 14 15 // 通知音を停止し、MainActivityに遷移する 16 public void Intent_to_MainActivity(){ 17 18 AudioManager manager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 19 manager.requestAudioFocus(null, AudioManager.STREAM_NOTIFICATION, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 20 manager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 21 22 Intent intent2 = new Intent(this, MainActivity.class); 23 startActivity(intent2); 24 } 25 26 @Override 27 public void onResume(){ 28 super.onResume(); 29 manager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 30 manager.requestAudioFocus(null, AudioManager.STREAM_NOTIFICATION,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 31 manager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 32 } 33 34 @Override 35 public void onPause(){ 36 super.onPause(); 37 // フォーカスを明け渡す 38 manager.abandonAudioFocus(afChangeListener); 39 } 40 41 AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() { 42 @Override 43 public void onAudioFocusChange(int focusChange) { 44 45 } 46 }; 47 48}
AbnormalNotificationDialogFragment
1public class AbnormalNotificationDialogFragment extends DialogFragment { 2 @Override 3 public Dialog onCreateDialog(Bundle savedInstanceState){ 4 // ダイアログビルダーを生成 5 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 6 // ダイアログビルダーを生成 7 builder.setTitle(R.string.dialog_title); 8 // ダイアログのメッセージを設定。 9 builder.setMessage(R.string.dialog_msg); 10 // Positive Buttonを設定。 11 builder.setPositiveButton(R.string.dialog_btn_confirm, new DialogButtonClickListener()); 12 // Negative Buttonを設定。 13 builder.setNegativeButton(R.string.dialog_btn_ng, new DialogButtonClickListener()); 14 // Neutral Buttonを設定。 15 builder.setNeutralButton(R.string.dialog_btn_nu, new DialogButtonClickListener()); 16 // ダイアログオブジェクトを生成し、リターン。 17 AlertDialog dialog = builder.create(); 18 return dialog; 19 } 20 21 22 23 private class DialogButtonClickListener implements DialogInterface.OnClickListener{ 24 @Override 25 public void onClick(DialogInterface dialog, int which){ 26 // トーストメッセージ用文字列変数を用意。 27 String msg=""; 28 // タップされたアクションボタンで分岐 29 switch(which){ 30 // Positive Buttonの時 31 case DialogInterface.BUTTON_POSITIVE: 32 msg = getString(R.string.dialog_ok_toast); 33 AlertActivity callingActivity = (AlertActivity) getActivity(); 34 callingActivity.Intent_to_MainActivity(); 35 break; 36 //Negative Buttonの時 37 case DialogInterface.BUTTON_NEGATIVE: 38 msg = getString(R.string.dialog_ng_toast); 39 break; 40 //Neutral Buttonの時 41 case DialogInterface.BUTTON_NEUTRAL: 42 msg = getString(R.string.dialog_nu_toast); 43 break; 44 } 45 //トーストの表示 46 Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show(); 47 } 48 } 49} 50
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。