Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Android splashscreen remove white and black flashing
Qt 6.11 is out! See what's new in the release blog

Android splashscreen remove white and black flashing

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
2 Posts 2 Posters 1.1k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Manatee
    wrote on last edited by
    #1

    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 Splashscreen

        StackView
        {
            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

    1 Reply Last reply
    0
    • IntruderExcluderI Offline
      IntruderExcluderI Offline
      IntruderExcluder
      wrote on last edited by
      #2

      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 with QtAndroid::hideSplashScreen and splash screen 'life-time' to achieve different effects.

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved