安卓12启动画面图标未显示

65

我在启动一个新应用程序时遇到了奇怪的问题。我正在利用新的Android 12闪屏API创建我的闪屏屏幕,并按照Google提供的指南进行操作。我将core-splashscreen包含在我的项目中,以提供与旧版本的Android OS的兼容性。当我在旧的OS版本(如API 30)上运行应用程序时,我看到了预期的闪屏屏幕,但是当我在API 31上运行它时,我提供的闪屏屏幕图标没有显示出来。我指定的背景颜色显示出来了,但是图标根本没有显示出来。我已经尝试过使用可绘制的资产和mipmap,但没有任何作用。我很困惑,因为我找到的每个教程都显示了我所遵循的相同步骤和他们工作的闪屏屏幕的截图,但我没有任何运气。

以下是我针对v31的闪屏屏幕样式定义的上下文:

<style name="Theme.Splash" parent="Theme.SplashScreen">
    <item name="android:windowSplashScreenBackground">@color/orange_7A</item>
    <item name="android:windowSplashScreenAnimatedIcon">@drawable/splash_foreground</item>
    <item name="postSplashScreenTheme">@style/Theme.App</item>
</style>

除了我使用“windowSplashScreenAnimatedIcon”而不是“android:windowSplashScreenAnimatedIcon”之外,我为所有其他操作系统版本都有相同的样式。我尝试过在v31中在项目名称前加上“android:”,但两者都不起作用。这是我的MainActivity.kt:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    installSplashScreen()
    
    setContent {
        MyVeevaTheme {
            Login()
        }
    }
}

我还在AndroidManifest.xml中将“android:theme”属性设置为我的启动画面样式。我知道启动画面样式已应用,因为它遵循背景颜色,但由于某种原因它没有显示图标,尽管在较旧的操作系统版本中图标正常显示。非常感谢您能提供的任何帮助。


刚刚在 Android 12 模拟器上尝试了新的启动画面 API,但很遗憾图标没有显示出来,无论我是否设置了 "android:windowSplashScreenAnimatedIcon"。不过,"android:windowSplashScreenBackground" 是有效的。 我们应该考虑这是一个 bug 吗? 我认为这个 API 对于旧版本的 Android 设备不太友好。 - yao
10
我已经弄清楚如何显示它了。我正在按照 这篇教程 设置一个基本项目来重新制造问题,并且我注意到作者在底部附近提到的注意事项,即仅运行应用程序无法显示启动画面,您必须杀掉它并从应用程序托盘中打开应用程序。一旦我这样做了,我就能看到我的启动画面。虽然有些麻烦,但至少现在我有一种测试它的方式了。 - Joseph Hawkes-Cates
2
我已经记录了这个错误报告,因为这很令人困惑,但是通过我的最后一条评论,我现在有一种测试方法。如果有人感兴趣,这是错误报告的链接:https://issuetracker.google.com/issues/205021357。 - Joseph Hawkes-Cates
遇到了同样的问题,似乎谷歌还没有开始调查。希望能尽快解决。 - AndroidDev123
如果使用该库,应该删除android前缀。 - Vadim Caen
显示剩余3条评论
13个回答

124

简要概述:关闭应用程序并从启动器中运行,从Android Studio运行时图标不会显示。

为了更好地展示,我在这里添加我的评论作为回答。

我确实找到了方法使其显示。我正在按照这个教程设置一个基础项目以重新创建这个问题,并且我注意到作者在底部附近放置的注释提到,仅仅运行应用程序不会显示完整的启动画面。您必须关闭并从启动器中打开应用程序。一旦我这样做了,我就能够看到我的启动画面了。虽然有点麻烦,但至少现在我有一种测试它的方法。我确实提交了错误报告,但现在我有一个解决方法。感谢大家的答案/评论!


9
这个问题让我发疯了。我按照谷歌迁移指南和其他有关启动屏幕API的文档操作,但在我的Pixel手机上,当使用Nova Launcher作为桌面时,从快捷方式或抽屉启动应用程序时将永远无法在启动屏幕上获得图标/图片。即使使用Android Studio启动仍然是同样的情况。只有当我使用Pixel Launcher启动应用程序时才会在启动屏幕上获得图标/图片。真是做得太差了。 - Gimberg
8
哎呀,安卓总是能带来惊喜。 看来它仍然存在漏洞(因为这个库还处于 beta 版本,所以不足为奇——但是它已经在 api 级别 31 上被强制执行了) 感谢 Joseph 提供的解决方法,这已经节省了我很多时间! 然而我无法访问错误报告,链接正确吗? 而且像 @Gimberg 提到的其他启动器问题也非常令人恼火。 - Luzian
1
@AndrewS,是的,我对Android还很陌生,所以术语还在学习中。为了更清晰明了,我将其改为启动器而不是应用托盘。 - Joseph Hawkes-Cates
2
我发现有其他人提交了另一个报告,似乎谷歌将其标记为预期行为... 参考链接:https://issuetracker.google.com/199776339 - Joseph Hawkes-Cates
1
经典的谷歌员工,这让我感到疯狂,因为事情很少按照文档中描述的那样工作...他们总是找到一种方式来搞砸某些东西,不做好或者有bug? - qkx
显示剩余6条评论

11
根据文档,应该在调用super.onCreate()之前调用installSplashScreen()。

这是一个很好的发现。如果安装启动屏幕函数的文档直接放在installSplashScreen函数上而不是在SplashScreen类级别或者在这个指南中:https://developer.android.com/guide/topics/ui/splash-screen,那就太好了。除非我进行更复杂的自定义,否则我没有理由直接引用SplashScreen类。不幸的是,将installSplashScreen调用移动到正确的位置仍然无法解决这个问题。 - Joseph Hawkes-Cates
看代码,似乎他们建议在super.onCreate()之前调用installSplashScreen,因为setContentView在super.onCreate()内部调用,并且installSplashScreen文档确实指定需要在setContentView之前调用。看起来只有在使用视图ID初始化活动而不是手动膨胀视图时才适用。由于我正在使用Compose,我认为只要在我的setContent块之前调用它就可以了。不过,在super.onCreate之前移动它肯定不会有什么问题。 - Joseph Hawkes-Cates
在我的情况下没有区别 - Palejandro

10
当您使用 AndroidX SplashScreen 库时,就像您正在做的那样 (Theme.SplashScreen),您需要使用没有android:前缀的windowSplashScreen*属性。 android: 前缀用于调用平台属性,但在这种情况下,您正在使用库而不是平台,因此无需使用前缀: res/values/themes.xml:
<style name="Theme.Splash" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">@color/orange_7A</item>
    <item name="windowSplashScreenAnimatedIcon">@drawable/splash_foreground</item>
    <item name="postSplashScreenTheme">@style/Theme.App</item>
</style>

是的,但还是要注意其他人说的:该库处于alpha版本,因此有点不稳定。在大多数情况下它都能按预期工作,但我注意到当我adb安装已经打开的应用程序时,打开它时图标不会显示。另外,我无法让API 23以下的图标正常工作。 它在API 23及以上版本中运行良好。 根据发布说明,我想这是可以预料的:https://developer.android.com/jetpack/androidx/releases/core#core-splashscreen-1.0.0-alpha01 - rewgoes
好的,我明白了。我已经尝试过带有和不带有“android:”前缀的两种方式,但在API 31上都无法正常工作。不过,在API 30上它可以正常工作。我有点惊讶会出现这种问题,因为该功能是新的并且专为API 31设计的,所以我没想到会遇到问题。 - Joseph Hawkes-Cates
Vadim,请详细说明我们将在哪里使用它。请命名需要放置此内容的资源文件、清单或其他文件。按照现有的写法,这非常不清楚。 - Andrew S
这是针对 OP 回答的上下文。我会在我的回答中添加一些细节。 - Vadim Caen

9
在我的情况下,缺少启动画面的问题是由于安装默认活动主题引起的:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:name=".App"
        android:theme="@style/Theme.Tracker.StartSplashScreen"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        tools:targetApi="tiramisu">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:theme="@style/Theme.Tracker">                 <-------
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

当我删除了android:theme="@style/Theme.Tracker"这一行时,它开始工作了。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
同样的问题在api<31上出现过。你的解决方案对我有用。 - undefined

6

1
这个答案已经被原帖作者提供了。 - SimonC

4

从深度链接导航时,图标也不会显示出来。

看起来这不仅仅是图标未显示的问题。它还停止调用setOnExitAnimation lambda的代码。

installSplashScreen().apply {
    setOnAnimationListener { viewProvider ->
    viewProvider.iconView
    .animate()
    .setDuration(500L)
    .alpha(0f)
    .withEndAnimation {
       viewProvider.remove()
       someActionCall() 
    }
    .start()
} 

如果您依赖于这段代码总是被调用,那么这并不是保证的。请参见问题跟踪器中的说明:https://issuetracker.google.com/issues/207095799

4

确保你也将主题设置为 MainActivity。对于我来说,这就是启动屏幕不能显示的原因。因此,你必须在应用程序和 MainActivity 中都设置主题。


解决了我的问题! - undefined

3
以下指南对我很有帮助,您可以尝试使用。在使用新的启动屏幕API时需要记住以下几点:
  1. 保持最新库版本的更新。请跟随此链接(https://developer.android.com/jetpack/androidx/releases/core)。
  2. 将 installSplashScreen() 放在 setContentView() 之前。
  3. 为启动屏幕制作适当的主题。你可以尝试下面的这个。

将其放入styles.xml或themes.xml文件夹中,并将其与活动一起用作主题。

 <!-- Splash Screen Theme. -->
<style name="Theme.AppSplash" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">@color/white</item>
    <item name="windowSplashScreenAnimatedIcon">@mipmap/ic_launcher_round</item>
    <item name="windowSplashScreenAnimationDuration">1000</item>
    <item name="postSplashScreenTheme">@style/AppTheme</item>
</style>

2
除了上面提到的其他解释之外,我也遇到了同样的问题,但是我意识到在我的清单文件中,我将Splashscreen主题设置在了我的MainActivity上,这是正确的,但是我的MainActivity没有设置主/启动器意图过滤器,这告诉Android操作系统这是启动活动。
<intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

因此在您的清单文件中,请检查您是否实际上正在为具有主/启动器意图过滤器的起始活动设置Splashscreen主题,并将Application标签保留为应用程序主题而不是Splashscreen主题,以避免由于主题而导致应用程序在其他活动上表现不佳,因为我也经历过这种情况(尤其是针对那些迁移到新闪屏的人)。

谢谢,希望有人会发现这有用。


1
在三星Galaxy M31(Android 12,One Ui Core版本4.1)上,当从启动器启动时,图标不会显示。但是当从主屏幕启动时,它会显示出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接