Không có âm thanh thông báo khi gửi thông báo từ firebase trong Android


81

Tôi đang gửi thông báo đẩy từ firebase tới Ứng dụng Android của mình. nhưng khi ứng dụng của tôi ở trong nền firebase, phương thức onMessageReceive không được gọi thay vào đó firebase gửi thông báo đến hệ thống để hiển thị thông báo trong khay hệ thống. thông báo xuất hiện trong khay hệ thống nhưng không có âm thanh thông báo ngay cả khi tôi đã cho phép âm thanh thông báo cho ứng dụng của mình trong cài đặt hệ thống.

những gì tôi có thể làm để phát âm thanh thông báo khi nhận được thông báo từ firebase.

Đây là cách tôi gửi thông báo từ firebase đến liên kết Blogpost ứng dụng của tôi .

Cách thêm firebase vào ứng dụng Android của bạn


1
Vui lòng tham khảo câu trả lời này ..
geekoraul

Xin chào các bạn, vấn đề của tôi đã được giải quyết. đọc bài đăng này để biết chi tiết. developine.com/...
Developine

đảm bảo kiểm tra cài đặt thông báo cho ứng dụng đó
maheshmnj 14/09/19

Câu trả lời:


113

Trong phần tải thông báo của thông báo có một phím âm thanh.

Từ tài liệu chính thức, việc sử dụng nó là:

Cho biết âm thanh sẽ phát khi thiết bị nhận được thông báo. Hỗ trợ mặc định hoặc tên tệp của tài nguyên âm thanh được gói trong ứng dụng. Các tệp âm thanh phải nằm trong / res / raw /.

Ví dụ:

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

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

Nếu bạn muốn sử dụng âm thanh mặc định của thiết bị, bạn nên sử dụng: "sound": "default".

Xem liên kết này để biết tất cả các khóa có thể có trong tải trọng: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

Đối với những người không biết firebase xử lý thông báo theo cách khác nhau khi ứng dụng ở chế độ nền. Trong trường hợp này, hàm onMessageReceive không được gọi.

Khi ứng dụng của bạn ở chế độ nền, Android sẽ chuyển các tin nhắn thông báo đến khay hệ thống. Người dùng nhấn vào thông báo sẽ mở trình khởi chạy ứng dụng theo mặc định. Điều này bao gồm các tin nhắn chứa cả tải thông báo và dữ liệu. Trong những trường hợp này, thông báo được gửi tới khay hệ thống của thiết bị và tải trọng dữ liệu được phân phối ngoài mục đích của Hoạt động trình khởi chạy của bạn.


23
nếu bạn muốn sử dụng âm thanh mặc định của thiết bị, bạn nên sử dụng: "âm thanh": "mặc định"
Brian Võ

@TranVo cảm ơn bạn đã chỉ ra rằng giá trị "mặc định" phát âm thanh mặc định của thiết bị, bạn đã tiết kiệm cho tôi rất nhiều thời gian!
Mattia Ruggiero

1
Tôi đã thử tất cả các cách có thể nhưng không thể có mà âm thanh mặc định hoặc âm thanh từ thiết giai điệu của riêng mình và cũng không nhận được sự rung động những gì có thể là lý do
Santhosh

1
Vậy làm cách nào để có thể tắt âm thanh thông báo?
iamatsundere181

1
Hệ thống Kênh thông báo mới đã loại bỏ API này cho các thiết bị cũ hơn hay nó vẫn hoạt động cho các thiết bị cũ hơn? Tôi đã cố gắng làm cho âm thanh tùy chỉnh hiển thị cho thiết bị Nougat nhưng dường như tôi chỉ nhận được hiệu ứng âm thanh chuông mặc định cho dù tôi nhập gì vào "sound" hoặc "soundName". Tôi đã thử "mysoundeffect.wav" và "mysoundeffect" nhưng không thành công.
John Gorenfeld

26

tùy chọn adavaced chọn các tùy chọn nâng cao khi Viết tin nhắn và chọn kích hoạt âm thanh chọn kích hoạt

đây là giải pháp của tôi


@KongJing trong Android 8 trở lên, nó luôn có âm thanh cho dù cài đặt bảng điều khiển Firebase. Bạn có biết cách nào để ngăn chặn hoàn toàn âm thanh không?
Nghĩ mã hai lần một lần vào

Tôi xin lỗi để thấy điều này quá muộn, tôi không thể giải quyết vấn đề này @ Think Twice Mã Khi.
KongJing

22

Thử đi

{
    "to" : "DEVICE-TOKEN",

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

@ ghi chú cho âm thanh thông báo tùy chỉnh: -> "sound" : "MyCustomeSound.wav"


1
Vậy bạn đặt tập tin đó ở đâu? ở dạng thô? tài sản?
Hamzeh Soboh

3
Không phải thư mục tài sản, hãy tạo một thư mục mới dưới res, gọi nó là thư mục thô. Sau đó, sao chép và dán tệp wav hoặc mp3 của bạn vào thư mục đó. @HamzehSoboh
Ally Makongo

12

Các onMessageReceivedphương pháp là bắn chỉ khi ứng dụng là trong foreground hoặc tải trọng thông báo chỉ chứa các kiểu dữ liệu.

Từ tài liệu Firebase

Đối với tin nhắn xuôi dòng, FCM cung cấp hai loại tải trọng: thông báodữ liệu .

Đối với loại thông báo , FCM tự động hiển thị thông báo cho các thiết bị người dùng cuối thay mặt cho ứng dụng khách. Thông báo có một tập hợp các khóa người dùng nhìn thấy được xác định trước.
Đối với loại dữ liệu , ứng dụng khách chịu trách nhiệm xử lý thông báo dữ liệu. Thông báo dữ liệu chỉ có các cặp khóa-giá trị tùy chỉnh.

Sử dụng thông báo khi bạn muốn FCM xử lý việc hiển thị thông báo thay cho ứng dụng khách của bạn. Sử dụng tin nhắn dữ liệu khi bạn muốn ứng dụng của mình xử lý hiển thị hoặc xử lý tin nhắn trên ứng dụng khách Android của bạn hoặc nếu bạn muốn gửi tin nhắn đến thiết bị iOS khi có kết nối FCM trực tiếp.

Tiếp tục xuống các tài liệu

Hành vi của ứng dụng khi nhận được tin nhắn bao gồm cả tải thông báo và dữ liệu phụ thuộc vào việc ứng dụng đang ở chế độ nền hay nền - về cơ bản, nó có hoạt động hay không tại thời điểm nhận.
Khi ở chế độ nền , các ứng dụng nhận trọng tải thông báo trong khay thông báo và chỉ xử lý tải trọng dữ liệu khi người dùng nhấn vào thông báo.
Khi ở phía trước , ứng dụng của bạn nhận được một đối tượng thông báo có sẵn cả hai trọng tải.

Nếu bạn đang sử dụng bảng điều khiển firebase để gửi thông báo, trọng tải sẽ luôn chứa loại thông báo. Bạn phải sử dụng API Firebase để gửi thông báo chỉ với loại dữ liệu trong tải thông báo. Bằng cách đó, ứng dụng của bạn luôn được thông báo khi nhận được thông báo mới và ứng dụng có thể xử lý khối lượng thông báo.

Nếu bạn muốn phát âm thanh thông báo khi ứng dụng ở chế độ nền bằng phương pháp thông thường, bạn cần thêm thông số âm thanh vào tải thông báo.


nah, nó cũng được gọi khi ứng dụng bị đóng nhưng bạn nên cho phép tự động khởi động ứng dụng.
funky-nd

10

Với API HTTP v1 thì khác

Tài liệu

Thí dụ:

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

làm thế nào để viết điều này trong php?
Tabish khan

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

5

Tôi cũng gặp sự cố với các thông báo phải phát ra âm thanh, khi ứng dụng ở chế độ nền mọi thứ hoạt động chính xác, tuy nhiên khi ứng dụng ở chế độ nền, âm thanh không phát ra.

Thông báo được gửi bởi máy chủ thông qua FCM, tức là máy chủ đã gắn JSON của thông báo và gửi nó đến FCM, sau đó sẽ gửi thông báo đến các ứng dụng. Ngay cả khi tôi đặt thẻ âm thanh, âm thanh không phát ra ở âm thanh phía sau.

nhập mô tả hình ảnh ở đây

Ngay cả việc đặt thẻ âm thanh nó cũng không hoạt động.

nhập mô tả hình ảnh ở đây

Sau rất nhiều tìm kiếm, tôi đã tìm thấy giải pháp trên diễn đàn github. Sau đó, tôi nhận thấy rằng có hai vấn đề trong trường hợp của tôi:

1 - Việc gửi thẻ channel_id bị thiếu, điều quan trọng là phải hoạt động ở cấp API 26+

nhập mô tả hình ảnh ở đây

2 - Trong ứng dụng Android, đối với trường hợp cụ thể này khi thông báo được gửi trực tiếp từ máy chủ, tôi phải định cấu hình id kênh trước, vì vậy trong Hoạt động chính của tôi, tôi phải định cấu hình kênh để Android biết phải làm gì khi thông báo đã đến.

Trong JSON do máy chủ gửi:

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

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

Trong Hoạt động chính của bạn:

 @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);
            }
    }

Điều này cuối cùng đã giải quyết được vấn đề của tôi, tôi hy vọng nó sẽ giúp ai đó không lãng phí 2 ngày như tôi đã làm. Tôi không biết liệu nó có cần thiết cho mọi thứ tôi đặt trong mã hay không, nhưng đây là cách. Tôi cũng không tìm thấy liên kết diễn đàn github để ghi nhận câu trả lời nữa, bởi vì những gì tôi đã làm giống với một liên kết được đăng ở đó.


2

làm như thế này

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

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

}

6
onMessageReceive không được gọi khi ứng dụng ở chế độ nền. thực sự đây là vấn đề mà tôi đang phải đối mặt
Developine

bạn đã gọi điều này (Firebase.setAndroidContext (getApplicationContext ());) từ hoạt động chính
AAA

không, tôi không có. nhưng bây giờ tôi đang chơi câu trả lời thông báo từ isl đã làm việc cho tôi.
Developine

xin vui lòng cho tôi biết người xây dựng được tạo ra lỗi xin vui lòng xác định xây dựng
Ashish Shahi

người xây dựng là trình tạo máy tính thông báo
AAA

1

thử đi....

  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());
    }

và trong onMessageReceive, hãy gọi nó

 @Override
public void onMessageReceived(RemoteMessage remoteMessage) {


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

    buildPushNotification(/*your param*/);
}

hoặc theo KongJing , Cũng đúng như anh ấy nói, nhưng bạn có thể sử dụng Bảng điều khiển Firebase.


0

Tôi có thể phát âm thanh thông báo ngay cả khi tôi gửi âm thanh đó từ bảng điều khiển firebase. Để làm điều đó, bạn chỉ cần thêm phím "âm thanh" với giá trị "mặc định" trong tùy chọn trước.


Ý kiến của bạn là công việc Nhưng tôi đã yêu cầu thay đổi hình ảnh Thông báo khi điện thoại bị khóa Làm thế nào tôi có thể thay đổi Trợ giúp xin vui lòng cho tôi
Ashish Shahi

Tôi cố gắng Bạn Idea trước Nhưng Không làm việc hãy giúp Nó là như vậy khẩn cấp
Ashish Shahi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.