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


183

เครื่องมือสร้างการแจ้งเตือนปกติไม่แสดงการแจ้งเตือนบน Android O

ฉันจะแสดงการแจ้งเตือนบน Android 8 Oreo ได้อย่างไร

มีรหัสใหม่ที่จะเพิ่มสำหรับแสดงการแจ้งเตือนบน Android O หรือไม่


3
ฉันลืมที่จะตั้ง ".setChannelId" เป็น NotificationCompat.Builder และตอนนี้มันทำงานใน oreo (8.0)
varotariya vajsi

ตรวจสอบว่าสิ่งนี้สามารถช่วยfreakyjolly.com/android-useful-methods-and-functions/#3method
รหัส Spy

คำตอบ:


265

ใน Android O ต้องใช้ช่องสัญญาณกับเครื่องมือสร้างการแจ้งเตือนของคุณ

ด้านล่างเป็นรหัสตัวอย่าง:

// Sets an ID for the notification, so it can be updated.
int notifyID = 1; 
String CHANNEL_ID = "my_channel_01";// The id of the channel. 
CharSequence name = getString(R.string.channel_name);// The user-visible name of the channel.
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, importance);
// Create a notification and set the notification channel.
Notification notification = new Notification.Builder(MainActivity.this)
            .setContentTitle("New Message")
            .setContentText("You've received new messages.")
            .setSmallIcon(R.drawable.ic_notify_status)
            .setChannelId(CHANNEL_ID)
            .build();

หรือด้วยการจัดการความเข้ากันได้โดย:

NotificationCompat notification =
        new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setChannelId(CHANNEL_ID).build();



NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 mNotificationManager.createNotificationChannel(mChannel);

// Issue the notification.
mNotificationManager.notify(notifyID , notification);

หรือถ้าคุณต้องการการแก้ไขง่ายๆให้ใช้รหัสต่อไปนี้:

NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
       mNotificationManager.createNotificationChannel(mChannel);
    }

อัปเดต: NotificationCompat.Builder อ้างอิง

NotificationCompat.Builder(Context context)

คอนสตรัคนี้เลิกใช้ใน API ระดับ 26.0.0 ดังนั้นคุณควรใช้

Builder(Context context, String channelId)

ไม่จำเป็นต้องsetChannelIdมี Constructor ใหม่

และคุณควรใช้ไลบรารี AppCompat ล่าสุดในปัจจุบัน 26.0.2

compile "com.android.support:appcompat-v7:26.0.+"

แหล่งที่มาจากAndroid Developers Channel บน Youtube

นอกจากนี้คุณสามารถตรวจสอบเอกสาร Android อย่างเป็นทางการ


4
คุณต้องสร้างช่องก่อนจึงจะสามารถใช้งานได้ ดู developer.android.com/reference/android/app/…
Guillaume Perrot

2
setChannel เลิกใช้งานแล้ว setChannelId
Guillaume Perrot

1
ไม่คุณจะได้รับข้อผิดพลาดหากคุณไม่ได้สร้างช่องอย่างน้อยหนึ่งครั้งในช่วงอายุการติดตั้งแอป
Guillaume Perrot

1
@amorenew เห็นได้ชัดว่าฉันมีชื่อช่องผิด มันใช้งานได้แล้ว ขอบคุณ แต่คำตอบของคุณยังไม่สมบูรณ์ ... คุณต้องสร้างช่องก่อนโดยใช้ mNotificationManager.createNotificationChannel (mChannel); (ฉันทำสิ่งนี้ในคลาสแอปพลิเคชันของฉัน) ... ดู Google เอกสารนี้ อาจเพิ่มลงในคำตอบของคุณ
JPM

2
สิ่งที่อ้างอิง / รุ่นที่ฉันควรจะกำหนดเป้าหมายที่จะได้รับใหม่NotificationCompat.Builder(Context, String)คอนสตรัค? ฉันกำลังใช้ (เหนือสิ่งอื่นใด): - compileSdkVersion 26- buildToolsVersion '26.0.2'- compile 'com.android.support:appcompat-v7:26.0.0-beta2' และถึงกระนั้นก็ยังไม่ยอมรับตัวสร้างของฉันโดยใช้บริบทและสตริง ความคิดใด ๆ
Loisaida Sam Sandberg

93

ที่นี่ฉันโพสต์ฟังก์ชั่นการแก้ปัญหาอย่างรวดเร็วด้วยการจัดการความตั้งใจ

public void showNotification(Context context, String title, String body, Intent intent) {
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

    int notificationId = 1;
    String channelId = "channel-01";
    String channelName = "Channel Name";
    int importance = NotificationManager.IMPORTANCE_HIGH;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        NotificationChannel mChannel = new NotificationChannel(
                channelId, channelName, importance);
        notificationManager.createNotificationChannel(mChannel);
    }

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, channelId)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(body);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addNextIntent(intent);
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(
            0,
            PendingIntent.FLAG_UPDATE_CURRENT
    );
    mBuilder.setContentIntent(resultPendingIntent);

    notificationManager.notify(notificationId, mBuilder.build());
}

กันที่นี่ มีเพียงหนึ่งเดียวที่ทำงาน 4 ฉันสำหรับ FCM และ Android> = 8
YingYang

1
รวดเร็วและง่ายดาย
alfian5229

ขอบคุณมาก. ฉันใช้เวลาหลายชั่วโมงในการแก้ปัญหาว่าทำไมการแจ้งเตือนไม่แสดงขึ้นมา ดังนั้นหากคุณต้องการให้ป๊อปอัปปรากฏขึ้นเพียงตรวจสอบให้แน่ใจว่าคุณได้สร้าง NotificationChannel โดยใช้ NotificationManager สำหรับ Android Oreo +
Joxon

รหัสนี้ง่ายที่สุดในการติดตั้งและเข้าใจแม้กระทั่งจนถึงเดือนธันวาคม 2562 ขอขอบคุณ
Pradeep Dhawan

NotificationManager.notify และ startForeground ใน Android แตกต่างกันอย่างไร
user1090751

76

นอกจากคำตอบนี้คุณต้องสร้างช่องการแจ้งเตือนก่อนจึงจะสามารถใช้งานได้

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

      /* Create or update. */
      NotificationChannel channel = new NotificationChannel("my_channel_01",
          "Channel human readable title", 
          NotificationManager.IMPORTANCE_DEFAULT);
      mNotificationManager.createNotificationChannel(channel);
  }

นอกจากนี้คุณต้องใช้แชเนลเฉพาะเมื่อ targetSdkVersion ของคุณเป็น 26 หรือสูงกว่า

หากคุณใช้ NotificationCompat.Builder คุณต้องอัปเดตเป็นเวอร์ชันเบต้าของไลบรารีการสนับสนุน: https://developer.android.com/topic/lไลบรารี/support-library/revisions.html#26-0-0- beta2 (เพื่อให้สามารถโทรได้setChannelIdใช้ตัวสร้าง compat ได้)

ระวังด้วยการอัพเดทไลบรารี่นี้จะเพิ่ม minSdkLevel เป็น 14


นี่จะเป็นการเตือนหากค่าต่ำสุดของ min api ต่ำกว่า 26 เพิ่ม @TargetApi (26) ก่อนสร้างช่องเพื่อบีบเตือน
s-hunter

หากคุณมีรหัสถ้าชอบในตัวอย่างโค้ดมันจะไม่สร้างคำเตือนการแก้ไขด่วนมีข้อเสนอแนะที่แตกต่างกันหนึ่งในนั้นคือการล้อมรอบโค้ดโดยถ้าตรวจสอบเวอร์ชัน หากคุณปรับการตรวจสอบเวอร์ชั่นว่า Android Studio อาจสับสนและอาจตรวจไม่พบ
Guillaume Perrot

11
public class MyFirebaseMessagingServices extends FirebaseMessagingService {
    private NotificationChannel mChannel;
    private NotificationManager notifManager;
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (remoteMessage.getData().size() > 0) {
            try {
                JSONObject jsonObject = new JSONObject(remoteMessage.getData());
                displayCustomNotificationForOrders(jsonObject.getString("title"), jsonObject.getString("description"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    private void displayCustomNotificationForOrders(String title, String description) {
        if (notifManager == null) {
            notifManager = (NotificationManager) getSystemService
                    (Context.NOTIFICATION_SERVICE);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationCompat.Builder builder;
            Intent intent = new Intent(this, Dashboard.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent;
            int importance = NotificationManager.IMPORTANCE_HIGH;
            if (mChannel == null) {
                mChannel = new NotificationChannel
                        ("0", title, importance);
                mChannel.setDescription(description);
                mChannel.enableVibration(true);
                notifManager.createNotificationChannel(mChannel);
            }
            builder = new NotificationCompat.Builder(this, "0");

            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);
            pendingIntent = PendingIntent.getActivity(this, 1251, intent, PendingIntent.FLAG_ONE_SHOT);
            builder.setContentTitle(title)  
                    .setSmallIcon(getNotificationIcon()) // required
                    .setContentText(description)  // required
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true)
                    .setLargeIcon(BitmapFactory.decodeResource
                            (getResources(), R.mipmap.logo))
                    .setBadgeIconType(R.mipmap.logo)
                    .setContentIntent(pendingIntent)
                    .setSound(RingtoneManager.getDefaultUri
                            (RingtoneManager.TYPE_NOTIFICATION));
            Notification notification = builder.build();
            notifManager.notify(0, notification);
        } else {

            Intent intent = new Intent(this, Dashboard.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = null;

            pendingIntent = PendingIntent.getActivity(this, 1251, intent, PendingIntent.FLAG_ONE_SHOT);

            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                    .setContentTitle(title)
                    .setContentText(description)
                    .setAutoCancel(true)
                    .setColor(ContextCompat.getColor(getBaseContext(), R.color.colorPrimary))
                    .setSound(defaultSoundUri)
                    .setSmallIcon(getNotificationIcon())
                    .setContentIntent(pendingIntent)
                    .setStyle(new NotificationCompat.BigTextStyle().setBigContentTitle(title).bigText(description));

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(1251, notificationBuilder.build());
        }
    }

    private int getNotificationIcon() {
        boolean useWhiteIcon = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP);
        return useWhiteIcon ? R.mipmap.logo : R.mipmap.logo;
    }
}

หากไม่มีการตั้งค่า setChannelId (CHANNEL_ID) บน NotificationCompat.Builder การแจ้งเตือนจะไม่แสดง
Shihab Uddin

7

หากคุณไม่ได้รับการแจ้งเตือนแบบพุชในเวอร์ชัน SDK 26+?

ทางออกของคุณอยู่ที่นี่:

public static void showNotification(Context context, String title, String messageBody) {

        boolean isLoggedIn = SessionManager.getInstance().isLoggedIn();
        Log.e(TAG, "User logged in state: " + isLoggedIn);

        Intent intent = null;
        if (isLoggedIn) {
            //goto notification screen
            intent = new Intent(context, MainActivity.class);
            intent.putExtra(Extras.EXTRA_JUMP_TO, DrawerItems.ITEM_NOTIFICATION);
        } else {
            //goto login screen
            intent = new Intent(context, LandingActivity.class);
        }

        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT);

        //Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        //Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_app_notification_icon);

        String channel_id = createNotificationChannel(context);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channel_id)
                .setContentTitle(title)
                .setContentText(messageBody)
                .setStyle(new NotificationCompat.BigTextStyle().bigText(messageBody))
                /*.setLargeIcon(largeIcon)*/
                .setSmallIcon(R.drawable.app_logo_color) //needs white icon with transparent BG (For all platforms)
                .setColor(ContextCompat.getColor(context, R.color.colorPrimaryDark))
                .setVibrate(new long[]{1000, 1000})
                .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
                .setContentIntent(pendingIntent)
                .setPriority(Notification.PRIORITY_HIGH)
                .setAutoCancel(true);

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify((int) ((new Date(System.currentTimeMillis()).getTime() / 1000L) % Integer.MAX_VALUE) /* ID of notification */, notificationBuilder.build());
    }

public static String createNotificationChannel(Context context) {

        // NotificationChannels are required for Notifications on O (API 26) and above.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            // The id of the channel.
            String channelId = "Channel_id";

            // The user-visible name of the channel.
            CharSequence channelName = "Application_name";
            // The user-visible description of the channel.
            String channelDescription = "Application_name Alert";
            int channelImportance = NotificationManager.IMPORTANCE_DEFAULT;
            boolean channelEnableVibrate = true;
//            int channelLockscreenVisibility = Notification.;

            // Initializes NotificationChannel.
            NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, channelImportance);
            notificationChannel.setDescription(channelDescription);
            notificationChannel.enableVibration(channelEnableVibrate);
//            notificationChannel.setLockscreenVisibility(channelLockscreenVisibility);

            // Adds NotificationChannel to system. Attempting to create an existing notification
            // channel with its original values performs no operation, so it's safe to perform the
            // below sequence.
            NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            assert notificationManager != null;
            notificationManager.createNotificationChannel(notificationChannel);

            return channelId;
        } else {
            // Returns null for pre-O (26) devices.
            return null;
        }
    }

NotificationCompat.Builder notificationBuilder = ใหม่ NotificationCompat.Builder (บริบท, channel_id)

-> ที่นี่คุณจะได้รับการแจ้งเตือนแบบพุชโดยใช้ channel_idในอุปกรณ์ของคุณซึ่งมีเวอร์ชัน SDK มากกว่า 26 เวอร์ชัน

-> เพราะ NotificationCompat.Builder(context)วิธีเลิกใช้แล้วในตอนนี้คุณจะใช้เวอร์ชันที่อัปเดตซึ่งมีพารามิเตอร์สองตัวตัวหนึ่งคือบริบทส่วนอีกตัวคือ channel_id

-> NotificationCompat.Builder(context, channel_id)วิธีการอัพเดท ลองมัน.

-> ในอุปกรณ์เวอร์ชัน 26+ SDK คุณจะสร้าง channel_id ทุกครั้ง


ขอบคุณฉันใช้แบบคงที่ notifcation_id เพื่อแจ้ง
pratham kesarkar

5

ใช้คลาสนี้สำหรับการแจ้งเตือน Android 8

public class NotificationHelper {

private Context mContext;
private NotificationManager mNotificationManager;
private NotificationCompat.Builder mBuilder;
public static final String NOTIFICATION_CHANNEL_ID = "10001";

public NotificationHelper(Context context) {
    mContext = context;
}

/**
 * Create and push the notification 
 */
public void createNotification(String title, String message)
{    
    /**Creates an explicit intent for an Activity in your app**/
    Intent resultIntent = new Intent(mContext , SomeOtherActivity.class);
    resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent resultPendingIntent = PendingIntent.getActivity(mContext,
            0 /* Request code */, resultIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    mBuilder = new NotificationCompat.Builder(mContext);
    mBuilder.setSmallIcon(R.mipmap.ic_launcher);
    mBuilder.setContentTitle(title)
            .setContentText(message)
            .setAutoCancel(false)
            .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
            .setContentIntent(resultPendingIntent);

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

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
    {
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
        notificationChannel.enableLights(true);
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.enableVibration(true);
        notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
        assert mNotificationManager != null;
        mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
        mNotificationManager.createNotificationChannel(notificationChannel);
    }
    assert mNotificationManager != null;
    mNotificationManager.notify(0 /* Request Code */, mBuilder.build());
  }
}

4

ลองใช้รหัสนี้:

public class FirebaseMessagingServices extends com.google.firebase.messaging.FirebaseMessagingService {
    private static final String TAG = "MY Channel";
    Bitmap bitmap;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Utility.printMessage(remoteMessage.getNotification().getBody());

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());

            String title = remoteMessage.getData().get("title");
            String body = remoteMessage.getData().get("body");
            String message = remoteMessage.getData().get("message");
            String imageUri = remoteMessage.getData().get("image");
            String msg_id = remoteMessage.getData().get("msg-id");
          

            Log.d(TAG, "1: " + title);
            Log.d(TAG, "2: " + body);
            Log.d(TAG, "3: " + message);
            Log.d(TAG, "4: " + imageUri);
          

            if (imageUri != null)
                bitmap = getBitmapfromUrl(imageUri);

            }

            sendNotification(message, bitmap, title, msg_id);
                    
        }


    }

    private void sendNotification(String message, Bitmap image, String title,String msg_id) {
        int notifyID = 0;
        try {
            notifyID = Integer.parseInt(msg_id);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }

        String CHANNEL_ID = "my_channel_01";            // The id of the channel.
        Intent intent = new Intent(this, HomeActivity.class);
        intent.putExtra("title", title);
        intent.putExtra("message", message);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "01")
                .setContentTitle(title)
                .setSmallIcon(R.mipmap.ic_notification)
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText(message))
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setChannelId(CHANNEL_ID)
                .setContentIntent(pendingIntent);

        if (image != null) {
            notificationBuilder.setStyle(new NotificationCompat.BigPictureStyle()   //Set the Image in Big picture Style with text.
                    .bigPicture(image)
                    .setSummaryText(message)
                    .bigLargeIcon(null));
        }


        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {       // For Oreo and greater than it, we required Notification Channel.
           CharSequence name = "My New Channel";                   // The user-visible name of the channel.
            int importance = NotificationManager.IMPORTANCE_HIGH;

            NotificationChannel channel = new NotificationChannel(CHANNEL_ID,name, importance); //Create Notification Channel
            notificationManager.createNotificationChannel(channel);
        }

        notificationManager.notify(notifyID /* ID of notification */, notificationBuilder.build());
    }

    public Bitmap getBitmapfromUrl(String imageUrl) {     //This method returns the Bitmap from Url;
        try {
            URL url = new URL(imageUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(input);
            return bitmap;

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;

        }

    }

}


ฉันใช้รหัสนี้ แต่การแจ้งเตือนที่รักด้วยรูปภาพไม่ปรากฏเมื่อแอปในพื้นหลังคุณมีวิธีแก้ไขปัญหาใด ๆ โปรดช่วยด้วย
Mohsin Khan

มันขึ้นอยู่กับปัจจัยบางอย่างเช่น: - 1. คุณเชื่อมต่อกับเครือข่าย .. ??? 2. ภาพ URL ที่เหมาะสม (เช็ค imageurl โดยการกดปุ่ม imageurl บนเบราว์เซอร์)
Rohit Mhatre

3

แอพสาธิตการแจ้งเตือน Android สำหรับ Android O รวมถึงเวอร์ชัน API ที่ต่ำกว่า นี่คือ app ตัวอย่างที่ดีที่สุดบนGitHub-สาธิต 1และGitHub-สาธิต 2

ป้อนคำอธิบายรูปภาพที่นี่


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

2

นี่เป็นข้อผิดพลาดใน firebase api เวอร์ชัน 11.8.0 ดังนั้นหากคุณลดเวอร์ชัน API คุณจะไม่ประสบปัญหานี้


ที่จริงฉันตรวจสอบแล้ว หากคุณกำลังทำงานกับ Android emulator - ตรวจสอบแอปของคุณบนอุปกรณ์จริง ใหม่อีมูเลเตอร์อย่างใดจะไม่แสดงการแจ้งเตือน
เดดฟิช

ไม่จริงแล้วนี่เป็นข้อผิดพลาดใน firebase เวอร์ชัน 11.8.0 และตอนนี้มันได้รับการแก้ไขในเวอร์ชั่นใหม่กว่า 12.0.0 สำหรับการอ้างอิงคุณสามารถดูบันทึกประจำรุ่นอย่างเป็นทางการ: firebase.google.com/support/release-notes/android
M.Noman

2

ฉันมีปัญหาเดียวกันกับ Oreo และค้นพบว่าหากคุณสร้างช่องของคุณเป็นครั้งแรกด้วย NotificationManager.IMPORTANCE_NONE จากนั้นอัปเดตในภายหลังช่องจะยังคงอยู่ในระดับความสำคัญดั้งเดิม

สิ่งนี้ได้รับการสำรองข้อมูลโดยเอกสารการฝึกอบรมของ Google Notificationซึ่งระบุว่า:

หลังจากที่คุณสร้างแชแนลการแจ้งเตือนคุณไม่สามารถเปลี่ยนพฤติกรรมการแจ้งเตือน - ผู้ใช้มีการควบคุมที่สมบูรณ์ ณ จุดนั้น

การลบและติดตั้งแอพใหม่จะทำให้คุณสามารถรีเซ็ตลักษณะการทำงานของช่องได้

ที่ดีที่สุดที่จะหลีกเลี่ยงการใช้ IMPORTANCE_NONE ยกเว้นว่าคุณต้องการระงับการแจ้งเตือนสำหรับช่องนั้นคือใช้การแจ้งเตือนแบบเงียบ


1

นี่คือวิธีที่คุณทำ

private fun sendNotification() {
    val notificationId = 100
    val chanelid = "chanelid"
    val intent = Intent(this, MainActivity::class.java)
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
    val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // you must create a notification channel for API 26 and Above
        val name = "my channel"
        val description = "channel description"
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val channel = NotificationChannel(chanelid, name, importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviors after this
        val notificationManager = getSystemService(NotificationManager::class.java)
        notificationManager.createNotificationChannel(channel)
    }

    val mBuilder = NotificationCompat.Builder(this, chanelid)
            .setSmallIcon(R.drawable.ic_notification)
            .setContentTitle("Want to Open My App?")
            .setContentText("Open my app and see good things")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true) // cancel the notification when clicked
            .addAction(R.drawable.ic_check, "YES", pendingIntent) //add a btn to the Notification with a corresponding intent

    val notificationManager = NotificationManagerCompat.from(this);
    notificationManager.notify(notificationId, mBuilder.build());
}

อ่านบทแนะนำแบบเต็มได้ที่ => https://developer.android.com/training/notify-user/build-notification


1

CHANNEL_IDในNotificationChannelและNotification.Builderต้องเหมือนกันลองใช้รหัสนี้:

String CHANNEL_ID = "my_channel_01";
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "Solveta Unread", NotificationManager.IMPORTANCE_DEFAULT);


Notification.Builder notification = new Notification.Builder(getApplicationContext(), CHANNEL_ID);

1

ในกรณีของฉันฉันมี Android 8.1.0และหมายเลขรุ่นvivo1811และฉันได้ลองด้วยวิธีแก้ไขทั้งหมดข้างต้นแล้ว แต่ไม่มีอะไรทำงาน

ดังนั้นในที่สุดฉันได้เขียนไปยัง Firebase Support แล้วในการแก้จุดบกพร่องเพิ่มเติมฉันได้รับนี้ - "ล้มเหลวในการออกอากาศไปยังแอปหยุด": ตรวจสอบให้แน่ใจว่าแอปไม่ได้ถูกบังคับให้หยุด "ตรวจสอบแอปที่ไม่ได้รับแรงหยุด'

และนี่คือคำตอบจากทีม Firebase ->

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

นี่ OEM ย่อมาจากผู้ผลิตอุปกรณ์ดั้งเดิม


0

สำหรับทุกคนที่ดิ้นรนกับสิ่งนี้หลังจากลองใช้วิธีแก้ไขปัญหาด้านบนตรวจสอบให้แน่ใจว่ารหัสช่องที่ใช้เมื่อสร้างช่องการแจ้งเตือนนั้นเหมือนกับรหัสช่องที่คุณตั้งค่าในเครื่องมือสร้างการแจ้งเตือน

const val CHANNEL_ID = "EXAMPLE_CHANNEL_ID"

// create notification channel
val notificationChannel = NotificationChannel(CHANNEL_ID, 
NOTIFICATION_NAME, NotificationManager.IMPORTANCE_HIGH)

// building notification
NotificationCompat.Builder(context)
                    .setSmallIcon(android.R.drawable.ic_input_add)
                    .setContentTitle("Title")
                    .setContentText("Subtitle")   
                    .setPriority(NotificationCompat.PRIORITY_MAX)
                    .setChannelId(CHANNEL_ID)

0
private void addNotification() {
                NotificationCompat.Builder builder =
                new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setContentTitle("Notifications Example")
                .setContentText("This is a test notification");
                Intent notificationIntent = new Intent(this, MainActivity.class);
                PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
                builder.setContentIntent(contentIntent);
                // Add as notification
                NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
                {
                NotificationChannel nChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", NotificationManager.IMPORTANCE_HIGH);
                nChannel.enableLights(true);
                assert manager != null;
                builder.setChannelId(NOTIFICATION_CHANNEL_ID);
                manager.createNotificationChannel(nChannel);
                }
                assert manager != null;
                manager.notify(0, builder.build());
    }

0

วิธีการต่อไปนี้จะแสดงการแจ้งเตือนโดยมีข้อความขนาดใหญ่และเปิดใช้งานการแช่แข็ง (การแจ้งเตือนจะไม่ถูกลบแม้หลังจากที่ผู้ใช้ swipes) เราต้องการบริการ NotificationManager

public static void showNotificationOngoing(Context context,String title) {
        NotificationManager notificationManager =
                (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);

        PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);

        Notification.Builder notificationBuilder = new Notification.Builder(context)
                .setContentTitle(title + DateFormat.getDateTimeInstance().format(new Date()) + ":" + accuracy)
                .setContentText(addressFragments.toString())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(contentIntent)
                .setOngoing(true)
                .setStyle(new Notification.BigTextStyle().bigText(addressFragments.toString()))
                .setAutoCancel(true);
        notificationManager.notify(3, notificationBuilder.build());
}

วิธีการลบการแจ้งเตือน

public static void removeNotification(Context context){
    NotificationManager notificationManager =
            (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
    notificationManager.cancelAll();
}

ลิงค์ที่มา


0
NotificationCompat.Builder(Context context)

เลิกใช้แล้วสำหรับรุ่นที่มากกว่าหรือเท่ากับ Android โอรีโอ คุณสามารถเปลี่ยนการใช้เป็นการใช้

NotificationCompat.Builder(Context context, String channelId)

0
fun pushNotification(message: String?, clickAtion: String?) {
        val ii = Intent(clickAtion)
        ii.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        val pendingIntent = PendingIntent.getActivity(this, REQUEST_CODE, ii, PendingIntent.FLAG_ONE_SHOT)

        val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

        val largIcon = BitmapFactory.decodeResource(applicationContext.resources,
                R.mipmap.ic_launcher)


        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        val channelId = "default_channel_id"
        val channelDescription = "Default Channel"
// Since android Oreo notification channel is needed.
//Check if notification channel exists and if not create one
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            var notificationChannel = notificationManager.getNotificationChannel(channelId)
            if (notificationChannel != null) {
                val importance = NotificationManager.IMPORTANCE_HIGH //Set the importance level
                notificationChannel = NotificationChannel(channelId, channelDescription, importance)
               // notificationChannel.lightColor = Color.GREEN //Set if it is necesssary
                notificationChannel.enableVibration(true) //Set if it is necesssary
                notificationManager.createNotificationChannel(notificationChannel)


                val noti_builder = NotificationCompat.Builder(this)
                        .setContentTitle("MMH")
                        .setContentText(message)
                        .setSmallIcon(R.drawable.ic_launcher_background)
                        .setChannelId(channelId)
                        .build()
                val random = Random()
                val id = random.nextInt()
                notificationManager.notify(id,noti_builder)

            }

        }
        else
        {
            val notificationBuilder = NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher).setColor(resources.getColor(R.color.colorPrimary))
                    .setVibrate(longArrayOf(200, 200, 0, 0, 0))
                    .setContentTitle(getString(R.string.app_name))

                    .setLargeIcon(largIcon)
                    .setContentText(message)
                    .setAutoCancel(true)
                    .setStyle(NotificationCompat.BigTextStyle().bigText(message))
                    .setSound(soundUri)
                    .setContentIntent(pendingIntent)


            val random = Random()
            val id = random.nextInt()
            notificationManager.notify(id, notificationBuilder.build())

        }



    }

1
แม้ว่าข้อมูลโค้ดนี้อาจช่วยแก้ปัญหาได้ แต่ก็ไม่ได้อธิบายว่าทำไมหรือตอบคำถามอย่างไร กรุณาระบุคำอธิบายสำหรับรหัสของคุณเนื่องจากช่วยปรับปรุงคุณภาพการโพสต์ของคุณได้อย่างแท้จริง จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ คุณสามารถใช้ปุ่มแก้ไขเพื่อปรับปรุงคำตอบนี้เพื่อรับคะแนนโหวตและชื่อเสียงมากขึ้น!
Brian Tompsett - 莱恩莱恩

0

โค้ดด้านล่างนี้ใช้ได้กับฉันใน Oreo คุณสามารถลองได้ หวังว่ามันจะทำงานให้คุณ

โมฆะส่วนตัว sendNotification (บริบท ctx, ชื่อสตริง, การแจ้งเตือน int หมายเลข, ข้อความสตริง, ข้อความสตริงย่อย, เจตนาเจตนา) {
ลอง {

            PendingIntent pendingIntent = PendingIntent.getActivity(ctx, notificationNumber, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            Uri url = null;           
            NotificationCompat.Builder notificationBuilder = null;
            try {
                if (Build.VERSION.SDK_INT >= 26) {

                    try{
                        NotificationManager notificationManager = (NotificationManager)getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
                        notificationManager.deleteNotificationChannel(CHANNEL_ID_1);
                        notificationManager.deleteNotificationChannel(CHANNEL_ID_2);

                        if(!intent.getStringExtra("type").equalsIgnoreCase(""+TYPE_REQUEST)){
                            NotificationChannel breaking = new NotificationChannel(CHANNEL_ID_1, CHANNEL_ID_1_NAME, NotificationManager.IMPORTANCE_HIGH);
                            breaking.setShowBadge(false);
                            breaking.enableLights(true);
                            breaking.enableVibration(true);
                            breaking.setLightColor(Color.WHITE);
                            breaking.setVibrationPattern(new long[]{100, 200, 100, 200, 100, 200, 100});
                            breaking.setSound(url,new AudioAttributes.Builder().build());

                            notificationBuilder = new NotificationCompat.Builder(this,CHANNEL_ID_1)
                                    .setSmallIcon(R.mipmap.ic_launcher);
                            notificationManager.createNotificationChannel(breaking);

                        }else{

                            NotificationChannel politics = new NotificationChannel(CHANNEL_ID_2,CHANNEL_ID_2_NAME, NotificationManager.IMPORTANCE_DEFAULT);
                            politics.setShowBadge(false);
                            politics.enableLights(true);
                            politics.enableVibration(true);
                            politics.setLightColor(Color.BLUE);
                            politics.setVibrationPattern(new long[]{100, 200, 100, 200, 100});
                            politics.setSound(url,new AudioAttributes.Builder().build());

                            notificationBuilder = new NotificationCompat.Builder(this,CHANNEL_ID_2)
                                    .setSmallIcon(R.mipmap.ic_launcher);
                            notificationManager.createNotificationChannel(politics);
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    }

                } else {
                    notificationBuilder = new NotificationCompat.Builder(ctx)
                            .setSmallIcon(R.mipmap.ic_launcher);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            if (notificationBuilder == null) {
                notificationBuilder = new NotificationCompat.Builder(ctx)
                        .setSmallIcon(R.mipmap.ic_launcher);
            }


            notificationBuilder.setContentTitle(title);          
            notificationBuilder.setSubText(subtext);
            notificationBuilder.setAutoCancel(true);

            notificationBuilder.setContentIntent(pendingIntent);
            notificationBuilder.setNumber(notificationNumber);
            NotificationManager notificationManager =
                    (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);

            notificationManager.notify(notificationNumber, notificationBuilder.build());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

0

ใน android Oreo แอปการแจ้งเตือนจะกระทำโดยใช้แชนเนลและคลาส NotificationHelper ซึ่งควรมี ID ช่องและชื่อช่อง

ก่อนอื่นคุณต้องสร้างคลาส NotificationHelper

public class NotificationHelper extends ContextWrapper {

private static final String EDMT_CHANNEL_ID="com.example.safna.notifier1.EDMTDEV";
private static final String EDMT_CHANNEL_NAME="EDMTDEV Channel";
private NotificationManager manager;

public  NotificationHelper(Context base)
{
    super(base);
    createChannels();
}
private void createChannels()
{
    NotificationChannel edmtChannel=new NotificationChannel(EDMT_CHANNEL_ID,EDMT_CHANNEL_NAME,NotificationManager.IMPORTANCE_DEFAULT);
    edmtChannel.enableLights(true);
    edmtChannel.enableVibration(true);
    edmtChannel.setLightColor(Color.GREEN);
    edmtChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);

    getManager().createNotificationChannel(edmtChannel);

}
public NotificationManager getManager()
{
   if (manager==null)
       manager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
   return manager;

}
public NotificationCompat.Builder getEDMTChannelNotification(String title,String body)
{
    return new NotificationCompat.Builder(getApplicationContext(),EDMT_CHANNEL_ID)
            .setContentText(body)
            .setContentTitle(title)
            .setSmallIcon(R.mipmap.ic_launcher_round)
            .setAutoCancel(true);
    }
}

สร้างปุ่มในไฟล์กิจกรรม xml จากนั้นในกิจกรรมหลัก

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    helper=new NotificationHelper(this);

    btnSend=(Button)findViewById(R.id.btnSend);

    btnSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String title="Title";
            String content="Content";
            Notification.Builder builder=helper.getEDMTChannelNotification(title,content);
            helper.getManager().notify(new Random().nextInt(),builder.build());
        }
    });

}

จากนั้นเรียกใช้โครงการของคุณ


0

คุณต้องสร้างแชนเนลการแจ้งเตือนสำหรับระดับ API ที่สูงกว่า 26 (oreo)

`NotificationChannel channel = new NotificationChannel(STRING_ID,CHANNEL_NAME,NotificationManager.IMPORTANCE_HIGH);

STRING_ID = การแจ้งเตือนสตริง channelid เหมือนกับใน Notification.Builder เช่นนี้

`Notification notification = new Notification.Builder(this,STRING_ID)
            .setSmallIcon(android.R.drawable.ic_menu_help)
            .setContentTitle("Hello Notification")
            .setContentText("It is Working")
            .setContentIntent(pendingIntent)
            .build();`

รหัสช่องในการแจ้งเตือนและในการแจ้งเตือนควรเป็นรหัสเดียวกันทั้งหมดเช่นนี้ .. `

@RequiresApi(api = Build.VERSION_CODES.O)
  private void callNotification2() {

    Intent intent = new Intent(getApplicationContext(),MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this,11, 
    intent,PendingIntent.FLAG_UPDATE_CURRENT);
    Notification notification = new Notification.Builder(this,"22")
            .setSmallIcon(android.R.drawable.ic_menu_help)
            .setContentTitle("Hello Notification")
            .setContentText("It is Working")
            .setContentIntent(pendingIntent)
            .build();
    NotificationChannel channel = new 
    NotificationChannel("22","newName",NotificationManager.IMPORTANCE_HIGH);
    NotificationManager manager = (NotificationManager) 
    getSystemService(NOTIFICATION_SERVICE);
    manager.createNotificationChannel(channel);
    manager.notify(11,notification);

    }'

0

ก่อนอื่นถ้าคุณไม่รู้จาก Android Oreo เช่น API ระดับ 26 เป็นภาคบังคับที่การแจ้งเตือนจะถูก resgitered ด้วยช่อง

ในกรณีนั้นบทเรียนจำนวนมากอาจทำให้คุณสับสนเพราะพวกเขาแสดงตัวอย่างที่แตกต่างกันสำหรับการแจ้งเตือนด้านบน oreo และด้านล่าง

ดังนั้นนี่คือรหัสทั่วไปที่ทำงานทั้งบนและล่าง oreo:

String CHANNEL_ID = "MESSAGE";
String CHANNEL_NAME = "MESSAGE";

NotificationManagerCompat manager = NotificationManagerCompat.from(MainActivity.this);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME,
    NotificationManager.IMPORTANCE_DEFAULT);
    manager.createNotificationChannel(channel);
}

Notification notification = new NotificationCompat.Builder(MainActivity.this,CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_android_black_24dp)
        .setContentTitle(TitleTB.getText().toString())
        .setContentText(MessageTB.getText().toString())
        .build();
manager.notify(getRandomNumber(), notification); // In case you pass a number instead of getRandoNumber() then the new notification will override old one and you wont have more then one notification so to do so u need to pass unique number every time so here is how we can do it by "getRandoNumber()"
private static int getRandomNumber() {
    Date dd= new Date();
    SimpleDateFormat ft =new SimpleDateFormat ("mmssSS");
    String s=ft.format(dd);
    return Integer.parseInt(s);
}

วิดีโอสอน: วิดีโอ YOUTUBE

ในกรณีที่คุณต้องการดาวน์โหลดตัวอย่างนี้: GitHub Link


-1
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "CHANNEL_ID")
            ........

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

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = "Hello";// The user-visible name of the channel.
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, importance);
        mNotificationManager.createNotificationChannel(mChannel);
    }
    mNotificationManager.notify(notificationId, notificationBuilder.build());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.