Хранить маленький значок уведомления в базе данных от NotificationListenerService - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть NotificationListenerService, который перехватывает все входящие уведомления и записывает информацию в базу данных SQLite. Единственная проблема, с которой я сталкиваюсь, это как получить значок строки состояния, также называемый маленьким значком.

notification.icon устарел с API 23, а extras.getInt(Notification.EXTRA_SMALL_ICON) устарел с API 26.

До Android 10 (API 29) extras.getInt("android.icon") работал нормально, но теперь он возвращает 0 для каждого уведомления, несмотря на то, что интересно (насколько я могу судить) то же самое, что и extras.getInt(Notification.EXTRA_SMALL_ICON).

Я знаю, что сейчас рекомендуется использовать getSmallIcon(), но как я могу сохранить это в базе данных? В прошлом мне удавалось получить идентификатор ресурса из вышеуказанных методов, но getSmallIcon() возвращает объект Icon. Я знаю, что могу преобразовать это в Drawable или Bitmap, но как я могу получить идентификатор ресурса объекта, имя которого я не знаю? И тем не менее из другого приложения.

Примечание: я знаю, что есть метод getSmallIcon(), называемый getResId(), но для вызова требуется API 28, API выше, чем хотелось бы иметь как минимум.

Я правильно делаю? Есть ли лучший способ сделать это, что я не могу найти?

1 Ответ

0 голосов
/ 27 февраля 2020

Я нашел решение для тех, кто найдет это в будущем:

int iconResId = 0;

// if the API is P or above, this is easy
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    iconResId = notificationSmallIcon.getResId();
}

// in case the getResId doesn't work, or the API is below P
if (iconResId == 0) {

    /* first try to get it from the small icon
        if the icon is from a resource, then the toString() method will contain the resource id, 
        but masked to a hex value, so we need to get it back to its integer value
     */
    final String smallIconString = notificationSmallIcon.toString();
    if (smallIconString.contains("id=")) {
        final String iconHexId = smallIconString.substring(smallIconString.indexOf("id=") + 5).replace(")", "");
        iconResId = Integer.parseInt(iconHexId, 16);
    }

    /* if still zero, above method didn't work, use the deprecated method as I've found it to still
        be reliable despite it, you know, being deprecated since API 23
     */
    if (iconResId == 0) {
        iconResId = notification.icon;
    }

}

// if still zero now, either there's no icon, or none of the above methods work anymore
...