因此,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,然后您的应用将其用作通知。即时消息传递就是一个很好的例子,其中图标通常是发件人的个人资料图片,从字面上看可以是任何东西,并且显然直到应用程序运行时才知道。我知道这些是在线通知,而不是本地通知,但是如何使用本地通知来做同样的事情?
答案 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;
}
因此,基本上可绘制文件夹中的任何图像都可以用作您的图标。
但是代码在构建时运行,所以我认为您不能在运行时更改可绘制对象。因此,如果您要这样做,建议您在资产商店中找到另一个包装(如果存在)。