AndroidのFirebaseから通知を送信するときに通知音が鳴らない


83

FirebaseからAndroidアプリケーションにプッシュ通知を送信しています。ただし、アプリがバックグラウンドにある場合、firebase onMessageReceivedメソッドは呼び出されず、代わりにfirebaseがシステムに通知を送信してシステムトレイに通知を表示します。通知はシステムトレイに表示されますが、システム設定でアプリの通知音を許可しても通知音が鳴りません。

Firebaseから通知を受け取ったときに通知音を再生するにはどうすればよいですか。

これは、firebaseからアプリのBlogpostリンクに通知を送信する方法です。

AndroidアプリケーションにFirebaseを追加する方法


1
参照してください、この答えは...
geekoraul

そのアプリの通知設定を確認してください
maheshmnj

@Developine:あなたのリンクはなくなった!! (developine.com / ...)
アングエン

回答:


114

通知の通知ペイロードには、サウンドキーがあります。

公式ドキュメントから、その使用法は次のとおりです。

デバイスが通知を受信したときに再生する音を示します。アプリにバンドルされているサウンドリソースのデフォルトまたはファイル名をサポートします。サウンドファイルは/ res / raw /に存在する必要があります。

例えば:

{
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",

    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon",
      "sound" : "mySound"
    }
  }

デバイスのデフォルトのサウンドを使用する場合は、次を使用する必要があります"sound": "default"

ペイロードで可能なすべてのキーについては、次のリンクを参照してください:https//firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

アプリがバックグラウンドにある場合、firebaseが通知を異なる方法で処理することを知らない人のために。この場合、onMessageReceived関数は呼び出されません。

アプリがバックグラウンドにある場合、Androidは通知メッセージをシステムトレイに送信します。ユーザーが通知をタップすると、デフォルトでアプリランチャーが開きます。これには、通知とデータペイロードの両方を含むメッセージが含まれます。このような場合、通知はデバイスのシステムトレイに配信され、データペイロードはランチャーアクティビティの目的に応じて配信されます。


23
デバイスのデフォルトのサウンドを使用する場合は、次を使用する必要があります: "sound": "default"
Brian Vo

@TranVoは、「デフォルト」値がデバイスのデフォルトサウンドを再生することを指摘してくれてありがとう、あなたは私に多くの時間を節約しました!
Mattia Ruggiero 2016年

1
私は可能なすべての方法を試しましたが、デフォルトのサウンドまたは自分のトーンを設定することによるサウンドを得ることができず、振動も発生しませんでした
santhosh 2017年

1
では、通知の音を無効にするにはどうすればよいですか?
iamatsundere181 2018

1
新しい通知チャネルシステムは、古いデバイスでこのAPIを廃止しましたか、それとも古いデバイスで引き続き機能しますか?Nougatデバイスにカスタムサウンドを表示させようとしていますが、「sound」または「soundName」に何を入力しても、デフォルトのチャイムサウンドエフェクトが得られるようです。「mysoundeffect.wav」と「mysoundeffect」を試してみましたが、うまくいきませんでした。
ジョンゴーレンフェルド

26

adavacedオプション 選択高度なオプションをするとき、メッセージを書いて、音を選択アクティブにし アクティブ化を選択

これが私の解決策です


Android 8以降の@KongJingでは、Firebaseコンソールの設定に関係なく常に音が鳴ります。音を完全に防ぐ方法を知っていますか?
2

私はそう遅く、これを見て申し訳ありません、私はこの問題を解決することはできません@ 1回2回のコードを考えてみてください。
KongJing

24

これを試して

{
    "to" : "DEVICE-TOKEN",

    "notification" : {
      "body"  : "NOTIFICATION BODY",
      "title" : "NOTIFICATION TITILE",
      "sound" : "default"
    }
  }

@カスタム通知音のメモ:-> "sound" : "MyCustomeSound.wav"


1
では、そのファイルをどこに置きますか?生で?資産?
Hamzeh Soboh 2017

3
アセットフォルダーではなく、resの下に新しいフォルダーを作成し、rawと呼びます。次に、wavまたはmp3ファイルをコピーしてそのフォルダーに貼り付けます。@HamzehSoboh
Ally Makongo 2018

Androidアプリの/res/raw/my_sound.mp3にサウンドを入れてから、「sound」:「my_sound.mp3」でAPIを呼び出します。作業、単にデフォルトサウンドが再生された:(私のような誰もがしませんか?
アングエン

ああ、私はそれを機能させます。ここでは、より詳細な情報をAndroidの通知チャンネルを使用する: stackoverflow.com/questions/61142155/...
アングエン

12

このonMessageReceivedメソッドは、アプリがフォアグラウンドにある場合、または通知ペイロードにデータ型のみが含まれている場合にのみ起動されます。

Firebaseドキュメントから

ダウンストリームメッセージングの場合、FCMは通知データの2種類のペイロードを提供 します

通知タイプ、FCMは自動的にクライアントアプリケーションに代わってエンドユーザデバイスにメッセージを表示します。通知には、ユーザーに表示されるキーの事前定義されたセットがあります。
以下のためのデータタイプ、クライアントアプリケーションは、データメッセージを処理するための責任があります。データメッセージには、カスタムのキーと値のペアのみがあります。

通知を使用したい時にFCMが処理するクライアント・アプリケーションの代わりに通知を表示します。使用するデータ・メッセージを、あなたの欲しいアプリが扱うように表示するか、あなたのAndroidクライアントアプリでメッセージを処理するか、直接FCM接続がある場合にiOSデバイスにメッセージを送信したい場合。

ドキュメントのさらに下

通知とデータペイロードの両方を含むメッセージを受信するときのアプリの動作は、アプリがバックグラウンドにあるかフォアグラウンドにあるか、つまり、受信時にアクティブであるかどうかによって異なります。
バックグラウンドの場合、アプリは通知トレイで通知ペイロードを受信し、ユーザーが通知をタップしたときにのみデータペイロードを処理します。
フォアグラウンドにある場合、アプリは両方のペイロードが使用可能なメッセージオブジェクトを受信します。

Firebaseコンソールを使用して通知を送信している場合、ペイロードには常に通知タイプが含まれます。通知ペイロードにデータ型のみを含む通知を送信するには、FirebaseAPIを使用する必要があります。これにより、新しい通知を受信したときにアプリに常に通知が届き、アプリは通知ペイロードを処理できます。

アプリがバックグラウンドにあるときに従来の方法を使用して通知サウンドを再生する場合は、サウンドパラメーターを通知ペイロードに追加する必要があります


いや、アプリが閉じられたときにも呼び出されますが、アプリの自動起動を許可する必要があります。
ファンキー

10

HTTP v1APIでは異なります

ドキュメンテーション

例:

{
 "message":{
    "topic":"news",
    "notification":{
       "body":"Very good news",
       "title":"Good news"
    },
    "android":{
       "notification":{
          "body":"Very good news",
          "title":"Good news",
          "sound":"default"
       }
    }
  }
}

これをPHPで書く方法は?
タビシュカーン

@Tabishkhan$this->message['message']['android']['notification']['sound'] = "default";
SudoPlz

7

また、音を出さなければならない通知にも問題がありました。アプリがフォアグラウンドにあるとすべてが正しく機能しましたが、アプリがバックグラウンドにあると音が出ませんでした。

通知はFCMを介してサーバーによって送信されました。つまり、サーバーは通知のJSONをマウントしてFCMに送信し、FCMは通知をアプリに送信します。サウンドタグを付けても、背景に音が出ません。

ここに画像の説明を入力してください

サウンドタグを付けても機能しませんでした。

ここに画像の説明を入力してください

たくさん検索した後、私はgithubフォーラムで解決策を見つけました。次に、私の場合、2つの問題があることに気づきました。

1-APIレベル26以降で動作するために重要なchannel_idタグの送信がありませんでした

ここに画像の説明を入力してください

2-Androidアプリケーションでは、通知がサーバーから直接送信されるこの特定のケースでは、事前にチャネルIDを構成する必要があったため、メインアクティビティでは、Androidがいつ何をすべきかを認識できるようにチャネルを構成する必要がありました。通知が届きました。

サーバーから送信されるJSONの場合:

   {
  "title": string,
  "body": string,
  "icon": string,
  "color": string,
  "sound": mysound,

  "channel_id": videocall,
  //More stuff here ...
 }

あなたの主な活動:

 @Background
    void createChannel(){
            Uri sound = Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" + R.raw.app_note_call);
            NotificationChannel mChannel;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                mChannel = new NotificationChannel("videocall", "VIDEO CALL", NotificationManager.IMPORTANCE_HIGH);
                mChannel.setLightColor(Color.GRAY);
                mChannel.enableLights(true);
                mChannel.setDescription("VIDEO CALL");
                AudioAttributes audioAttributes = new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build();
                mChannel.setSound(sound, audioAttributes);

                NotificationManager notificationManager =
                        (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.createNotificationChannel(mChannel);
            }
    }

これは最終的に私の問題を解決しました、私がしたように誰かが2日を無駄にしないのを助けることを願っています。コードに入れるすべてのものに必要かどうかはわかりませんが、これが方法です。また、私が行ったのはそこに投稿されたものと同じだったので、答えをクレジットするためのgithubフォーラムのリンクも見つかりませんでした。


2

このようにします

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

    Uri sound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        builder.setSound(sound);

}

6
アプリがバックグラウンドにある場合、onMessageReceivedは呼び出されません。実際、これは私が直面している問題です
2016年

メインアクティビティからthis(Firebase.setAndroidContext(getApplicationContext());)を呼び出しましたか
AAA

いいえ、私は持っていません。しかし今、私は私のために働いたislからの通知回答を再生しています。
2016年

ビルダーが生成されたエラーを教えてくださいビルダーを定義してください
Ashish Shahi 2017

ビルダーはnotificationcompatビルダーです
AAA

1

これを試して....

  public  void buildPushNotification(Context ctx, String content, int icon, CharSequence text, boolean silent) {
    Intent intent = new Intent(ctx, Activity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 1410, intent, PendingIntent.FLAG_ONE_SHOT);

    Bitmap bm = BitmapFactory.decodeResource(ctx.getResources(), //large drawable);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(ctx)
            .setSmallIcon(icon)
            .setLargeIcon(bm)
            .setContentTitle(content)
            .setContentText(text)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent);

    if(!silent)
       notificationBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

 NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(1410, notificationBuilder.build());
    }

そしてonMessageReceivedで、それを呼び出します

 @Override
public void onMessageReceived(RemoteMessage remoteMessage) {


    Log.d("Msg", "Message received [" + remoteMessage.getNotification().getBody() + "]");

    buildPushNotification(/*your param*/);
}

またはKongJingをフォローしてください。彼の言うとおり正しいですが、Firebaseコンソールを使用できます。


0

Firebaseコンソールから送信しても通知音を鳴らすことができます。これを行うには、事前に値「default」のキー「sound」を追加する必要があります。


あなたのアイデアは機能していますが、電話がロックされているときに通知画像を変更する必要があります。変更するにはどうすればよいですか。助けてください
Ashish Shahi 2017

私はあなたの前のアイデアを試していますが、うまくいきません助けてくださいそれはとても緊急です
Ashish Shahi 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.