bug(splash-screen): splashImmersive and splashFullScreen have no effect on Android 8–10
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 初心者へのやさしさ
- 74/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
調査の方向性
Read the Android splash screen legacy path in show(), buildViews(), legacyImmersive(), and legacyFullscreen(). Check how the splashImage and spinnerBar windows are added and which window receives system UI flags; reproduce on Android API 26–29. Done when the configured immersive and fullscreen modes hide the expected system bars and the splash covers the status bar area from its first frame.
索引モデルが issue の本文から書いたものです。
説明
🤖 Automated review by Claude — posted via @ibrahimkhatib365's account; not written by them personally.
Bug Report
Plugin(s)
@capacitor/splash-screen 8.0.2. The same code is in the current main.
Capacitor Version
Installed Dependencies:
@capacitor/cli: 8.5.2
@capacitor/core: 8.5.2
@capacitor/android: 8.5.2
@capacitor/ios: 8.5.2
Platform(s)
Android 8–10 (API 26–29), the legacy splash path. Reproduced on API 28.
Current Behavior
With splashImmersive: true (or splashFullScreen: true), the launch splash keeps the navigation bar and status bar visible below Android 11.
In show(), the legacy path adds two windows: splashImage first, then spinnerBar. spinnerBar is always created in buildViews() and always added, even with showSpinner: false. legacyImmersive() and legacyFullscreen() then set the system UI flags on splashImage only. Below Android 11 the focused window decides the system bars, and that's spinnerBar, the window added last, which has no flags. So the flags never take effect.
A related gap: both windows are added with the activity's flags, without FLAG_LAYOUT_NO_LIMITS, so the splash image starts below the status bar. While it shows, the status bar area shows the activity window behind it. During startup that window changes colour (theme background, then the WebView), so the status bar flickers before settling on the splash colour.
Expected Behavior
Below Android 11, splashImmersive hides the system bars and splashFullScreen hides the status bar while the splash shows, the same as on Android 11+. The splash covers the status bar area from the first frame.
Code Reproduction
npm init @capacitor/appand add@capacitor/splash-screen. SetSplashScreen.launchShowDuration: 3000andsplashImmersive: trueincapacitor.config.- Run on an Android 9 (API 28) emulator. The plugin takes the legacy path there (see #2635).
- Launch the app: the navigation buttons, and the status bar above the splash, stay visible for the whole splash.
Other Technical Details
- Reproduced on an Android 9 (API 28) emulator
minSdkVersion26
Additional Context
We work around it with a patch, which applies flags to the focused window and lets the image draw under the status bar:
// Required to enable the view to actually fade
params.format = PixelFormat.TRANSLUCENT;
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+ params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
+ }
+
try {
windowManager.addView(splashImage, params);
...
windowManager.addView(spinnerBar, params);
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S && config.isImmersive()) {
+ spinnerBar.setSystemUiVisibility(
+ View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ );
+ }
We only hide the navigation bar, because we wanted the status bar kept. A general fix would apply the same flags as legacyImmersive() / legacyFullscreen() to spinnerBar too, or to whichever window is added last. Avoid IMMERSIVE_STICKY on the spinner, because on some versions it shows the system's "Viewing full screen" hint over the splash.
We haven't checked Android 11 (API 30). Its insets-controller branch also targets splashImage's window, so it may have the same problem.
Related: #2635 (the same legacy path, on reopen).
- 主要言語
- Java
- スター
- 688
- フォーク
- 691
- 平均マージ
- 1日 5時間
- マージ済み PR(30日)
- 5
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
ionic-team/capacitor-plugins のほかの issue
-
platform: android
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
ionic-team/capacitor-plugins#2635 ·
メンテナーはふだん 1 日以内に返信
-
triage
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
ionic-team/capacitor-plugins#2627 ·
メンテナーはふだん 1 日以内に返信
-
triage
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
ionic-team/capacitor-plugins#2616 ·
メンテナーはふだん 1 日以内に返信
-
[@capacitor/app] iOS: 'Expression implicitly coerced from String? to Any' warning in getAppLanguageオープンtriage
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
ionic-team/capacitor-plugins#2604 ·
メンテナーはふだん 1 日以内に返信
-
triage
難易度 3/5 1〜2日 初心者へのやさしさ 72/100
ionic-team/capacitor-plugins#2634 ·
メンテナーはふだん 1 日以内に返信
ionic-team/capacitor-plugins の issue をすべて見る
似ている issue
-
Test: Verify vault unlock max failed attempts and PIN brute-force protection対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
wultra/powerauth-tests#980 ·
-
account bug communication lecture
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
line/centraldogma#1397 ·
メンテナーはふだん 2 日以内に返信
-
[Bug]: Fixed/recurring deposit accounts are treated as savings in ownership and listings対応中かも @Aana123 が今日担当しました。 オープンbug Triage
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
apache/fineract-consumer-facing#252 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 76/100
ShaftHQ/SHAFT_ENGINE#7946 ·
メンテナーはふだん 1 日以内に返信