Unity: How to Change App Icon Dynamically Without Duplication

39 views Asked by At

I am developing a feature to change the app icon in my Android app. However, I am facing an issue where the app icon is duplicated in all cases except when changing the default icon.

Desired Behavior:

When the app icon is changed, only one icon should be displayed without any duplication.

Problem Description:

I am using the LauncherIcons class to change the app icon and have tried various options to set the icon. I have also cleared the cache and rebooted the device, but the issue persists.

Request for Help:

How to solve the app icon duplication issue? How to change the app icon without duplication? Any relevant code or configuration information?

Thank you in advance for your help.

Select Immediately After Installation and Main Activity

Select OneLauncher Alias (change app icon)

MainActivity in Android Studio Project:

public void ChangeIcon(Context context, String[] iconList, String iconType) throws IOException, ClassNotFoundException {
        PackageManager manager = context.getPackageManager();

        ComponentName mainComponentName = getComponentName();


        int actionType = 0;

        for (int i = 0; i < iconList.length; i++) {
            if (iconList[i].equals(iconType)) {
                actionType = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
            } else {
                actionType = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
            }

            String packageName = String.format("%s.%s", getClass().getPackage().getName(), iconList[i]);
            ComponentName componentName = new ComponentName(context, packageName);
            manager.setComponentEnabledSetting(new ComponentName(context, String.format("%s.%s", getClass().getPackage().getName(), iconList[i])),
                    actionType, PackageManager.DONT_KILL_APP);
        }
    }

AndroidManifest.xml in Android Studio Project:

<?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:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">
        <activity
            android:name=".MainActivity"
            android:exported="true">

        </activity>

        <activity-alias
            android:name=".OneLauncherAlias"
            android:enabled="false"
            android:exported="true"
            android:icon="@drawable/testicon_1"
            android:label="@string/app_name"
            android:targetActivity=".MainActivity">

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

        </activity-alias>

        <activity-alias
            android:name=".TwoLauncherAlias"
            android:enabled="false"
            android:exported="true"
            android:icon="@drawable/testicon_2"
            android:label="@string/app_name"
            android:targetActivity=".MainActivity">

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

        </activity-alias>

        <activity-alias
            android:name=".ThreeLauncherAlias"
            android:enabled="false"
            android:exported="true"
            android:icon="@drawable/testicon_3"
            android:label="@string/app_name"
            android:targetActivity=".MainActivity">

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

        </activity-alias>
    </application>


</manifest>

AppIconChange in Unity Project:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TestScript : MonoBehaviour
{
    public Button _toast;
    public Button _main;
    public Button _appIcon01;
    public Button _appIcon02;
    public Button _appIcon03;

    private AndroidJavaObject activityContext = null;
    private AndroidJavaClass javaClass = null;
    private AndroidJavaObject javaClassInstance = null;
    private string[] IconTypeArr = { "MainActivity", "OneLauncherAlias", "TwoLauncherAlias", "ThreeLauncherAlias" };

    private void Awake()
    {
        using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
        }

        using (javaClass = new AndroidJavaClass("com.test.testApp.player.MainActivity"))
        {
            if (javaClass != null)
            {
                javaClassInstance = javaClass.CallStatic<AndroidJavaObject>("instance");
            }
        }

        _toast.onClick.AddListener(OnClickToast);
        _main.onClick.AddListener(OnClickChangeAppIcon_Main);
        _appIcon01.onClick.AddListener(OnClickChangeAppIcon_1);
        _appIcon02.onClick.AddListener(OnClickChangeAppIcon_2);
        _appIcon03.onClick.AddListener(OnClickChangeAppIcon_3);
    }

    private void OnClickToast()
    {
        javaClassInstance.Call("ShowToast", activityContext, "테스트 토스트 메세지 출력 ^^");
    }

    private void OnClickChangeAppIcon_Main()
    {
        javaClassInstance.Call("ChangeIcon", activityContext, IconTypeArr, "MainActivity");
        javaClassInstance.Call("ShowToast", activityContext, "기본 앱 아이콘으로 변경");
    }

    private void OnClickChangeAppIcon_1()
    {
        javaClassInstance.Call("ChangeIcon", activityContext, IconTypeArr, "OneLauncherAlias");
        javaClassInstance.Call("ShowToast", activityContext, "커스텀 아이콘 1번으로 변경");
    }

    private void OnClickChangeAppIcon_2()
    {
        javaClassInstance.Call("ChangeIcon", activityContext, IconTypeArr, "TwoLauncherAlias");
        javaClassInstance.Call("ShowToast", activityContext, "커스텀 아이콘 2번으로 변경");
    }

    private void OnClickChangeAppIcon_3()
    {
        javaClassInstance.Call("ChangeIcon", activityContext, IconTypeArr, "ThreeLauncherAlias");
        javaClassInstance.Call("ShowToast", activityContext, "커스텀 아이콘 3번으로 변경");
    }
}

Adding follow intent-filter in activity "MainActivity", but still occured issue.

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

There are 0 answers