Как установить значок уведомления Android во время выполнения? - PullRequest
0 голосов
/ 02 июня 2019

Итак, метод Unity для установки значков локальных уведомлений Android - через интерфейс их редактора в настройках мобильных уведомлений.По сути, добавьте свои значки в список в редакторе, укажите ID для каждого, а затем при отправке сообщения установите поле LargeIcon в ID.В качестве альтернативы, вместо добавления ваших значков в список в редакторе, вы можете иметь их в Assets / Plugins / Android / res / drawable.

Вместо того, чтобы делать что-либо из этого, я хочу просто указать Texture2D илиПуть к файлу PNG полностью через код.Что-то вроде:

LargeIcon = Application.persistentDataPath + "myNotificationIcon.png";

или

LargeIcon = Texture2D.getFile(); //or whatever the method would be.

Я знаю, что это не сработает, потому что метод отправки уведомления предварительно создан, чтобы взять только имя значка или значкаИдентификатор из активов / плагинов / Android / res / drawable и интерфейса настроек мобильных уведомлений соответственно.

Так что я думаю, может быть, есть способ получить доступ к активам / плагинам / Android / res / drawable (илиэквивалентно) во время выполнения, поэтому я могу добавить свои png-файлы значков в эту папку с помощью кода во время выполнения, а затем я могу отправить уведомление как обычно с именем файла png, но не добавляя его в Assets / Plugins / Android/ res / drawable или Настройки мобильных уведомлений заранее.

ORR, если есть возможность редактировать список в Настройках мобильных уведомлений с помощью кода.Это список Texture2D, который идеально подходит, но я не смог найти способ редактировать этот список программно, кроме методов только для редактора.

Примечание, это было бы особенно полезно, если значки уведомлений неизвестныпока приложение не запущено.Например, если вы хотите, чтобы пользователь выбрал в своем телефоне пользовательский png, который ваше приложение затем использует в качестве уведомления.Прекрасным примером является обмен мгновенными сообщениями, где значки часто представляют собой изображения профиля отправителя, которые могут быть буквально чем угодно и, очевидно, не известны, пока приложение не запущено.Я знаю, что это онлайн-уведомления, а не локальные, но как мне сделать то же самое с локальными уведомлениями?

1 Ответ

0 голосов
/ 03 июня 2019

Взглянув на UnityNotificationEditorManager.cs, этот пакет Unity экспортирует текстуры, введенные вами в настройках, в папку drawables с именем ее идентификатора.

internal Dictionary<string, byte[]> GenerateDrawableResourcesForExport()
    {
        var icons = new Dictionary<string, byte[]>();
        foreach (var res in TrackedResourceAssets)
        {
            if (!res.Verify())
            {
                Debug.LogWarning( string.Format("Failed exporting: '{0}' Android notification icon because:\n {1} ", res.Id,
                    DrawableResourceData.GenerateErrorString(res.Errors))
                );
                continue;
            }

            var texture = TextureAssetUtils.ProcessTextureForType(res.Asset, res.Type);

            var scale = res.Type == NotificationIconType.SmallIcon ? 0.375f : 1;

            var textXhdpi = TextureAssetUtils.ScaleTexture(texture, (int) (128 * scale), (int) (128 * scale));
            var textHdpi  = TextureAssetUtils.ScaleTexture(texture, (int) (96 * scale), (int) (96 * scale));
            var textMdpi  = TextureAssetUtils.ScaleTexture(texture, (int) (64 * scale), (int) (64 * scale));
            var textLdpi  = TextureAssetUtils.ScaleTexture(texture, (int) (48 * scale), (int) (48 * scale));

            icons[string.Format("drawable-xhdpi-v11/{0}.png", res.Id)] = textXhdpi.EncodeToPNG();
            icons[string.Format("drawable-hdpi-v11/{0}.png", res.Id)] = textHdpi.EncodeToPNG();
            icons[string.Format("drawable-mdpi-v11/{0}.png", res.Id)] = textMdpi.EncodeToPNG();
            icons[string.Format("drawable-ldpi-v11/{0}.png", res.Id)] = textLdpi.EncodeToPNG();

            if (res.Type == NotificationIconType.LargeIcon)
            {
                var textXxhdpi = TextureAssetUtils.ScaleTexture(texture, (int) (192 * scale), (int) (192 * scale));
                icons[string.Format("drawable-xxhdpi-v11/{0}.png", res.Id)] = textXhdpi.EncodeToPNG();
            }
        }

        return icons;
    }

Таким образом, в качестве значка можно использовать любое изображение в папках для рисования.

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

...