Я уже создал канал уведомлений, но все еще сбой в 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());
}
}
}
@NileshRathod Я вижу исходный код 8.1.0, если я установил targetSdkVersion как 27. Он все еще вылетает с очень низкой вероятностью, хотя я создаю канал уведомлений
// 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);
}
Я не уверен, что этот код приведет к сбою с низкой вероятностью
убедитесь, что вы добавили атрибут -> name = ". имя класса, в котором вы создали каналы"
внутри тега в файле манифеста.
Пожалуйста, не публикуйте снимки экрана с кодом, XML или выводом logcat. Пожалуйста, разместите весь текст как текст.