質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2931閲覧

[Android Studio] NotificationChannelを再設定する方法

aheshiyu

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/08/22 10:53

編集2020/08/22 13:06

実現したいこと

NotificationChannelの再設定がしたいです.

現状わかっていること

APIが26以上の場合の通知として以下のプログラムが完成しています.

java

1if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 2{ 3 // 通知チャンネルの定義 4 NotificationChannel notificationChannel = new NotificationChannel(channelID, 5 channelID, 6 NotificationManager.IMPORTANCE_DEFAULT); 7 8 // -------------------- 9 // 追記エリア 10 // -------------------- 11 12 // 通知チャンネルの作成 13 notificationManager.createNotificationChannel(notificationChannel); 14 15 // 通知の生成と設定 16 Notification.Builder builder = new Notification.Builder(this, channelID) 17 .setContentTitle("MyTitle") 18 .setContentText("MyMessage") 19 .setSmallIcon(R.drawable.MyIcon); 20 21 //通知の発行 22 notificationManager.notify(1, builder.build()); 23} 24else 25{ 26 // 通常の通知設定 27 ... 28}

上記のプログラムは適切に動作するのですが,今回はプログラム中の追記エリアに以下のコードを追加したいと考えています.

Java

1// isSound と isVibrate の初期値は false です. 2// また,この初期値は別のアクティビティで管理しており,Switchにより切り替えるようにしています. 3 4// 通知音の無効化 5if (isSound == false) 6{ 7 notificationChannel.setSound(null, null); 8} 9 10// 振動の無効化 11if (isVibrate == false) 12{ 13 notificationChannel.enableVibration(false); 14}

このプログラムを追加した結果,「はじめは」通知音と振動は無効化されませんでした.

そこで色々と調査を進めるうち,一度アプリケーションをアンインストールし,再度インストールすることで無効化されました.
※ここでの操作は Android Studio 上で再度Runを実行することとは異なり,実際にアプリケーションを手動でアンインストールし,その後Runを実行しインストールすることです.

そしてアプリをアンインストール後,実験としてisSoundisVibrateの初期値をtrueにしてアプリをインストールしてみたところ,もちろん通知音や振動は無効化されませんでした.

予想

恐らく,アプリをインストールした時点でOS側でアプリの通知設定を定義してしまい,後からの変更(Runによる再インストールやメソッドでのNotificationChannelの設定変更)では歯が立たなくなっているのだと思います.

実現したいこと(詳細)

今回は通知音と振動をSwitchによる切替えにより有無を決定したいと考えています.
すなわち,通知の設定をアプリ内で変更する必要があるということです.

通知の設定は以下のメソッドを追加して実現したいと考えています.

Java

1// 通知の設定(複数呼び出す予定) 2private void setNotification() 3{ 4 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 5 { 6 ... 7 } 8 else 9 { 10 ... 11 } 12}

しかし,先ほどの結果からも分かる通り,NotificationChannelの設定はアプリをRunによる再インストールだけではなく,手動でアンインストールさえもしなければ設定が変更されないという,ガチガチであることです.

もちろん,isSoundisVibrateを変更後,上記のsetNotificationメソッドを呼び出しても期待通りの動作はしませんでした.
繰り返しになりますが,NotificationChannelの設定はインストール時点の初期値で決められたisSoundisVibrateがずっと生きているのです.

どのようにすれば,NotificationChannelの再設定が可能になるのでしょうか.
よろしくお願いいたします.

補足

APIが26未満の処理では以下の処理を記述しており,こちらは適切に動作しています.

Java

1if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 2{ 3 ... 4} 5else 6{ 7 Notification.Builder builder = new Notification.Builder(this); 8 builder.setContentTitle("MyTitle"); 9 builder.setContentText("MyMessage"); 10 builder.setSmallIcon(R.drawable.MyIcon); 11 12 // 通知音の有効化 13 if (isSound == true) 14 { 15 builder.setSound(alarmSound); 16 } 17 18 // 振動の有効化 19 if (isVibrate == true) 20 { 21 builder.setVibrate(new long[] {wait, vibrate, sleep, vibrate, sleep}); 22 } 23}

setSoundseteVibrateを設定していないと,通知音や振動が有効にならなかったため,こちらは無効化ではなく有効化をしております.

このように,古いAPIでは設定可能であるにも関わらず,新しいAPIではできないのが疑問です.
しかし,現状を見る限り,恐らくできないことをしようとしているのだと思います.
それなりの理由で無理なのであれば,こちらとしてもこの問題を追究するための時間を空けることができます.

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

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

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

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

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

guest

回答1

0

ベストアンサー

Ref: https://developer.android.com/training/notify-user/channels?hl=ja#UpdateChannel

通知チャネルを作成した後は、通知チャネルの表示動作や鳴動動作をプログラマティックに変更することはできません。

このコードがどのタイミングで呼ばれているのかはわかりませんが、1度目に呼ばれた後に NotificationChannel の設定値をプログラムから更新することは出来ないと思います。

ユーザーだけが、システム設定からチャネル動作を変更することができます。ユーザーが簡単に通知設定にアクセスできるように、このシステム設定を開くアイテムを、アプリの設定 UI に追加してください。

とあるので、アプリから設定へのリンクボタンを置くことが推奨されているのかと思いました。

多分やりたいであろうことを考えると、↓がパッと思いつきました

NotificationChannel を分ける

バイブレーションやサウンド設定ごとに、通知チャンネルを分けて作成した上で、通知する際に適切なチャンネルと結びつけると、希望の
(それでもユーザー設定で変更されると、それを上書きすることは出来ませんが

NotificationChannel を毎回削除して作り直す

Ref: https://developer.android.com/training/notify-user/channels?hl=ja#DeleteChannel

参照先見ると

注: 通知設定画面には、スパム防止メカニズムとして、削除されたチャネルの数が表示されます。開発用デバイス上のテストチャネルを削除するには、アプリを再インストールするか、アプリのコピーに関連付けられたデータを消去します。

とあるので、あまり良い方法ではないと思われます

投稿2020/09/05 09:09

unhappychoice

総合スコア1531

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

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

aheshiyu

2020/09/24 13:46

やはりユーザの任意の設定では,通知音有無や振動有無については変更できないようですね... 毎回Channelを削除するのはナンセンスですし,今回は諦めることにします. ご回答ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問