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
Forum Updated to NodeBB v4.3 + New Features

Android splashscreen remove white and black flashing

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
2 Posts 2 Posters 493 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