🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

1864閲覧

指定したイベントで通知音とバイブレーションを停止したい

takaradango

総合スコア8

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/12/19 09:35

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

モバイル着メロには、無料の着メロ、バックグラウンド ミュージック、toques para telemóvel grátis 映画の音 、さまざまな動物の音のカテゴリがあります。 これらのサウンドは、誰でも完全に無料でダウンロードして使用できます。

投稿2022/11/24 02:43

freefonto

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

通知で通知音とバイブレーションを管理するのではなく、サービスを使って管理するようにすることで解決しました。

投稿2020/01/10 09:21

takaradango

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問