Я уже создаю канал уведомлений, но все еще низкая вероятность сбоя в Android 8.1.0. Плохое уведомление для startForeground

Я уже создал канал уведомлений, но все еще сбой в Android 8.1.0. Плохое уведомление для startForeground: java.lang.RuntimeException: недопустимый канал для служебного уведомления.

private void startForeground() {
    Log.d("mqttservice", "mqttservice startForeground");
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
        Log.i("MqttService", " startForeground,  channelId == XP, channelName == XPMotors");
        try {
            final String channelId = "XP";
            String channelName = "XPMotors";
            NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
            channel.setShowBadge(false);
            NotificationManager manager = (NotificationManager) MqttService.this.getSystemService(Context.NOTIFICATION_SERVICE);
            if (manager != null) {
                manager.createNotificationChannel(channel);
                NotificationChannel c = manager.getNotificationChannel("XP");
                //create失败时再次创建
                if (c == null) {
                    manager.createNotificationChannel(channel);
                }else{
                }
                c = manager.getNotificationChannel("XP");
                if (c != null) {
                    Notification notification = new NotificationCompat.Builder(MqttService.this, channelId)
                            .setContentTitle("小鹏汽车")
                            .setContentText("正在运行中")
                            .setSmallIcon(R.mipmap.app_icon)
                            .setPriority(NotificationManager.IMPORTANCE_DEFAULT)
                            .setCategory(Notification.CATEGORY_SERVICE)
                            .build();
                    startForeground(100, notification);
                } else {//走这里的话 可能会anr
                    Log.d("mqttservice", "mqttservice stopself");
                }
            }
        } catch (Throwable e) {
            Log.e("MqttService", " Exception == " + e.toString());
        }
    }
}

Пожалуйста, не публикуйте снимки экрана с кодом, XML или выводом logcat. Пожалуйста, разместите весь текст как текст.

Mike M. 02.11.2018 07:26
stackoverflow.com/questions/47531742/…
AskNilesh 02.11.2018 07:27

@NileshRathod Я вижу исходный код 8.1.0, если я установил targetSdkVersion как 27. Он все еще вылетает с очень низкой вероятностью, хотя я создаю канал уведомлений

linguokun 02.11.2018 08:02
0
3
376
2

Ответы 2

// I will delete notification channel after 3 seconds
private void removeNotification() {
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Log.e("MqttService", " removeNotification 执行 ");
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
                try {
                    NotificationManager manager = (NotificationManager) MqttService.this.getSystemService(Context.NOTIFICATION_SERVICE);
                    if (manager != null) {
                        NotificationChannel channel = manager.getNotificationChannel("XP");
                        if (channel != null) {
                            manager.deleteNotificationChannel("XP");
                        }
                    }
                } catch (Throwable e) {
                    Log.e("MqttService", " Exception == " + e.toString());
                }
            }
        }
    }, 3000);
}

Я не уверен, что этот код приведет к сбою с низкой вероятностью

linguokun 02.11.2018 08:04

убедитесь, что вы добавили атрибут -> name = ". имя класса, в котором вы создали каналы"

внутри тега в файле манифеста.

Другие вопросы по теме