web-dev-qa-db-ja.com

NotificationChannelからのサウンドを無効にする

本日、API 26をターゲットにし始めたため、通知チャネルを使用せざるを得なくなりました。

私の問題は、新しい通知(更新を含む)ごとに迷惑なサウンドが再生されることです。

このサウンドを無効にするにはどうすればよいですか?

この音を無音のmp3に渡すためにこの音をカスタムmp3音に置き換えようとしましたが、これは無視されます。

優先度が非常に低い通知を追加するだけで、基本的には、ユーザーがアプリを操作した後にいくつかのアクションを実行するオプションをユーザーに提供します。大声で話す理由はありません。ユーザーは、通知を表示する原因になることがわかっているアプリで特定のことを行ったため、通知を参照できることを知っています。

ユーザーは本当にその音に悩まされ始めます。

55
Daniel F

(2019-05更新:Androidで悪化します)Q、少なくともエミュレータでNotificationManager.IMPORTANCE_LOWを使用すると音が聞こえます...)


解決策は、NotificationManager.IMPORTANCE_LOWを使用して、そのための新しいチャネルを作成することです。チャンネルが作成されると、重要度を変更することはできません(できますが、新しい重要度は無視されます)。チャンネル情報はシステムによって永続的に保存されているように見え、作成されたチャンネルはアプリをアンインストールしたときにのみ削除されます。 [UpdateFerran Negre のコメントによると、nm.deleteNotificationChannel(nChannel.getId());を介してチャンネルを削除し、nm.createNotificationChannel(nChannel);でチャンネルを再作成できますが、明らかに制限があります'削除されたチャンネルの同じIDでチャンネルを作成し、削除されていないチャンネルに異なる設定を適用できると期待してください。 acoder の回答を参照してください]

以前のAndroidバージョンではデフォルトでサウンドが再生されませんでしたが、これはAndroid Oで変更されましたが、API 26を対象とする場合、つまり通知チャネルを使用する場合のみです。これは矛盾です。実際、バグです。

この理由は、NotificationManager.IMPORTANCE_DEFAULT(デフォルトでは音に合わない)でチャンネルを作成すると、Androidが実際にそれをNotificationManager.IMPORTANCE_HIGHとして「ある程度」登録するからです(デフォルトでサウンドを再生します)。

これを確認するには、通知のオプションに移動して(通知エントリを長押しします)、タイプがNotificationManager.IMPORTANCE_HIGHであることを確認し、通知を無効にしてから再度有効にします。このプロセスでは、NotificationManager.IMPORTANCE_HIGHから非サウンドの、実際に登録されたNotificationManager.IMPORTANCE_DEFAULTに「ダウングレード」されます。

バグはAndroid課題トラッカーに送信されているため、スターを付けることをお勧めします (Googleから「修正できない(実行不可能)」というフラグが立てられているため、...甘やかされて育った)。


ところで、 https://developer.Android.com/training/notify-user/channels の新しいドキュメントは、デフォルトの動作がそのように使用されていたことを主張し、そのdefault Android 8.0より前のサウンドを再生しました。これは間違いなくtrueです。これが彼らのリストです

User-visible importance level           Importance               Priority   
                                        (Android 8.0 and higher) (Android 7.1 and lower)
Urgent  Makes a sound and appears as    IMPORTANCE_HIGH          PRIORITY_HIGH
        a heads-up notification                                  or PRIORITY_MAX
High    Makes a sound                   IMPORTANCE_DEFAULT       PRIORITY_DEFAULT
Medium  No sound                        IMPORTANCE_LOW           PRIORITY_LOW
Low     No sound and does not appear    IMPORTANCE_MIN           PRIORITY_MIN
        in the status bar

可視性の重要度が高いと通知の重要度が高いとの不一致も見ることができます...彼らがこれを行っている理由がわかりません。彼らは間違いなく彼らのコードにバグがあります。


次の行の下はすべて廃止されていますが、まだ言及されているバグはまだ有効です。私のエラーは、NotificationManager.IMPORTANCE_MINNotificationManager.IMPORTANCE_DEFAULTの次に低いものであると考えることでしたが、NotificationManager.IMPORTANCE_LOWはそうです。


その後、長押し通知と全チャネルボタンを使用してアプリの通知設定に移動し、そのチャネルのスイッチをオフおよびオンに切り替えると、実際にNotificationManager.IMPORTANCE_DEFAULTに設定され、音は再生されません。また、クラッシュ後、NotificationManager.IMPORTANCE_HIGHにリセットされたことにも気付きました。

したがって、基本的に回避策はNotificationManager.IMPORTANCE_MINを使用することです。ただし、このNotificationManager.IMPORTANCE_MINが有効になるように新しいチャネルを作成する必要があります。これは、一度作成した既存のチャネルの重要度を変更できないように見えるためです

更新:NotificationManager.IMPORTANCE_MINの回避策には欠点があります。

その重要度レベルを使用すると、通知は通知ドロワー内に完全に表示されなくなりますが、デフォルトで折りたたまれた新しい通知チャネルグループに挿入されます(ドロワーがプルダウンされるたびに再び折りたたまれます)。なんて残念!

更新2:もう少し掘り下げると、それがNotificationManager.IMPORTANCE_DEFAULTとして正しく登録されているように見えますが、どういうわけか魔法のようにNotificationManager.IMPORTANCE_HIGHにアップグレードされましたユーザーが設定をデフォルトから高に明示的に変更したときに発生します。また、通知をオフにしてから再びオンにすると、そのデフォルトにリセットされます。

76
Daniel F

チャンネルの重要性を維持し、サウンドを削除したい場合は、notificationChannel.setSound(null, null);が仕事をしているようです。

編集:必ず既存のユーザーに適用されるように、チャネルの名前を変更(および古いチャネルを削除)してください。 (チャンネルは作成できますが、アプリでは変更できません。ユーザーのみが変更できます。)

85
mVck
NotificationManager.IMPORTANCE_LOW

通知を作成するときに音が出ないのは、音楽アプリケーションでも同じことが必要なためです。

通知チャネルを既に作成している場合は、チャネルIDを変更するか、単に以前のアプリケーションをアンインストールしてから再インストールする必要があります。

2
Akash Bisariya

私が見た限りでは、API 26(Oreo)以降、一度作成された通知の音を変更することはできません。

    notificationManager.deleteNotificationChannel("channel_id"));
    NotificationChannel notificationChannel = new NotificationChannel(
        "channel_id", "channel_name",
        NotificationManager.IMPORTANCE_HIGH);
    notificationChannel.setSound(null, null);
    notificationManager.createNotificationChannel(notificationChannel);

作成前にチャンネルを削除しても、not助けになります。

Googleのドキュメントによると:

Android.app.NotificationManager public void deleteNotificationChannel(String channelId)

指定された通知チャネルを削除します。この同じIDで新しいチャネルを作成すると、削除されたチャネルは、削除される前と同じ設定のすべてで削除されません。

NotificationChannel#setSound()ドキュメントの状態

チャネルがNotificationManager#createNotificationChannel(NotificationChannel)に送信される前にのみ変更可能

notificationBuilder.setSound(defaultSoundUri)が機能しないことは残念です。

このメソッドはAPIレベル26で廃止されました。代わりにNotificationChannel#setSound(Uri、AudioAttributes)を使用してください。

また、サポートライブラリを使用しても機能しません。そのため、サウンドはアプリで1回のみ設定可能であり、ユーザーによる変更は通知の設定でのみ可能です。私にとって Ferran Negre's コメントは機能しませんでした。 Googleがこの制限を行った理由がわかりません。残念な。

1
acoder

最初に設定する必要があります

importance = NotificationManager.IMPORTANCE_LOW;

それから

Notification n = builder.setPriority(Notification.DEFAULT_ALL).build();
n.defaults = 0;
n.defaults |= Notification.DEFAULT_VIBRATE;
0
natsujay
NotificationManager.IMPORTANCE_LOW

これは機能しますが、通知も折りたたまれます。

0
Nicky

8.1で同じ問題に直面し、以下の変更を行いました。通知の優先度を「低」に変更すると、通知音が無効になります。

NotificationManager.IMPORTANCE_LOW

コードは次のようなものです。

NotificationChannel chan1 = new NotificationChannel("default", "default", NotificationManager.IMPORTANCE_LOW);
0
Kuldip Sharma

ケースが私のようなものである場合、バックグラウンドサービスの通知を表示することを余儀なくされており、8.0で機能したソリューションが通知されたことを本当に表示したくありません。

.setPriority(NotificationManager.IMPORTANCE_NONE)

これにより、5分ごとに迷惑な音が聞こえなかっただけでなく、通知自体の表示も最小限に抑えられました。

8.1では、次の音に問題はありませんでした。

.setPriority(NotificationManager.IMPORTANCE_MIN)
0
tsig