如何在运行时设置android通知图标?

时间:2019-06-02 20:15:06

标签: c# android unity3d notifications icons

因此,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.

我知道这是行不通的,因为发送通知的方法是预先构建的,只能分别使用Assets / Plugins / Android / res / drawable和“移动通知设置”界面中的图标名称或图标ID。

所以我的想法是,也许有一种在运行时访问Assets / Plugins / Android / res / drawable(或等效项)的方法,因此我可以在运行时通过代码将图标png添加到该文件夹​​中,然后我可以正常发送带有png文件名的通知,而不必事先将其添加到Assets / Plugins / Android / res / drawable或Mobile Notification设置中。

ORR(如果可以通过代码在“移动通知设置”中编辑列表)。这是一个Texture2D的列表,非常完美,但是除了“仅编辑器”方法之外,我找不到一种以编程方式编辑该列表的方法。

旁注,如果在应用程序运行之前不知道通知图标,这将特别有用。就像如果您希望用户从手机中选择自定义png,然后您的应用将其用作通知。即时消息传递就是一个很好的例子,其中图标通常是发件人的个人资料图片,从字面上看可以是任何东西,并且显然直到应用程序运行时才知道。我知道这些是在线通知,而不是本地通知,但是如何使用本地通知来做同样的事情?

1 个答案:

答案 0 :(得分:0)

看看UnityNotificationEditorManager.cs,这个统一的软件包将您在设置中输入的纹理以其ID的名称导出到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;
    }

因此,基本上可绘制文件夹中的任何图像都可以用作您的图标。

但是代码在构建时运行,所以我认为您不能在运行时更改可绘制对象。因此,如果您要这样做,建议您在资产商店中找到另一个包装(如果存在)。