การแจ้งเตือนของ Android ไม่แสดง


115

ฉันต้องการโปรแกรมที่จะเพิ่มการแจ้งเตือนบน Android และเมื่อมีคนคลิกที่การแจ้งเตือนควรนำพวกเขาไปสู่กิจกรรมที่สองของฉัน

ฉันได้ตั้งรหัสแล้ว การแจ้งเตือนควรใช้งานได้ แต่ด้วยเหตุผลบางประการจึงไม่ทำงาน Notificationไม่ได้แสดงเลย ฉันไม่รู้ว่าฉันขาดอะไรไป

รหัสของไฟล์เหล่านั้น:

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

โปรดพยายามกระชับมากขึ้นเมื่อคุณถามคำถาม คุณไม่ได้พูดถึงสิ่งที่ไม่ได้ผล ในความเป็นจริงคุณไม่ได้พูดถึงบางสิ่งที่ไม่ได้ผล ยังActivityไม่เปิดตัว? คือNotificationไม่แสดง
slinden77

3
@dmmh ฉันพูดในคำถามว่าปัญหาของฉันคืออะไร! และฉันไม่พบสิ่งผิดปกติกับคำถาม คำถามของฉันเจาะจงเกี่ยวกับปัญหา หากคุณไม่ใช่ผู้เชี่ยวชาญไม่จำเป็นต้องโผล่! และคำตอบของ tato469 ก็ใช้ได้
Choudhury น

3
ฉันกำลังชี้ให้เห็นว่าจุดประสงค์ของไซต์นี้ไม่ได้มีไว้เพื่อให้คุณได้รับการแก้ไข แต่เพื่อให้ผู้อื่นสามารถหาวิธีแก้ปัญหาได้เช่นกัน ฉันไม่ได้แหย่ ฉันขอโทษฉันทำร้ายความรู้สึกของคุณ แต่ความจริงก็คือคำถามของคุณผิดคำตอบผิดและข้อมูลที่ทำให้เข้าใจผิดทั้งหมดนี้จะนำไปสู่โปรแกรมเมอร์มือใหม่คนอื่น ๆ ที่มีปัญหาเดียวกันกับที่คุณอธิบายโดยใช้วิธีแก้ปัญหาที่ไม่ได้ผล ตามรหัสที่คุณระบุ ไม่ว่าในกรณีใด ๆ ที่เกี่ยวข้องหรือไม่ถ้าฉันเป็นผู้เชี่ยวชาญหรือไม่ก็ตาม โดยเฉพาะอย่างยิ่งไม่ใช่เพราะฉันถูกคำถามของคุณคลุมเครือและคำตอบอื่นผิด
slinden77

ฉันจะขอให้ลบคำถามนี้และคำตอบเนื่องจากทำให้เข้าใจผิด มีวันที่ดี.
slinden77

1
เปลี่ยนคำถามเพื่อให้ผู้คนเข้าใจว่าอะไรคือปัญหา
Choudhury น

คำตอบ:


412

รหัสจะไม่ทำงานหากไม่มีไอคอน ดังนั้นให้เพิ่มการsetSmallIconโทรไปยังโซ่ตัวสร้างเช่นนี้เพื่อให้มันทำงาน:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) ขึ้นไป

Android 8 เปิดตัวข้อกำหนดใหม่ในการตั้งค่าchannelIdคุณสมบัติโดยใช้ไฟล์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());

วิธีรับ CHANNEL_ID โปรดช่วย
อนันต

@LAnantaPrasad CHANNEL_ID มีขึ้นเพื่อเป็นตัวระบุสำหรับคุณ เป็นสิ่งที่คุณจัดกลุ่มการแจ้งเตือนตามเช่นการสนทนาแชทหรือแชทเป็นกลุ่ม
Casey Daniel

ขอบคุณsetChannelIdจำเป็น ก่อนที่ฉันจะเพิ่มสิ่งนั้นการแจ้งเตือนจะปรากฏบนอุปกรณ์ SONY ของฉัน แต่ไม่ใช่อุปกรณ์ SAMSUNG
Wesely


2
รวมการตรวจสอบif(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }เนื่องจากไม่มีการตรวจสอบนี้การแจ้งเตือนจะไม่ปรากฏขึ้นแม้ว่า API อุปกรณ์ของคุณ> = 26
Koushik Shom Choudhury

58

อันที่จริงคำตอบของƒernando Valleดูเหมือนจะไม่ถูกต้อง จากนั้นอีกครั้งคำถามของคุณคลุมเครือมากเกินไปเพราะคุณไม่ได้พูดถึงสิ่งที่ผิดหรือไม่ได้ผล

ดูรหัสของคุณฉันสมมติว่าNotificationไม่มีการแสดง

การแจ้งเตือนของคุณไม่แสดงเนื่องจากคุณไม่ได้ให้ไอคอน แม้ว่าเอกสาร SDK จะไม่ได้ระบุถึงความจำเป็น แต่ในความเป็นจริงแล้วเอกสารนั้นมีอยู่มากและคุณNotificationจะไม่แสดงโดยไม่มี

addActionใช้ได้เฉพาะตั้งแต่ 4.1 ก่อนหน้านั้นคุณจะใช้PendingIntentเพื่อเปิดActivityไฟล์. ดูเหมือนคุณจะระบุ a PendingIntentดังนั้นปัญหาของคุณจึงอยู่ที่อื่น เหตุผลหนึ่งต้องสรุปว่าเป็นไอคอนที่หายไป


ฉันพบปัญหานั้น แต่ขอบคุณสำหรับการตอบกลับที่เหมาะสม ผมขอขอบคุณความช่วยเหลือของคุณ.
Choudhury น

1
คุณบอกว่า addAction ใช้งานได้ตั้งแต่ 4.1 เท่านั้น แต่ผิดฉันใช้มันใน 2.3 คู่มืออ้างอิงพูดถึงปุ่มที่ไม่เกี่ยวกับการแจ้งเตือน: "ปุ่มการทำงานจะไม่ปรากฏบนแพลตฟอร์มก่อน Android 4.1" คุณสามารถตรวจสอบได้ที่นี่: AddActionรวมอยู่ใน android.support.v4.app
ƒernando Valle

1
OP ใช้Notification.Builderไม่ใช่NotificationCompat.Builderเหมือนที่คุณแนะนำ เพียงเพราะมีไลบรารีที่เข้ากันได้และสามารถใช้งานได้ไม่ได้หมายความว่าฟังก์ชันนี้สามารถใช้ได้ใน API ปกติ ลิงก์ที่คุณให้ไว้กำหนดเงื่อนไขนี้ คำถามนี้เกี่ยวข้องอย่างชัดเจนNotification.Builderดังตัวอย่างที่แสดง และไลบรารีความเข้ากันได้อาจรวมฟังก์ชันนี้ไว้หลังจาก 4.1 เท่านั้น คำตอบของคุณทำให้เข้าใจผิดเพราะตอนนี้คุณแนะนำว่ามีให้ตั้งแต่ 2.3
slinden77

ขออภัยถ้าฉันพูดผิดฉันหมายความว่าเป็นไปได้ใน 2.3
ƒernando Valle

4
ไอค่อน !! ไม่รู้ด้วยซ้ำว่ามันหายไป แต่การเพิ่มมันช่วยแก้ปัญหาได้ ไม่เห็นสิ่งที่เป็นประโยชน์ในคอนโซลเกี่ยวกับไอคอนที่หายไปดูเหมือนว่าจะล้มเหลวโดยเงียบ
Pete

33

คุณไม่มีไอคอนขนาดเล็ก ฉันทำผิดพลาดเหมือนกันและขั้นตอนข้างต้นแก้ไขได้

ตามเอกสารอย่างเป็นทางการ: วัตถุการแจ้งเตือนต้องมีสิ่งต่อไปนี้:

  1. ไอคอนขนาดเล็กกำหนดโดยsetSmallIcon ()

  2. ชื่อที่กำหนดโดยsetContentTitle ()

  3. ข้อความรายละเอียดกำหนดโดยsetContentText ()

  4. ใน Android 8.0 (API ระดับ 26) และสูงกว่ารหัสช่องทางการแจ้งเตือนที่ถูกต้องตั้งค่าโดยsetChannelId ()หรือมีให้ในตัวสร้าง NotificationCompat.Builder เมื่อสร้างช่อง

โปรดดูhttp://developer.android.com/guide/topics/ui/notifiers/notifications.html


3
นี่ไม่เป็นความจริง. หากคุณใช้เค้าโครงการแจ้งเตือนแบบกำหนดเองโดยใช้ setContent ไม่จำเป็นต้องมีหัวเรื่องหรือข้อความ
Ray Li

11

สิ่งนี้ทำให้ฉันสะดุดในวันนี้ แต่ฉันรู้ว่าเป็นเพราะในAndroid 9.0 (Pie) โดยค่าเริ่มต้นห้ามรบกวนจะซ่อนการแจ้งเตือนทั้งหมดแทนที่จะปิดเสียงเหมือนในAndroid 8.1 (Oreo) และก่อนหน้า สิ่งนี้ใช้ไม่ได้กับการแจ้งเตือน

ฉันชอบเปิด DND สำหรับอุปกรณ์การพัฒนาของฉันดังนั้นการไปที่การตั้งค่า DND และเปลี่ยนการตั้งค่าเป็นเพียงแค่ปิดเสียงการแจ้งเตือน (แต่ไม่ซ่อน) จึงแก้ไขให้ฉัน


9

การสร้างช่องทางการแจ้งเตือนเป็นสิ่งบังคับสำหรับ Android เวอร์ชันหลังจากAndroid 8.1 (Oreo) เพื่อให้มองเห็นการแจ้งเตือน หากการแจ้งเตือนไม่ปรากฏในแอปของคุณสำหรับ Oreo + Android คุณต้องเรียกใช้ฟังก์ชันต่อไปนี้เมื่อแอปของคุณเริ่มทำงาน -

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

ฉันคิดว่าคุณลืม

addAction(int icon, CharSequence title, PendingIntent intent)

ดูที่นี่: เพิ่มการดำเนินการ


1
วิธีการที่ไม่สามารถใช้ได้กับaddAction() Notification.Builder
slinden77

1
มีอยู่จริง แต่เลิกใช้แล้ว แต่คุณสามารถส่งผ่านActionอินสแตนซ์ที่คุณสามารถสร้างNotification.Action.Builderได้ ปล. ใช้ทางเลือก Compat เสมอ (เช่น NotificationCompat) เนื่องจาก Google มีแนวโน้มที่จะแก้ไขข้อบกพร่องและให้ความเข้ากันได้ดีขึ้นกับพวกเขา
GökhanBarış Aker

หากคุณไม่ต้องการระบุการดำเนินการใด ๆ เพียงใช้.setContentIntent(null)กับตัวสร้าง
GökhanBarış Aker

1

ฉันมีปัญหาเดียวกันกับแอป Android ของฉัน ฉันกำลังลองใช้การแจ้งเตือนและพบว่าการแจ้งเตือนแสดงบนโปรแกรมจำลอง Android ของฉันซึ่งใช้ระบบAndroid 7.0 (Nougat) ในขณะที่มันไม่ได้ทำงานบนโทรศัพท์ของฉันซึ่งมีAndroid 8.1 (Oreo)

หลังจากอ่านเอกสารฉันพบว่า Android มีคุณสมบัติที่เรียกว่าช่องการแจ้งเตือนโดยที่การแจ้งเตือนจะไม่ปรากฏบนอุปกรณ์ Oreo ด้านล่างนี้เป็นลิงค์ไปยังเอกสารทางการของ Android ในช่องทางการแจ้งเตือน


1

deviceTokenสำหรับฉันมันเป็นปัญหากับ โปรดตรวจสอบว่าโทเค็นอุปกรณ์รับและผู้ส่งได้รับการอัปเดตอย่างเหมาะสมในฐานข้อมูลของคุณหรือไม่หรือทุกที่ที่คุณเข้าถึงเพื่อส่งการแจ้งเตือน

ตัวอย่างเช่นใช้สิ่งต่อไปนี้เพื่ออัปเดตโทเค็นอุปกรณ์เมื่อเปิดแอป ดังนั้นจึงจะได้รับการปรับปรุงอย่างถูกต้องเสมอ

// 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) {

                    }
                });
    }
});

นี่deviceTokenประกาศที่ไหน
Peter Mortensen

ทำไมonSuccessว่างจัง
Peter Mortensen

@PeterMortensen .. ในความสำเร็จคุณสามารถทำอะไรก็ได้ที่ตรรกะของคุณอนุญาตเช่นการเริ่มต้นเจตนาใหม่หรือให้ขนมปังปิ้งหรืออยู่ในหน้าเดียวกัน สำหรับการประกาศ deviceToken คุณสามารถประกาศเป็น Private String deviceToken ก่อน onCreate ในเพจของคุณ
DragonFire

(เพื่อให้ความคิดเห็นของตัวเองชัดเจนยิ่งขึ้น: มีสองonSuccessข้อ - ฉันหมายถึงด้านใน (ซึ่งว่างเปล่า))
Peter Mortensen

1

คุณต้องเปลี่ยนไฟล์ build.gradle และเพิ่มเวอร์ชัน Android SDK ที่ใช้แล้ว:

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

สิ่งนี้ได้ผลเหมือนเสน่ห์ในกรณีของฉัน


0

การแจ้งเตือนอาจไม่แสดงหากคุณแสดงการแจ้งเตือนอย่างรวดเร็วทีละรายการหรือยกเลิกการแจ้งเตือนที่มีอยู่แล้วแสดงอีกครั้งทันที (เช่นเรียกใช้การแจ้งเตือนล่วงหน้าเพื่อแจ้งผู้ใช้เกี่ยวกับการเปลี่ยนแปลงในการแจ้งเตือนที่กำลังดำเนินอยู่) ในกรณีเหล่านี้ระบบอาจตัดสินใจเพียงแค่ปิดกั้นการแจ้งเตือนเมื่อรู้สึกว่าผู้ใช้อาจล้นหลาม / เป็นสแปม

โปรดทราบว่าอย่างน้อยในสต็อก Android (ทดสอบด้วย 10) จากภายนอกพฤติกรรมนี้ดูสุ่มเล็กน้อยบางครั้งก็เกิดขึ้นและบางครั้งก็ไม่เกิดขึ้น ฉันเดาว่ามีช่วงเวลาสั้น ๆ ที่คุณไม่ได้รับอนุญาตให้ส่งการแจ้งเตือนมากเกินไป โทรNotificationManager.cancel()แล้วNotificationManager.notify()อาจแล้วบางครั้งทำให้เกิดพฤติกรรมนี้

หากคุณมีตัวเลือกเมื่ออัปเดตการแจ้งเตือนอย่ายกเลิกก่อนหน้านี้ แต่เพียงโทรหาNotificationManager.notify()การแจ้งเตือนที่อัปเดต สิ่งนี้ดูเหมือนจะไม่ก่อให้เกิดการบล็อกดังกล่าวข้างต้นโดยระบบ


-1

หากคุณใช้เวอร์ชัน> = Android 8.1 (Oreo) ขณะใช้ช่องการแจ้งเตือนให้ตั้งค่าความสำคัญเป็นสูง:

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

1
"one version> ="หมายความว่าอย่างไร คุณหมายถึง"ในเวอร์ชัน 8.1 (หรือสูงกว่า)" ? โปรดตอบกลับโดยแก้ไขคำตอบของคุณไม่ใช่ที่นี่ในความคิดเห็น (ตามความเหมาะสม)
Peter Mortensen

@PeterMortensen ให้อภัยฉันเพราะมันเป็นแค่ประเภทขอบคุณสำหรับการแก้ไขฉัน
Faisal Naseer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.