Thông báo Android không hiển thị


115

Tôi cần một chương trình sẽ thêm thông báo trên Android. Và khi ai đó nhấp vào thông báo, nó sẽ dẫn họ đến hoạt động thứ hai của tôi.

Tôi đã thiết lập mã. Thông báo sẽ hoạt động, nhưng vì lý do nào đó mà nó không hoạt động. Các Notificationkhông hiển thị gì cả. Tôi không biết tôi đang thiếu cái gì.

Mã của các tệp đó:

Notification n = new Notification.Builder(this)
        .setContentTitle("New mail from " + "test@gmail.com")
        .setContentText("Subject")
        .setContentIntent(pIntent).setAutoCancel(true)
        .setStyle(new Notification.BigTextStyle().bigText(longText))
        .build();

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after it's selected

notificationManager.notify(0, n);

vui lòng cố gắng ngắn gọn hơn khi bạn đặt câu hỏi. Bạn không đề cập đến những gì không hoạt động. Trong thực tế, bạn thậm chí không đề cập đến một cái gì đó không hoạt động. Có phải là Activitykhông được đưa ra? Có phải là Notificationkhông hiển thị?
slinden77

3
@dmmh tôi đã nói trong câu hỏi của tôi vấn đề của tôi là gì! Và tôi không thấy có gì sai với câu hỏi. Câu hỏi của tôi là cụ thể về vấn đề. Nếu bạn không phải là một chuyên gia không cần phải chọc! Và câu trả lời của tato469 là ổn.
Choudhury sáng

3
Tôi chỉ ra rằng mục đích của trang web này không phải để bạn khắc phục sự cố của mình mà là để những người khác có thể tìm ra giải pháp cho các vấn đề. Tôi không chọc. Tôi xin lỗi, tôi đã làm tổn thương cảm xúc của bạn, nhưng thực tế là câu hỏi của bạn sai, câu trả lời sai và tất cả thông tin sai lệch này sẽ dẫn đến những lập trình viên mới làm quen khác, những người có cùng vấn đề như bạn mô tả, phải dùng đến các giải pháp không hiệu quả dựa trên mã BẠN đã cung cấp. Dù tôi có phải là chuyên gia hay không thì cũng không liên quan đến trường hợp nào. Đặc biệt là không phải vì tôi đúng, câu hỏi của bạn là mơ hồ, và câu trả lời khác là sai.
slinden77

Tôi sẽ yêu cầu xóa câu hỏi này và câu trả lời vì nó gây hiểu lầm. Chúc bạn ngày mới tốt lành.
slinden77,

1
đã thay đổi câu hỏi, để mọi người có thể hiểu vấn đề là gì.
Choudhury sáng

Câu trả lời:


412

Mã sẽ không hoạt động nếu không có biểu tượng. Vì vậy, hãy thêm lệnh setSmallIcongọi vào chuỗi trình tạo như thế này để nó hoạt động:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) trở lên

Android 8 đã đưa ra một yêu cầu mới về thiết lập thuộc channelIdtính bằng cách sử dụng một NotificationChannel.

private NotificationManager mNotificationManager;

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);

NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");

mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);

mNotificationManager =
    (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

// === Removed some obsoletes
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
    String channelId = "Your_channel_id";
    NotificationChannel channel = new NotificationChannel(
                                        channelId,
                                        "Channel human readable title",
                                        NotificationManager.IMPORTANCE_HIGH);
   mNotificationManager.createNotificationChannel(channel);
  mBuilder.setChannelId(channelId);
}

mNotificationManager.notify(0, mBuilder.build());

Làm cách nào để nhận CHANNEL_ID? vui lòng giúp đỡ
Ananta Prasad

@LAnantaPrasad CHANNEL_ID được coi là số nhận dạng dành cho bạn. Đó là những gì bạn nhóm các thông báo, chẳng hạn như một cuộc trò chuyện trò chuyện hoặc trò chuyện nhóm.
Casey Daniel

Cảm ơn, setChannelIdđược yêu cầu. Trước khi tôi thêm thông báo đó, thông báo hiển thị trên thiết bị SONY của tôi nhưng không hiển thị trên thiết bị SAMSUNG.
Wesely


2
Cũng bao gồm kiểm tra if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }vì nếu không có kiểm tra này, thông báo sẽ không hiển thị, ngay cả khi API thiết bị của bạn> = 26.
Koushik Shom Choudhury

58

Thực ra câu trả lời của ƒernando Valle có vẻ không đúng. Sau đó, một lần nữa, câu hỏi của bạn quá mơ hồ vì bạn không đề cập được điều gì sai hoặc không hoạt động.

Nhìn vào mã của bạn, tôi giả sử Notificationđơn giản là không hiển thị.

Thông báo của bạn không hiển thị vì bạn không cung cấp biểu tượng. Mặc dù tài liệu SDK không đề cập đến việc nó được yêu cầu, nhưng thực tế là rất nhiều và Notificationsẽ không hiển thị nếu không có nó.

addActionchỉ có sẵn kể từ 4.1. Trước đó, bạn sẽ sử dụng PendingIntentđể khởi chạy một Activity. Bạn dường như chỉ định a PendingIntent, vì vậy vấn đề của bạn nằm ở chỗ khác. Về mặt logic, người ta phải kết luận đó là biểu tượng bị thiếu.


tôi tìm thấy vấn đề đó. Nhưng cảm ơn vì đã trả lời thích hợp. Tôi thực sự đánh giá cao sự giúp đỡ của bạn.
Choudhury sáng

1
Bạn nói rằng addAction chỉ có sẵn từ 4.1 nhưng sai rồi, tôi đã sử dụng nó trong 2.3. Sách hướng dẫn tham khảo nói về nút không phải về thông báo: "Các nút tác vụ sẽ không xuất hiện trên các nền tảng trước Android 4.1." bạn có thể kiểm tra tại đây: AddAction được bao gồm trong android.support.v4.app
ƒernando Valle

1
OP đang sử dụng Notification.Builder, không phải NotificationCompat.Builder, như bạn đang đề xuất. Chỉ vì có một thư viện tương thích và nó có thể được sử dụng, không có nghĩa là hàm có sẵn trong API bình thường. Liên kết bạn cung cấp thực sự quy định điều này. Câu hỏi này rõ ràng có liên quan đến Notification.Builder, như ví dụ cho thấy. Và thư viện tương thích có lẽ chỉ bao gồm chức năng này sau khi 4.1 có sẵn. Câu trả lời của bạn là sai, bởi vì bây giờ bạn đề nghị nó đã có sẵn từ 2.3.
slinden77

Xin lỗi nếu tôi bỏ lỡ, tôi có nghĩa là điều đó có thể xảy ra trong 2,3
ƒernando Valle

4
Argh biểu tượng !! Thậm chí không nhận ra nó bị thiếu nhưng việc thêm nó đã khắc phục được sự cố. Không thấy bất cứ điều gì hữu ích trong bảng điều khiển về một biểu tượng bị thiếu, dường như bị lỗi âm thầm.
Pete

33

Bạn đã thiếu biểu tượng nhỏ. Tôi đã làm cùng một sai lầm và bước trên đã giải quyết nó.

Theo tài liệu chính thức: Đối tượng Thông báo phải chứa những điều sau:

  1. Một biểu tượng nhỏ, được đặt bởi setSmallIcon ()

  2. Một tiêu đề, được đặt bởi setContentTitle ()

  3. Văn bản chi tiết, được đặt bởi setContentText ()

  4. Trên Android 8.0 (API cấp 26) trở lên , ID kênh thông báo hợp lệ do setChannelId () đặt hoặc được cung cấp trong hàm tạo NotificationCompat.Builder khi tạo kênh.

Xem http://developer.android.com/guide/topics/ui/notifiers/notifications.html


3
Đây không phải là sự thật. Nếu bạn sử dụng bố cục thông báo tùy chỉnh bằng setContent, không cần tiêu đề hoặc văn bản.
Ray Li

11

Điều này khiến tôi gặp khó khăn hôm nay, nhưng tôi nhận ra đó là vì trên Android 9.0 (Pie), tính năng Không làm phiền theo mặc định cũng ẩn tất cả các thông báo, thay vì chỉ để im lặng như trong Android 8.1 (Oreo) trở về trước. Điều này không áp dụng cho các thông báo.

Tôi thích bật DND cho thiết bị phát triển của mình, vì vậy việc đi vào cài đặt DND và thay đổi cài đặt để chỉ cần tắt tiếng thông báo (nhưng không ẩn chúng) đã sửa lỗi đó cho tôi.


9

Việc tạo kênh thông báo là bắt buộc đối với các phiên bản Android sau Android 8.1 (Oreo) để hiển thị thông báo. Nếu thông báo không hiển thị trong ứng dụng của bạn cho Android Oreo +, bạn cần gọi hàm sau khi ứng dụng của bạn khởi động -

private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name,
       importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviours after this
        NotificationManager notificationManager =
        getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
   }
}

1

Tôi nghĩ rằng bạn quên

addAction(int icon, CharSequence title, PendingIntent intent)

Xem ở đây: Thêm hành động


1
phương pháp addAction()này không khả dụng trên Notification.Builder.
slinden77

1
Nó tồn tại, nhưng không được dùng nữa. Thay vào đó, bạn có thể chuyển một Actionphiên bản mà bạn có thể tạo Notification.Action.Builder. Tái bút, Luôn sử dụng thay thế Compat (tức là, NotificationCompat), vì Google có xu hướng vá lỗi và cung cấp khả năng tương thích tốt hơn với chúng
Gökhan Barış Aker

Nếu bạn không muốn chỉ định bất kỳ hành động nào, chỉ cần sử dụng .setContentIntent(null)với trình tạo.
Gökhan Barış Aker

1

Tôi gặp sự cố tương tự với ứng dụng Android của mình. Tôi đang thử thông báo và nhận thấy rằng thông báo đang hiển thị trên trình giả lập Android chạy hệ thống Android 7.0 (Nougat), trong khi nó không chạy trên điện thoại chạy Android 8.1 (Oreo) của tôi.

Sau khi đọc tài liệu, tôi thấy rằng Android có một tính năng được gọi là kênh thông báo, nếu không có thông báo này sẽ không hiển thị trên các thiết bị Oreo. Dưới đây là liên kết đến tài liệu Android chính thức trên các kênh thông báo.


1

Đối với tôi đó là một vấn đề với deviceToken. Vui lòng kiểm tra xem mã thông báo thiết bị của người nhận và người gửi có được cập nhật đúng cách trong cơ sở dữ liệu của bạn hay không hoặc bất cứ nơi nào bạn đang truy cập mã thông báo để gửi thông báo.

Ví dụ: sử dụng phần sau để cập nhật mã thông báo thiết bị khi khởi chạy ứng dụng. Do đó nó sẽ luôn được cập nhật đúng cách.

// Device token for push notifications
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
  new OnSuccessListener<InstanceIdResult>() {

    @Override
    public void onSuccess(InstanceIdResult instanceIdResult) {

        deviceToken = instanceIdResult.getToken();

        // Insert device token into Firebase database
        fbDbRefRoot.child("user_detail_profile").child(currentUserId).child("device_token")).setValue(deviceToken)
                .addOnSuccessListener(
                  new OnSuccessListener<Void>() {

                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                });
    }
});

Điều này được deviceTokenkhai báo ở đâu?
Peter Mortensen

Tại sao onSuccesstrống rỗng?
Peter Mortensen

@PeterMortensen .. khi thành công, bạn có thể làm bất cứ điều gì mà logic của bạn cho phép như bắt đầu một ý định mới, nâng ly chúc mừng hoặc giữ nguyên trên cùng một trang. Đối với khai deviceToken bạn có thể khai báo nó như Private Chuỗi deviceToken trước onCreate trong trang của bạn
DragonFire

(Để làm cho bình luận của riêng tôi rõ ràng hơn: Có hai onSuccesss - Tôi đã đề cập đến một trong những nội (đó là trống))
Peter Mortensen

1

Bạn cũng cần thay đổi tệp build.gradle và thêm phiên bản Android SDK đã sử dụng vào đó:

implementation 'com.android.support:appcompat-v7:28.0.0'

Điều này giống như một sự quyến rũ trong trường hợp của tôi.


0

Thông báo có thể không được hiển thị nếu bạn hiển thị nhanh các thông báo này đến thông báo khác hoặc hủy thông báo hiện có, sau đó hiển thị lại ngay lập tức (ví dụ: kích hoạt thông báo cảnh báo để thông báo cho người dùng về sự thay đổi trong thông báo đang diễn ra). Trong những trường hợp này, hệ thống có thể quyết định chỉ chặn thông báo khi cảm thấy chúng có thể trở nên quá tải / spam đối với người dùng.

Xin lưu ý rằng ít nhất trên Android gốc (được thử nghiệm với 10) từ bên ngoài, hành vi này trông hơi ngẫu nhiên: đôi khi nó xảy ra và đôi khi nó không. Tôi đoán là, có một ngưỡng thời gian rất ngắn trong đó bạn không được phép gửi quá nhiều thông báo. Gọi điện NotificationManager.cancel()và sau NotificationManager.notify()đó đôi khi có thể gây ra hành vi này.

Nếu bạn có tùy chọn, khi cập nhật thông báo, đừng hủy thông báo đó trước đó mà chỉ cần gọi NotificationManager.notify()khi có thông báo cập nhật. Điều này dường như không kích hoạt hệ thống chặn nói trên.


-1

Nếu bạn đang sử dụng phiên bản> = Android 8.1 (Oreo) trong khi sử dụng kênh Thông báo, hãy đặt tầm quan trọng của nó thành cao:

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);

1
Bạn hiểu "một phiên bản> =" là gì? Ý bạn là "trên phiên bản 8.1 (hoặc cao hơn)" ? Vui lòng trả lời bằng cách chỉnh sửa câu trả lời của bạn , không phải ở đây trong nhận xét (nếu thích hợp).
Peter Mortensen

@PeterMortensen tha thứ cho tôi cho rằng nó chỉ là một loại nhờ cho sửa chữa tôi
Faisal Naseer
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.