Как исправить Xiaomi для RemoteServiceException со значком уведомления? - PullRequest
0 голосов
/ 10 декабря 2018

У нас много сбоев, характерных для телефонов 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)

Я нашел много похожих сообщений о сбоях и статей в сети.Вот некоторые из них:

Как исправить: android.app.RemoteServiceException: Плохое уведомление отправлено из пакета *: Не удалось создать значок: StatusBarIcon

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 - это мип-карта.Может быть это так?Но я не смог найти никаких проблем, касающихся Xiaomi и mipmaps.

  • В отчете о сбое всегда упоминается один и тот же идентификатор ресурса в нескольких версиях приложения: 0x7f0200ad.Это особенное по какой-то причине?Как я могу перепроектировать наше приложение, чтобы получить имя ресурса для этого?

РЕДАКТИРОВАТЬ 2:

  • Я перепроектировал приложение с помощью apktool, но ресурсid отсутствует в public.xml, что, по-видимому, эквивалентно R.java.Наши ic_notification и ic_launcher находятся в списке с другим идентификатором.Так это системный ресурс, который 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, и вы должны использовать уведомление из приведенного вышессылка.

Кто-нибудь еще пострадал использовать это?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

У меня та же проблема, что и у пользователя.Я считаю, что это вызвано следующим кодом - декомпилированный из APK У меня нет исходного кода, он из shortcutbadger

ResolveInfo.getIconResource () возвратил недопустимый идентификатор ресурса (0x7f0200ad, одинаковый для всехприложения и похоже это только на MIUI10) таким образом вылет.

iget-object v1, p0, Lme/leolin/shortcutbadger/impl/XiaomiHomeBadger;->a:Landroid/content/pm/ResolveInfo;

invoke-virtual/range {v1 .. v1}, Landroid/content/pm/ResolveInfo;->getIconResource()I

move-result v1

invoke-virtual {p1, v1}, Landroid/app/Notification$Builder;->setSmallIcon(I)Landroid/app/Notification$Builder;

Как пользователь, простое решение - полностью отключить уведомление для этого приложения - по крайней мере, сделать его пригодным для использования.

Как разработчику, может быть проще вместо этого использовать собственный значок или добавить некоторую обработку ошибок в ярлык быстрого доступа.

builder.setSmallIcon(R.drawable.myicon);

Обновление:

Я понимаю, что происходит сейчас ... Какой-то странный код в shortcutbadge .resolInfo - это стандартное домашнее средство запуска (MIUI home), а resolInfo.getIconResource () - это значок домашнего интерфейса miui

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void tryNewMiuiBadge(Context context, int badgeCount) throws ShortcutBadgeException {
if (resolveInfo == null) {
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    resolveInfo = context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
}

if (resolveInfo != null) {
    NotificationManager mNotificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Notification.Builder builder = new Notification.Builder(context)
            .setContentTitle("")
            .setContentText("")
            .setSmallIcon(resolveInfo.getIconResource());
    Notification notification = builder.build();

, декомпилированный из miuihome.apk, здесь 0x7f0200ad.

<public type="drawable" name="icon_launcher" id="0x7f0200ad" />

Так зачем стороннему приложению пытаться установить значок уведомления со значком miui home?это какой-то хак по причине совместимости или просто ошибка?Я пишу простое приложение с приведенным выше фрагментом кода, тестирую на эмуляторе, и оно терпит неудачу, но не приводит к сбою приложения, может быть тот же случай на старом MIUI, так как setSmallIcon (resID) ищет значок с resID из собственного пакета.Хорошей новостью является то, что это не ошибка MIUI10, и это должно происходить только в приложениях, использующих приведенный выше код.

0 голосов
/ 21 декабря 2018

Мы купили Redmi Note 4X.Вот что произошло:

  • Устройство было на MIUI 8.5.Уведомления работают как положено.Нет сбоев.

  • Мы обновились до MIUI 9.5 через OTA обновления.Странные уведомления начали появляться, когда мы открывали приложение или переключались между определенными экранами.Сбоев по-прежнему нет.

  • Мы обновились до MIUI 10.1 через OTA обновления.Сбой приложения при запуске с предыдущей версией приложения.Сбой исчез, когда я обновил ShortcutBadger до версии 1.1.22.Понятно, что это произошло потому, что устройства Xiaomi не выполняют метод applyCount () в новой версии библиотеки (вместо этого они должны использовать applyNotification ()), но я не стал копать глубже.

Я оставляю вопрос и награду открытой для всех, кто может объяснить, что произошло подробно.В противном случае мы довольны этим результатом.В следующем выпуске я, вероятно, постараюсь исправить значки и уведомления для Xiaomi, так как они не отображаются должным образом.

...