[android] Android의 Firebase에서 알림을 보낼 때 알림 소리가 나지 않습니다.

firebase에서 Android 애플리케이션으로 푸시 알림을 보내고 있습니다. 하지만 내 앱이 백그라운드에있을 때 firebase onMessageReceived 메서드가 호출되지 않고 대신 firebase가 시스템 트레이에 알림을 표시하기 위해 시스템에 알림을 보냅니다. 알림이 시스템 트레이에 나타나지만 시스템 설정에서 내 앱에 대한 알림 소리를 허용 한 경우에도 알림 소리가 나지 않습니다.

firebase에서 알림을받을 때 알림 음을 재생하려면 어떻게해야하나요?

이것이 firebase 에서 내 앱 Blogpost 링크 로 알림을 보내는 방법 입니다.

Android 애플리케이션에 Firebase를 추가하는 방법



답변

알림의 알림 페이로드에는 사운드 키가 있습니다.

공식 문서에서 사용은 다음과 같습니다.

장치가 알림을받을 때 재생할 소리를 나타냅니다. 앱에 번들 된 사운드 리소스의 기본값 또는 파일 이름을 지원합니다. 사운드 파일은 / 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는 알림 메시지를 시스템 트레이로 보냅니다. 사용자가 알림을 탭하면 기본적으로 앱 런처가 열립니다. 여기에는 알림 및 데이터 페이로드가 모두 포함 된 메시지가 포함됩니다. 이러한 경우 알림은 기기의 시스템 트레이에 전달되고 데이터 페이로드는 런처 활동의 의도에 따라 추가로 전달됩니다.


답변

adavaced 옵션
선택 고급 옵션을메시지를 작성 및 사운드를 선택 활성화
활성화 선택

이것은 내 솔루션입니다


답변

이 시도

{
    "to" : "DEVICE-TOKEN",

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

사용자 지정 알림 소리에 대한 @note :-> "sound" : "MyCustomeSound.wav"


답변

onMessageReceived메서드는 앱이 포 그라운드에 있거나 알림 페이로드에 데이터 유형 만 포함 된 경우에만 실행됩니다.

로부터 중포 기지의 문서

다운 스트림 메시징의 경우 FCM은 알림데이터 라는 두 가지 유형의 페이로드를 제공
합니다 .

대한 통지 유형, FCM은 자동으로 클라이언트 응용 프로그램을 대신하여 최종 사용자 장치에 메시지를 표시합니다. 알림에는 사용자가 볼 수있는 미리 정의 된 키 세트가 있습니다.
를 들어 , 데이터 유형, 클라이언트 응용 프로그램은 데이터를 처리하는 메시지에 대한 책임이 있습니다. 데이터 메시지에는 맞춤 키-값 쌍만 있습니다.

알림 사용 당신이 원하는 경우에 FCM을 처리하기 위해 클라이언트 응용 프로그램 대신에 알림을 표시. 사용 데이터 메시지는 당신이 할 때 응용 프로그램이 처리하는 표시를하거나 안드로이드 클라이언트 응용 프로그램에서 메시지를 처리하거나 직접 FCM 연결이있을 때 iOS 기기에 메시지를 보내려면.

문서를 더 아래로

알림 및 데이터 페이로드가 모두 포함 된 메시지를 수신 할 때의 앱 동작 은 앱이 백그라운드에 있는지 포 그라운드에 있는지 여부에 따라 달라집니다. 본질적으로 수신시 활성 상태인지 여부에 따라 다릅니다.
백그라운드 에서 앱은 알림 트레이에 알림 페이로드를 수신하고 사용자가 알림을 탭할 때만 데이터 페이로드를 처리합니다.
포 그라운드에있을 때 앱은 두 페이로드를 모두 사용할 수있는 메시지 객체를 수신합니다.

Firebase 콘솔을 사용하여 알림을 보내는 경우 페이로드에는 항상 알림 유형이 포함됩니다. 알림 페이로드에 데이터 유형 만 포함 된 알림을 보내려면 Firebase API를 사용해야합니다. 이렇게하면 새 알림이 수신 될 때 앱에 항상 알림이 전송되고 앱이 알림 페이로드를 처리 할 수 ​​있습니다.

기존 방법을 사용하여 앱이 백그라운드에있을 때 알림 음을 재생 하려면 알림 페이로드에 sound 매개 변수추가 해야합니다 .


답변

HTTP v1 API를 사용하면 다릅니다.

선적 서류 비치

예:

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


답변

나는 또한 소리를 내야하는 알림에 문제가 있었는데, 앱이 전경에있을 때 모든 것이 올바르게 작동했지만 앱이 배경에있을 때 소리가 나오지 않았습니다.

알림은 FCM을 통해 서버에서 전송되었습니다. 즉, 서버는 알림의 JSON을 마운트하여 FCM으로 보낸 다음 앱으로 알림을 보냅니다. 사운드 태그를 붙여도 배경에서 사운드가 나오지 않습니다.

여기에 이미지 설명 입력

사운드 태그를 넣어도 작동하지 않았습니다.

여기에 이미지 설명 입력

많은 검색 끝에 github 포럼에서 해결책을 찾았습니다. 그런 다음 제 경우에는 두 가지 문제가 있음을 알았습니다.

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 포럼 링크를 찾지 못했습니다. 왜냐하면 내가 한 일은 거기에 게시 된 것과 동일했기 때문입니다.


답변

이렇게 해

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

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

}