У нас есть много сбоев, характерных для телефонов Xiaomi на Android 6 и 7:
Fatal Exception: android.app.RemoteServiceException: Bad notification posted from package x.y.z: Couldn't create icon: StatusBarIcon(icon=Icon(typ=RESOURCE pkg=x.y.z id=0x7f0200ad) visible user=0 )
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1715)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6358)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
Я нашел много подобных отчетов о сбоях и статей в сети. Вот некоторые из них:
https://medium.com/@Miqubel/the-story-of-a-hard-to-fix-bug-ac6ed819cb49
Но разница в том, что у нас эти проблемы только на телефонах Xiaomi (Android 6 и 7) и, вероятно, не во время обновлений, так как у одних и тех же пользователей несколько раз происходит сбой в одной и той же версии выпуска.
Интересно, что я не смог найти ничего в сети по этому конкретному случаю, и у нас нет телефонов Xiaomi.
Я установил уведомление примерно так:
NotificationManager notificationManager = (NotificationManager) 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);
notificationManager.createNotificationChannel(notificationChannel);
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentText(body == null ? "" : body)
.setAutoCancel(true)
.setContentIntent(PendingIntent.getActivity(
context,
0,
pendingIntent,
PendingIntent.FLAG_UPDATE_CURRENT
));
У нас также есть уведомления Facebook, которые нужно настроить аналогичным образом, но в другом классе уведомлений. Я не знаю, актуально ли это. Кто-нибудь сталкивался с этим или имел какие-либо рекомендации, как это исправить, кроме переноса методов setSmallIcon и/или setLargeIcon в проверку версии производителя и Android?
РЕДАКТИРОВАТЬ: я не смог найти решение, но вот несколько новых мыслей:
Мы выпустили новую версию, но исключение пользователей Xiaomi из уведомления не помогло! Теперь я думаю, что проблема вызвана пользовательским кодом в ActivityThread.java. MIUI, вероятно, запускает уведомление отсюда о каком-то событии. Здесь есть несколько десятков событий в стоковом Android, но ни одно из них не вызывает уведомление. Но что-то не так с нашими иконками, поэтому они вылетают.
А что не так с нашими иконами? У нас есть ic_notification, который, вероятно, не используется для этого. С другой стороны, ic_launcher — это mipmap. Может быть, это? Но я не смог найти никаких проблем, связанных с Xiaomi и mipmaps.
В отчете о сбое всегда упоминается один и тот же идентификатор ресурса в нескольких версиях приложения: 0x7f0200ad. Это по какой-то причине особенное? Как я могу перепроектировать наше приложение, чтобы получить имя ресурса для этого?
РЕДАКТИРОВАТЬ 2:
- Я реконструировал приложение с помощью apktool, но идентификатора ресурса нет в public.xml, который кажется эквивалентным R.java. Наши ic_notification и ic_launcher находятся в списке с другим id. Так это системный ресурс, который MIUI не может найти?
РЕДАКТИРОВАТЬ 3:
- Первое свидетельство того, что у других такая же проблема:
https://xiaomi.eu/community/threads/miui-9.47247/
- Временное решение найдено на польском форуме:
https://pl.forum.elvenar.com/index.php?threads/problem-z-uruchomieniem-23566.3348/
Последний комментарий переводится как: «У нас есть временное решение проблемы с Xiaomi, попробуйте отключить принудительные уведомления из приложения Elvenar в настройках телефона. После перезапуска приложения ошибка должна исчезнуть».
РЕДАКТИРОВАТЬ 4:
Мы используем ShortcutBadger (версия 1.1.13). Здесь говорится, что мы должны использовать другой метод для значков Xiaomi:
https://github.com/leolin310148/ShortcutBadger/wiki/Xiaomi-Device-Support
Сразу после версии 1.1.13 они удалили поддержку по умолчанию для Xiaomi, и вам нужно использовать уведомление по ссылке выше.
Кто-нибудь еще пострадавший использует это?
Xiaomi
имеет собственную систему уведомлений. - person Martin Zeitler   schedule 18.12.2018