Android bildirimi gösterilmiyor


115

Android'e bildirim ekleyecek bir programa ihtiyacım var. Ve birisi bildirimi tıkladığında, bu onları ikinci faaliyetime yönlendirmelidir.

Kodu oluşturdum. Bildirim çalışıyor olmalı, ancak nedense çalışmıyor. NotificationHiç gösterilmiyor. Ne kaçırdığımı bilmiyorum.

Bu dosyaların kodu:

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

lütfen soru sorarken daha kısa ve öz olmaya çalışın. Neyin işe yaramadığını söylemekte başarısız oluyorsun . Aslında, bir şeyin işe yaramadığından bahsetmiyorsunuz bile. Is Activitybaşlatılmaktadır olmasın? Mı Notificationgösterilmiyor?
slinden77

3
@ dmmh sorumda sorunum ne dedim! Ve soruyla ilgili yanlış bir şey bulamadım. Sorum problem hakkında spesifikti. Uzman değilseniz dürtmeye gerek yok! Ve tato469'un cevabı iyiydi.
Choudhury AM

3
Bu sitenin amacının sizin problemlerinizi çözmeniz değil, başkalarının da problemlere çözüm bulabilmesi olduğunu belirtiyorum. Ben alay etmiyorum. Duygularınızı incittiğim için üzgünüm ama gerçek şu ki, sorunuz yanlıştı, cevap yanlıştı ve tüm bu yanıltıcı bilgiler, sizin tarif ettiğiniz sorunla aynı sorunu yaşayan, işe yaramayan çözümleri denemeye başvuran diğer acemi programcılara yol açacak Sağladığınız koda göre. Uzman olsam da olmasam da önemli değil. Özellikle haklı olduğum için, sorunuz belirsiz, diğer cevap yanlış.
slinden77

Yanıltıcı olduğu için bu soruyu ve cevabı kaldırmanızı isteyeceğim. İyi günler.
slinden77

1
soruyu değiştirdi, böylece insanlar sorunun ne olduğunu anlayabilsin.
Choudhury AM

Yanıtlar:


412

Kod bir simge olmadan çalışmaz. Öyleyse, setSmallIconçalışması için oluşturucu zincirine çağrıyı şu şekilde ekleyin :

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) ve üzeri

Android 8, channelIdbir 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 nasıl alınır? lütfen yardım
Ananta Prasad

@LAnantaPrasad CHANNEL_ID sizin için bir tanımlayıcıdır. Sohbet sohbeti veya grup sohbeti gibi, bildirimleri gruplama yönteminizdir.
Casey Daniel

Teşekkürler, setChannelIdgereklidir. Bunu eklemeden önce, SONY cihazımda bildirim gösteriliyor, ancak SAMSUNG cihazımda gösterilmiyor.
Wesely


2
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }Bu kontrol olmadan, cihaz API'niz> = 26 olsa bile bildirim görünmeyeceğinden kontrolü de ekleyin .
Koushik Shom Choudhury

58

Aslında ƒernando Valle'nin cevabı doğru görünmüyor. Sonra tekrar soruyorsunuz, çünkü neyin yanlış olduğunu veya neyin işe yaramadığını söylemekte başarısız oluyorsunuz.

Kodunuza baktığımda Notificationbasitçe görünmediğini varsayıyorum .

Bir simge sağlamadığınız için bildiriminiz gösterilmiyor. SDK dokümantasyonu bunun gerekli olduğundan bahsetmese de, aslında çok fazla ve Notificationbir tane olmadan gösterilmeyeceksiniz.

addActionyalnızca 4.1'den beri mevcuttur. Bundan önce, PendingIntentbir Activity. Görünüşe göre a belirtiyorsunuz PendingIntent, bu nedenle sorununuz başka bir yerde. Mantıksal olarak, bunun eksik simge olduğu sonucuna varılmalıdır.


bu sorunu buldum. Doğru cevap için teşekkürler. Yardımın için sağol.
Choudhury AM

1
AddAction'ın sadece 4.1'den beri mevcut olduğunu söylediniz ama yanlış, 2.3'te kullandım. Başvuru kılavuzu, bildirimden değil düğmeden bahsediyor: "İşlem düğmeleri Android 4.1'den önceki platformlarda görünmeyecek." Burada kontrol edebilirsiniz: AddAction android.support.v4.app dahildir
ƒernando Valle

1
OP önerdiğiniz gibi Notification.Builderdeğil kullanıyor NotificationCompat.Builder. Bir uyumluluk kitaplığının olması ve kullanılabilmesi, işlevin normal API'de mevcut olduğu anlamına gelmez. Sağladığınız bağlantı aslında bunu şart koşuyor. Notification.BuilderÖrnekte görüldüğü gibi, bu soru açıkça ile ilgilidir . Ve uyumluluk kitaplığı muhtemelen bu işlevi yalnızca 4.1 kullanılabilir olduktan sonra içeriyordu. Cevabınız yanıltıcı çünkü şimdi 2.3'ten beri mevcut olduğunu söylüyorsunuz.
slinden77

Yanlış
söylediysem

4
Simgeyi Argh !! Eksik olduğunu bile anlamadım ama eklenmesi sorunu çözdü. Konsolda eksik bir simge hakkında yararlı bir şey görmedim, sessizce başarısız görünüyor.
Pete

33

Küçük simgeyi kaçırıyordunuz. Ben de aynı hatayı yaptım ve yukarıdaki adım onu ​​çözdü.

Resmi belgelere göre: Bir Bildirim nesnesi aşağıdakileri içermelidir:

  1. SetSmallIcon () tarafından ayarlanan küçük bir simge

  2. SetContentTitle () tarafından ayarlanan bir başlık

  3. SetContentText () tarafından ayarlanan detay metni

  4. Android 8.0 (API seviyesi 26) ve üzerinde , setChannelId () tarafından ayarlanan veya bir kanal oluştururken NotificationCompat.Builder yapıcısında sağlanan geçerli bir bildirim kanalı kimliği .

Bkz. Http://developer.android.com/guide/topics/ui/notifiers/notifications.html


3
Bu doğru değil. SetContent kullanarak özel bir bildirim düzeni kullanırsanız, başlık veya metin gerekmez.
Ray Li

11

Bu bugün beni şaşırttı, ancak fark ettim çünkü Android 9.0'da (Pie) Rahatsız Etmeyin , yalnızca Android 8.1 (Oreo) ve önceki gibi tüm bildirimleri susturmak yerine tüm bildirimleri gizler . Bu, bildirimler için geçerli değildir.

Geliştirme cihazım için DND'nin açık olmasını seviyorum, bu nedenle DND ayarlarına girmek ve ayarları yalnızca bildirimleri susturmak (ancak onları gizlememek) için değiştirmek benim için sorunu çözdü.


9

Bildirim kanallarının oluşturulması, Android 8.1 (Oreo) 'dan sonraki Android sürümlerinde bildirimlerin görünür hale getirilmesi için zorunludur . Oreo + Android'ler için uygulamanızda bildirimler görünmüyorsa, uygulamanız başladığında aşağıdaki işlevi aramanız gerekir -

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

Unuttuğunu düşünüyorum

addAction(int icon, CharSequence title, PendingIntent intent)

Buraya bakın: Eylem Ekle


1
yöntem addAction()üzerinde mevcut değil Notification.Builder.
slinden77

1
Var, ancak kullanımdan kaldırıldı. Bunun yerine, Actionoluşturabileceğiniz bir örneği iletebilirsiniz Notification.Action.Builder. Not: Google, hataları düzeltme ve onlarla daha iyi uyumluluk sağlama eğiliminde olduğundan, Her zaman Uyumluluk alternatifini kullanın (yani, NotificationCompat)
Gökhan Barış Aker

Herhangi bir eylem belirtmek istemiyorsanız, sadece .setContentIntent(null)oluşturucu ile kullanın .
Gökhan Barış Aker

1

Android uygulamamla aynı sorunu yaşadım. Bildirimleri deniyordum ve Android 7.0 (Nougat) sistemi çalıştıran Android emülatörümde bildirimlerin gösterildiğini , ancak Android 8.1 (Oreo) bulunan telefonumda çalışmadığını fark ettim .

Belgeleri okuduktan sonra, Android'in bildirim kanalı adı verilen bir özelliğe sahip olduğunu ve Oreo cihazlarında bildirimlerin görünmediğini öğrendim. Bildirim kanallarındaki resmi Android belgelerine bağlantı aşağıdadır.


1

Benim için bir sorundu deviceToken. Lütfen bildirim göndermek için alıcı ve gönderen cihaz jetonunun veritabanınızda veya eriştiğiniz her yerde doğru şekilde güncellenip güncellenmediğini kontrol edin.

Örneğin, uygulama başlatıldığında cihaz jetonunu güncellemek için aşağıdakileri kullanın. Bu nedenle her zaman doğru şekilde güncellenecektir.

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

                    }
                });
    }
});

Bu nerede deviceTokenilan edilir?
Peter Mortensen

Neden onSuccessboş?
Peter Mortensen

@PeterMortensen .. başarı üzerine yeni bir niyet başlatmak, kadeh kaldırmak veya aynı sayfada kalmak gibi mantığınızın izin verdiği her şeyi yapabilirsiniz. DeviceToken bildirimine gelince, bunu Sayfanızda onCreate'den önce Özel String deviceToken olarak ilan edebilirsiniz
DragonFire

(Kendi yorumumu daha açık hale getirmek için: İki tane var onSuccess- iç olanı kastediyordum (ki bu boş))
Peter Mortensen

1

Ayrıca build.gradle dosyasını değiştirmeniz ve kullanılmış Android SDK sürümünü buna eklemeniz gerekir:

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

Bu benim durumumda bir cazibe gibi çalıştı.


0

Bildirimleri art arda hızlı bir şekilde gösterirseniz veya mevcut bir bildirimi iptal ederseniz ve ardından hemen tekrar gösterirseniz (örneğin, kullanıcıyı devam eden bir bildirimdeki bir değişiklik hakkında bilgilendirmek için bir uyarı bildirimini tetiklemek için) bildirimler gösterilmeyebilir. Bu durumlarda sistem olabilir bu onların da kullanıcı için ezici / spam hale gelebilir hissettiğinde hemen bildirimini engellemek karar verirler.

Lütfen unutmayın, en azından stok Android'de (10 ile test edilmiştir) dışarıdan bu davranış biraz rastgele görünüyor: sadece bazen oluyor ve bazen olmuyor. Tahminim, çok fazla bildirim göndermenize izin verilmeyen çok kısa bir zaman eşiği var. Arama NotificationManager.cancel()ve sonra NotificationManager.notify()bazen bu davranışa neden olabilir.

Seçeneğiniz varsa, bir bildirimi güncellerken daha önce iptal etmeyin, sadece NotificationManager.notify()güncellenmiş bildirimle arayın . Bu, sistem tarafından yukarıda belirtilen engellemeyi tetiklemiyor gibi görünüyor.


-1

Bir Bildirim kanalı kullanırken > = Android 8.1 (Oreo) sürümündeyseniz , önemini yüksek olarak ayarlayın:

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

1
"Tek sürüm> =" ile neyi kastediyorsunuz ? "8.1 (veya üzeri) sürümünde" mi demek istiyorsunuz ? Lütfen yanıtınızı burada yorumlarda değil (uygun şekilde) düzenleyerek yanıtlayın .
Peter Mortensen

@PeterMortensen, beni düzelttiğin için özür dilerim
Faisal Naseer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.