从 Android 12 开始,Google 会显示带有应用图标的 Toast 消息。
我的应用程序有启动器图标。 Android 12 初始屏幕正确显示应用程序图标。
通过代码显示吐司
Toast.makeText(this, "Show simple toast", Toast.LENGTH_LONG).show()
编译SdkVersion/targetSdkVersion 31
android 模拟器 Google play Intel x86 Atom_64 系统映像 API 级别 31,修订版 8。
如何更改此默认 Toast 图标?
对我来说,简单地重新启动设备就可以了。
更新到Android 12后我根本没有重新启动我的测试手机。我遇到了同样奇怪的错误,即我的应用程序发出的 Toast 中显示了通用应用程序图标。我尝试按照 Mickaël 的回答建议更改清单。没有运气。我最终得到了与开始调试之前应用程序完全相同的清单……然后我重新启动了设备。我的应用程序现在可以在 Toast 中可靠地显示正确的图标。发生了什么?不确定。我怀疑重新启动可能会触发图标缓存刷新,该刷新会抓取所有已安装的应用程序以搜索新的/更新的应用程序图标。
这个问题似乎已报告给 Google,并分配给了 Google 工程师: https://issuetracker.google.com/issues/202863198
我也可以重新启动手机。 Toast 现在显示在我的应用程序中配置的正确应用程序图标。如果它不适合您,请查看此声明并检查是否为您的应用程序图标正确设置了所有内容。我希望这会有所帮助:) https://developer.android.com/studio/write/image-asset-studio
PS:还有一个地方可以用来构建应用程序图标 https://romannurik.github.io/AndroidAssetStudio/index.html
运行一些测试后,我发现使用“图像资源”>“通知图标”生成的可绘制对象设置
<application android:icon="@drawable/ic_stat_name" ...
会覆盖默认的 toast 图标。
但是,这不适用于作为“图像资源”>“启动器图标”生成的可绘制对象。所以在这一点上,我猜想 Android Studio 的生成工具缺少一些东西。
public void CustomToast(Context context,String text,int ico,int duration)
{
//define new Toast Object
Toast toast = new Toast(context.getApplicationContext());
//create TextView Object to set icon for it
TextView tv_toast=new TextView(context);
//get text from parameter for toast
tv_toast.setText(text);
//set background color and radius for my toast
GradientDrawable gd = new GradientDrawable();
gd.setColor(Color.GRAY);
gd.setCornerRadius(20);
gd.setStroke(1, 0xFF000000);
//applying setting to tv
tv_toast.setBackground(gd);
//set icon
tv_toast.setCompoundDrawablesWithIntrinsicBounds(ico, 0, 0, 0);
//set duration
toast.setDuration(duration);
//ending- set my custom style for toast object
toast.setView(tv_toast);
// then show it
toast.show();
}
更新:第二天就停止工作了:(
这很可能是 Android 12 的错误,因为重启后一切正常。但是,一旦您更改构建变体(例如,从调试到发布),一切都会停止工作。
在 logcat 中,我收到以下错误消息(当我尝试仅显示一个 Toast 时,我专门仔细检查了):
2023-10-23 16:12:26.166 3055-3055 ndroid.systemu com.android.systemui E Failed to open APK '/data/app/~~ydafWiMxymoRue6E25Ic_Q==/my.app.id-o52oNN4A3UebVQPR4X_ZMQ==/base.apk': I/O error
2023-10-23 16:12:26.167 3055-3055 ndroid.systemu com.android.systemui E Failed to open APK '/data/app/~~ydafWiMxymoRue6E25Ic_Q==/my.app.id-o52oNN4A3UebVQPR4X_ZMQ==/base.apk': I/O error
2023-10-23 16:12:26.168 3055-3055 ResourcesManager com.android.systemui E failed to add asset path '/data/app/~~ydafWiMxymoRue6E25Ic_Q==/my.app.id-o52oNN4A3UebVQPR4X_ZMQ==/base.apk'
java.io.IOException: Failed to load asset path /data/app/~~ydafWiMxymoRue6E25Ic_Q==/my.app.id-o52oNN4A3UebVQPR4X_ZMQ==/base.apk
at android.content.res.ApkAssets.nativeLoad(Native Method)
at android.content.res.ApkAssets.<init>(ApkAssets.java:295)
at android.content.res.ApkAssets.loadFromPath(ApkAssets.java:144)
at android.app.ResourcesManager.loadApkAssets(ResourcesManager.java:472)
at android.app.ResourcesManager.access$000(ResourcesManager.java:84)
at android.app.ResourcesManager$ApkAssetsSupplier.load(ResourcesManager.java:186)
at android.app.ResourcesManager.createAssetManager(ResourcesManager.java:559)
at android.app.ResourcesManager.createResourcesImpl(ResourcesManager.java:641)
at android.app.ResourcesManager.findOrCreateResourcesImplForKeyLocked(ResourcesManager.java:696)
at android.app.ResourcesManager.createResources(ResourcesManager.java:1049)
at android.app.ResourcesManager.getResources(ResourcesManager.java:1152)
at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:2453)
at android.app.ApplicationPackageManager.getResourcesForApplication(ApplicationPackageManager.java:1798)
at android.app.ApplicationPackageManager.getResourcesForApplication(ApplicationPackageManager.java:1784)
at android.app.ApplicationPackageManager.getDrawable(ApplicationPackageManager.java:1545)
at miui.content.res.IconCustomizer.getCustomizedNormalIcon(IconCustomizer.java:804)
at miui.content.res.IconCustomizer.getIcon(IconCustomizer.java:780)
at android.app.MiuiThemeHelper.getDrawable(MiuiThemeHelper.java:101)
at android.content.res.IMiuiThemeHelperImpl.getDrawable(IMiuiThemeHelperImpl.java:39)
at android.content.res.ThemeManagerStub.getDrawable(ThemeManagerStub.java:159)
at android.app.ApplicationPackageManager.loadUnbadgedItemIcon(ApplicationPackageManager.java:3073)
at android.content.pm.PackageItemInfo.loadUnbadgedIcon(PackageItemInfo.java:290)
at com.android.systemui.toast.SystemUIToast.getBadgedIcon(SystemUIToast.java:286)
at com.android.systemui.toast.SystemUIToast.inflateToastView(SystemUIToast.java:198)
at com.android.systemui.toast.SystemUIToast.<init>(SystemUIToast.java:90)
at com.android.systemui.toast.SystemUIToast.<init>(SystemUIToast.java:77)
at com.android.systemui.toast.ToastFactory.createToast(ToastFactory.java:78)
at com.android.systemui.toast.ToastUI.lambda$showToast$0(ToastUI.java:131)
at com.android.systemui.toast.ToastUI.$r8$lambda$w_gPCh3F8Xxn1jN4lkQZoUci71c(Unknown Source:0)
at com.android.systemui.toast.ToastUI$$ExternalSyntheticLambda0.run(Unknown Source:16)
at com.android.systemui.toast.ToastUI.showToast(ToastUI.java:169)
at com.android.systemui.statusbar.CommandQueue$H.handleMessage(CommandQueue.java:1494)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.app.ActivityThread.main(ActivityThread.java:8319)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1038)
2023-10-23 16:12:26.168 3055-3055 ndroid.systemu com.android.systemui E Failed to open APK '/data/app/~~ydafWiMxymoRue6E25Ic_Q==/my.app.id-o52oNN4A3UebVQPR4X_ZMQ==/base.apk': I/O error
2023-10-23 16:12:26.169 3055-3055 ndroid.systemu com.android.systemui E Failed to open APK '/data/app/~~ydafWiMxymoRue6E25Ic_Q==/my.app.id-o52oNN4A3UebVQPR4X_ZMQ==/base.apk': I/O error
2023-10-23 16:12:26.170 3055-3055 ResourcesManager com.android.systemui E failed to add asset path '/data/app/~~ydafWiMxymoRue6E25Ic_Q==/my.app.id-o52oNN4A3UebVQPR4X_ZMQ==/base.apk'
java.io.IOException: Failed to load asset path /data/app/~~ydafWiMxymoRue6E25Ic_Q==/my.app.id-o52oNN4A3UebVQPR4X_ZMQ==/base.apk
at android.content.res.ApkAssets.nativeLoad(Native Method)
at android.content.res.ApkAssets.<init>(ApkAssets.java:295)
at android.content.res.ApkAssets.loadFromPath(ApkAssets.java:144)
at android.app.ResourcesManager.loadApkAssets(ResourcesManager.java:472)
at android.app.ResourcesManager.access$000(ResourcesManager.java:84)
at android.app.ResourcesManager$ApkAssetsSupplier.load(ResourcesManager.java:186)
at android.app.ResourcesManager.createAssetManager(ResourcesManager.java:559)
at android.app.ResourcesManager.createResourcesImpl(ResourcesManager.java:641)
at android.app.ResourcesManager.findOrCreateResourcesImplForKeyLocked(ResourcesManager.java:696)
at android.app.ResourcesManager.createResources(ResourcesManager.java:1049)
at android.app.ResourcesManager.getResources(ResourcesManager.java:1152)
at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:2453)
at android.app.ApplicationPackageManager.getResourcesForApplication(ApplicationPackageManager.java:1798)
at android.app.ApplicationPackageManager.getResourcesForApplication(ApplicationPackageManager.java:1784)
at android.app.ApplicationPackageManager.getDrawable(ApplicationPackageManager.java:1545)
at android.app.ApplicationPackageManager.loadUnbadgedItemIcon(ApplicationPackageManager.java:3088)
at android.content.pm.PackageItemInfo.loadUnbadgedIcon(PackageItemInfo.java:290)
at com.android.systemui.toast.SystemUIToast.getBadgedIcon(SystemUIToast.java:286)
at com.android.systemui.toast.SystemUIToast.inflateToastView(SystemUIToast.java:198)
at com.android.systemui.toast.SystemUIToast.<init>(SystemUIToast.java:90)
at com.android.systemui.toast.SystemUIToast.<init>(SystemUIToast.java:77)
at com.android.systemui.toast.ToastFactory.createToast(ToastFactory.java:78)
at com.android.systemui.toast.ToastUI.lambda$showToast$0(ToastUI.java:131)
at com.android.systemui.toast.ToastUI.$r8$lambda$w_gPCh3F8Xxn1jN4lkQZoUci71c(Unknown Source:0)
at com.android.systemui.toast.ToastUI$$ExternalSyntheticLambda0.run(Unknown Source:16)
at com.android.systemui.toast.ToastUI.showToast(ToastUI.java:169)
at com.android.systemui.statusbar.CommandQueue$H.handleMessage(CommandQueue.java:1494)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.app.ActivityThread.main(ActivityThread.java:8319)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
原答案
这个组合对我有用:
1。将
android:roundIcon
添加到清单中。
<application
...
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round">
Android Studio中可以生成圆形图标:
Image Asset -> Launcher Icons (Adaptive and Legacy) -> Options -> Round Icon (API = 25) -> Generate: Yes
另外,如果重要的话,我的图标资源是PNG格式的。
2。重新启动设备。
此后,我的应用程序图标开始出现在Toast消息中。
POCO X3 NFC、MIUI Global 14.0.2、Android 12。
Toast消息中显示的图标是应用程序的图标。要更改它,您需要更改应用程序的图标。没有记录的方法可以只显示文本而不显示图标。