Android splashscreen remove white and black flashing
-
Hi everybody, in my app I want to remove the splashscreen because I already use an image in my stackView as splashscreen with visibility time and other stuff that I can control instead of using AndroidManifest and then the "iOS manifest".
I copy paste my code to a better understanding.
At first the Init.qml will be called and use as first item MainMini also a Loader load my custom SplashscreenStackView { id: stackView initialItem: MainMini {} anchors.fill: parent } Loader { id: loaderSplash anchors.fill: parent active: false sourceComponent: Splash { id: splashItem anchors.fill: parent onSplashTimeout: { console.log("[Init.qml] Timeout disabling Splashscreen"); loaderSplash.active = false; } } }
This is my splash Item
Rectangle { id: splashInit signal splashTimeout() property string qwe: "#F5F5F5" property string asd: "#C05656" property string fgh: "#565656" color: "white" Image { id: splashscreen anchors.centerIn: parent width: parent.width * 0.4 height: splashscreen.width / 1.172 source: "assets/splashscreen/splashscreen_app_1280x1920_hor.png" mipmap: true } MText { id: name anchors.horizontalCenter: splashInit.horizontalCenter anchors.bottom: parent.bottom bottomPadding: splashInit.height * 0.03 color: "grey" font.pointSize: parent.height * 0.021 font.family: "Titillium Web" font.weight: Font.Light text: "Version " + Qt.application.version } Timer { id: timerInit interval: 2000 running: true repeat: false onTriggered: { timerInit.stop(); timerInit.running = false; console.log("[Splash.qml] Time's up, emitting..."); splashTimeout(); } } }
Here seems all ok this is my Android stuff:
package my_package; import android.content.Context; import android.content.Intent; import android.provider.Settings; import android.os.Bundle; import android.widget.Toast; import android.util.Log; import java.util.Timer; import java.util.TimerTask; //URL from intent import android.net.Uri; //VIBE import android.os.VibrationEffect; import android.os.Vibrator; //FCM import androidx.annotation.NonNull; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; import com.google.firebase.messaging.FirebaseMessaging; //class CustomSending //{ // public static native void sendFibonaciResult(int n); //} public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity { public static native void nativeUrlReceived(String url); public static native void sendFibonaciResult(int n); public static native void callAndroid(int n); public static native void functionCppCalledFromAndroid(String a); private static final String TAG = "MainActivity"; public static MainActivity mInstance; private static Context mContext; private static String mFCMToken = ""; private static String androidId = ""; private static String encodedData; public MainActivity() { mInstance = this; mContext = this; } @Override public void onCreate(Bundle savedInstanceState) { Log.d(TAG, "ANDROID 1"); super.onCreate(savedInstanceState); Log.d(TAG, "ANDROID 2"); //sendFibonaciResult(47); androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); Log.d(TAG, "ANDROID 3"); //GET FCM TOKEN FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (!task.isSuccessful()) { Log.w(TAG, "getInstanceId failed", task.getException()); return; } // Get new Instance ID token String token = task.getResult().getToken(); mFCMToken = token; // Log and toast Log.d(TAG, "FirebaseInstance token = " + token); //Toast.makeText(MainActivity.this, token, Toast.LENGTH_SHORT).show(); } }); Log.d(TAG, "ANDROID 4"); getSchemeUrl(getIntent()); } @Override protected void onNewIntent(Intent intent) { Log.d(TAG, "ANDROID onNewIntent called"); super.onNewIntent(intent); getSchemeUrl(intent); } }
And here the Manifest
<?xml version="1.0"?> <manifest package="my_package" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0.17.100" android:versionCode="32" android:installLocation="auto"> <uses-sdk android:minSdkVersion="25" android:targetSdkVersion="29"/> <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application. Remove the comment if you do not require these default permissions. --> <!-- %%INSERT_PERMISSIONS --> <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application. Remove the comment if you do not require these default features. --> <!-- %%INSERT_FEATURES --> <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/> <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="myAppName" android:extractNativeLibs="true" android:icon="@drawable/icon"> <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="my_Package.MainActivity" android:label="myAppName" android:screenOrientation="portrait" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="myAppName"/> </intent-filter> <!-- Application arguments --> <!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ --> <!-- Application arguments --> <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/> <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/> <meta-data android:name="android.app.repository" android:value="default"/> <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/> <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/> <!-- Deploy Qt libs as part of package --> <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/> <!-- Run with local libs --> <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/> <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/> <meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/> <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/> <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/> <!-- Used to specify custom system library path to run with local system libs --> <!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> --> <!-- Messages maps --> <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/> <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/> <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/> <meta-data android:value="@string/unsupported_android_version" android:name="android.app.unsupported_android_version"/> <!-- Messages maps --> <!-- Splash screen --> <!-- Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation, then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you are done populating your window with content. --> <!-- meta-data android:name="android.app.splash_screen_drawable_portrait" android:resource="@drawable/logo_portrait" / --> <!-- meta-data android:name="android.app.splash_screen_drawable_landscape" android:resource="@drawable/logo_landscape" / --> <!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ --> <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ --> <!-- Splash screen --> <!-- Background running --> <!-- Warning: changing this value to true may cause unexpected crashes if the application still try to draw after "applicationStateChanged(Qt::ApplicationSuspended)" signal is sent! --> <meta-data android:name="android.app.background_running" android:value="false"/> <!-- Background running --> <!-- auto screen scale factor --> <meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/> <!-- auto screen scale factor --> <!-- extract android style --> <!-- available android:values : * default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons * full - useful QWidget & Quick Controls 1 apps * minimal - useful for Quick Controls 2 apps, it is much faster than "full" * none - useful for apps that don't use any of the above Qt modules --> <meta-data android:name="android.app.extract_android_style" android:value="default"/> <!-- extract android style --> </activity> <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices --> <service android:name="my_package.MyFirebaseMessagingService"> <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/> </service> </application> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> </manifest>
Finally when I opened the app I visualize for 1 second a white screen, then a black screen for 1 second again then my Splash.qml item.
How could I remove these white and black screen at the beginning of the app?EDIT: I discovered that changing the image size in KB change the time that the black screen stay up on display (700KB 2 seconds~, 400KB a flash of 100 millisecond)
Here a link to the bug: https://drive.google.com/file/d/107STvnrNsYd-6GHJQDmWrBOj7XQPK-Fb/view?usp=sharing (in this case the image is in low res and the black flash last milliseconds)Thanks to everybody that want to help
-
On Android Qt application isn't a real application, its just a set of libs, that loaded after when initial activity starts. And this may take time, depending on different devices, this time may vary. So, as a result, you will see always an empty activity for a short period of time. The true way is to use system splash screen.
You can play withQtAndroid::hideSplashScreen
and splash screen 'life-time' to achieve different effects.