Jak programowo zmienić ikonę aplikacji w systemie Android?

153

Czy można zmienić ikonę aplikacji bezpośrednio z programu?
Mam na myśli zmianę icon.pngw res\drawablefolderze.
Chciałbym umożliwić użytkownikom zmianę ikony aplikacji z poziomu programu, aby następnym razem zobaczyli wcześniej wybraną ikonę w programie uruchamiającym.

systempuntoout
źródło

Odpowiedzi:

79

To stare pytanie, ale nadal aktywne, ponieważ nie ma wyraźnej funkcji Androida. A faceci z facebooka znaleźli pracę - jakoś. Dziś znalazłem sposób, który działa dla mnie. Niezbyt idealne (zobacz uwagi na końcu odpowiedzi), ale działa!

Główną ideą jest to, że zaktualizuję ikonę skrótu do mojej aplikacji, utworzonego przez program uruchamiający na ekranie głównym. Kiedy chcę coś zmienić w ikonie skrótu, najpierw ją usuwam i odtwarzam z nową bitmapą.

Oto kod. Posiada przycisk increment. Po naciśnięciu skrót zostanie zastąpiony tym, który ma nowy numer zliczania.

Najpierw potrzebujesz tych dwóch uprawnień w swoim manifeście:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

Następnie potrzebujesz tych dwóch metod instalowania i odinstalowywania skrótów. shortcutAddMetoda tworzy bitmapę z numerem w nim. Ma to na celu tylko wykazanie, że faktycznie się zmienia. Prawdopodobnie chcesz zmienić tę część czymś, co chcesz w swojej aplikacji.

private void shortcutAdd(String name, int number) {
    // Intent to be send, when shortcut is pressed by user ("launched")
    Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
    shortcutIntent.setAction(Constants.ACTION_PLAY);

    // Create bitmap with number in it -> very default. You probably want to give it a more stylish look
    Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
    Paint paint = new Paint();
    paint.setColor(0xFF808080); // gray
    paint.setTextAlign(Paint.Align.CENTER);
    paint.setTextSize(50);
    new Canvas(bitmap).drawText(""+number, 50, 50, paint);
    ((ImageView) findViewById(R.id.icon)).setImageBitmap(bitmap);

    // Decorate the shortcut
    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap);

    // Inform launcher to create shortcut
    addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(addIntent);
}

private void shortcutDel(String name) {
    // Intent to be send, when shortcut is pressed by user ("launched")
    Intent shortcutIntent = new Intent(getApplicationContext(), Play.class);
    shortcutIntent.setAction(Constants.ACTION_PLAY);

    // Decorate the shortcut
    Intent delIntent = new Intent();
    delIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    delIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);

    // Inform launcher to remove shortcut
    delIntent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(delIntent);
}

Na koniec mamy dwóch słuchaczy, którzy dodają pierwszy skrót i zaktualizują skrót za pomocą rosnącego licznika.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.test);
    findViewById(R.id.add).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            shortcutAdd("changeIt!", count);
        }
    });
    findViewById(R.id.increment).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            shortcutDel("changeIt!");
            count++;
            shortcutAdd("changeIt!", count);
        }
    });
}

Uwagi:

  • Ten sposób działa również wtedy, gdy Twoja aplikacja kontroluje więcej skrótów na ekranie głównym, np. Z różnymi dodatkami w Intent. Potrzebują tylko różnych nazw, aby właściwa została odinstalowana i ponownie zainstalowana.

  • Programowa obsługa skrótów w systemie Android to dobrze znana, szeroko stosowana, ale nieoficjalnie obsługiwana funkcja systemu Android. Wygląda na to, że działa na domyślnym programie uruchamiającym i nigdy nie próbowałem tego nigdzie indziej. Więc nie obwiniaj mnie, kiedy otrzymujesz te e-maile od użytkowników „To nie działa na moim XYZ, podwójnie zrootowanym, super przeklętym telefonie”

  • Program uruchamiający zapisuje komunikat, Toastgdy skrót został zainstalowany, a drugi, gdy został odinstalowany. Więc za Toastkażdym razem, gdy zmieniam ikonę, dostaję dwie sekundy. To nie jest idealne, ale cóż, o ile reszta mojej aplikacji jest idealna ...

jboi
źródło
9
Dzisiejsza aplikacja Kalendarz wyświetla ikony codziennie bez toastu.
Jim McKeeth
1
@ Jim (myślę), że to właściwie widżet
JacksOnF1re,
3
shortcutDel niestety nie działa już w Marshmallow, zobacz także stackoverflow.com/a/33731620/1545993
Taifun.
2
Zastępuje to ikonę skrótu, a nie ikonę programu uruchamiającego
user1506104
3
W poniższych wierszach co to jest Play.class i Constants.ACTION_PLAY Intent shortcutIntent = new Intent (getApplicationContext (), Play.class); shortcutIntent.setAction (Constants.ACTION_PLAY);
Dasharath Singh Bajroliya
136

Spróbuj tego, to działa dobrze dla mnie:

1. Zmodyfikuj swoją MainActivitysekcję w AndroidManifest.xml, usuń z niej, wiersz z MAINkategorią w intent-filtersekcji

<activity android:name="ru.quickmessage.pa.MainActivity"
    android:configChanges="keyboardHidden|orientation"
    android:screenOrientation="portrait"
    android:label="@string/app_name"
    android:theme="@style/CustomTheme"
    android:launchMode="singleTask">
    <intent-filter>
        ==> <action android:name="android.intent.action.MAIN" /> <== Delete this line
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

2. Utwórz <activity-alias>dla każdej ze swoich ikon. Lubię to

<activity-alias android:label="@string/app_name" 
    android:icon="@drawable/icon" 
    android:name=".MainActivity-Red"
    android:enabled="false"
    android:targetActivity=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>   
</activity-alias>

3. Ustaw programowo: ustaw atrybut ENABLE na odpowiedniactivity-alias

 getPackageManager().setComponentEnabledSetting(
        new ComponentName("ru.quickmessage.pa", "ru.quickmessage.pa.MainActivity-Red"), 
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

Uwaga: co najmniej jeden musi być zawsze włączony.

ROCZNIE
źródło
3
niestety działa inaczej na różnych urządzeniach, które wypróbowałem. Działa na HTC Desire 2.2, ale zawodny na Galaxy Nexus 4.2.2 i Nexus 7 4.3. Na Galaxy Nexus może to spowodować zniknięcie wszystkich ikon aplikacji, a także usunięcie wszelkich widżetów. Szkoda, więc musiałem usunąć tę funkcjonalność na późniejszych urządzeniach.
Richard Le Mesurier
7
Nie mogę uruchomić mojej aplikacji, odkąd to
usunąłem
1
Działa to idealnie w przypadku przełączania się między ikonami programu uruchamiającego w zasobniku aplikacji i na ekranie głównym, ale zauważyłem, że ikona używana na poziomie systemu operacyjnego (na przykład w przypadku wielozadaniowości, wyskakującego okienka dezinstalacji lub na liście Menedżera aplikacji) pozostaje oryginalna lub stanie się domyślną ogólną ikoną Androida, jeśli nie ustawisz jej na poziomie aplikacji w manifeście. Czy znalazłeś rozwiązanie tego problemu, czy po prostu tolerujesz niedopasowanie (lub brak) w ikonie na poziomie systemu operacyjnego?
jokeefe
2
Błąd podczas uruchamiania aplikacji. Nie znaleziono domyślnej aktywności.
CopsOnRoad
1
Błąd podczas uruchamiania aplikacji. Nie znaleziono domyślnej aktywności
Kamil Ibadov
36

Nie możesz zmienić manifestu ani zasobu w podpisanym i zapieczętowanym pliku APK, chyba że poprzez uaktualnienie oprogramowania.

CommonsWare
źródło
2
@Nanne: To widżet aplikacji lub funkcja ekranu głównego, a nie ikona aplikacji. Nadal nie można zmienić manifestu ani zasobu, chyba że poprzez aktualizację oprogramowania.
CommonsWare,
1
? Nie, mam na myśli odwrotnie: to nie jest (reklamowany jako) widget. Dodaję to jako skrót do aplikacji. Ale, jak mówisz, tylko dlatego, że ten nonstock rzeczy implikuje jej tylko ikonę, to nie znaczy, że jest :)
Nanne
2
@NeTeInStEiN: Nie będzie działać na wszystkich ekranach głównych (np. Tych, które nie zwracają uwagi na zmiany włączone przez komponenty).
CommonsWare
1
To już nieprawda. Kalendarz Google na Androida 6+ zmienia się codziennie w programie uruchamiającym. Dziś ikona to „2”, wczoraj była to „1”. Zwykle na ikonie znajdowała się „31”. Ale już nie, to się zmienia. Czy ktoś wie, jak to jest możliwe?
UeliDeSchwert
1
@Bobby: Mam na myśli to, że w Sklepie Play są setki, jeśli nie tysiące, implementacji ekranu głównego, oprócz setek różnych wstępnie zainstalowanych ekranów głównych w tysiącach istniejących modeli urządzeń z Androidem. Te implementacje ekranu głównego są mile widziane z zaczepami, które umożliwiają dynamiczną wymianę ikony programu uruchamiającego. Jednak nie wszystkie ekrany główne muszą to oferować. To, że widzisz to zachowanie dla jednej aplikacji na jednym ekranie głównym na jednym urządzeniu, nie oznacza, że ​​jest ono dostępne dla wszystkich aplikacji na wszystkich ekranach głównych na wszystkich urządzeniach.
CommonsWare
17

Programowo możesz chcieć samodzielnie opublikować program uruchamiający aplikacje:

Uwaga: ta metoda nie działa już od Androida 8.0 - Oreo

W pliku AndroidManifest.xml dodaj:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>

Następnie musisz utworzyć intencję uruchamiania aplikacji:

Intent myLauncherIntent = new Intent();
myLauncherIntent.setClassName("your.package.name", "YourLauncherActivityName");
myLauncherIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Utwórz intencję skrótu instalacji za pomocą programu uruchamiającego aplikacje i niestandardowej ikony:

Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, myLauncherIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Application Name");
intent.putExtra
       (
        Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
        Intent.ShortcutIconResource.fromContext
                                    (
                                         getApplicationContext(), 
                                         R.drawable.app_icon
                                    )
       );
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

I wreszcie uruchom zamiar transmisji:

getApplicationContext().sendBroadcast(intent);
Andrei Marcut
źródło
Zastępuje to ikonę skrótu, a nie ikonę programu uruchamiającego
user1506104
10

Zakładając, że masz na myśli zmianę ikony wyświetlanej na ekranie głównym, można to łatwo zrobić, tworząc widżet, który robi dokładnie to. Oto artykuł, który pokazuje, jak można to zrobić w przypadku aplikacji typu „nowe wiadomości” podobnej do iPhone'a:

http://www.cnet.com/8301-19736_1-10278814-251.html

Marius Kjeldahl
źródło
9

Rozwiązanie @ PA częściowo działa dla mnie. Poniżej szczegółowo opisuję moje ustalenia:

1) Pierwszy fragment kodu jest nieprawidłowy, patrz poniżej:

<activity
    ...
    <intent-filter>
        ==> <action android:name="android.intent.action.MAIN" /> <== This line shouldn't be deleted, otherwise will have compile error
        <category android:name="android.intent.category.LAUNCHER" /> //DELETE THIS LINE
    </intent-filter>
</activity>

2) Powinien użyć poniższego kodu, aby wyłączyć wszystkie ikony przed włączeniem kolejnej, w przeciwnym razie doda nową ikonę zamiast ją zastępować.

getPackageManager().setComponentEnabledSetting(
        getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

ALE, jeśli użyjesz powyższego kodu, skrót na ekranie głównym zostanie usunięty! I nie zostanie automatycznie dodany z powrotem. Możesz być w stanie programowo dodać ikonę z powrotem, ale prawdopodobnie nie pozostanie w tej samej pozycji, co wcześniej.

3) Pamiętaj, że ikona nie zmieni się natychmiast, może to zająć kilka sekund. Jeśli klikniesz go zaraz po zmianie, może pojawić się komunikat o błędzie: „Aplikacja nie jest zainstalowana”.

Tak więc, IMHO to rozwiązanie nadaje się tylko do zmiany ikony tylko w programie uruchamiającym aplikacje, a nie do skrótów (np. Ikona na ekranie głównym)

Deqing
źródło
2
Błąd podczas uruchamiania aplikacji. Nie znaleziono domyślnej aktywności.
CopsOnRoad
usuniesz program uruchamiający, w jaki sposób znajdzie domyślną aktywność @Deqing?
j2emanue,
5

Wypróbuj to rozwiązanie

<activity android:name=".SplashActivity"
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity-alias android:label="ShortCut"
        android:icon="@drawable/ic_short_cut"
        android:name=".SplashActivityAlias"
        android:enabled="false"
        android:targetActivity=".SplashActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>

Dodaj następujący kod, jeśli chcesz zmienić ikonę aplikacji

PackageManager pm = getPackageManager();
                    pm.setComponentEnabledSetting(
                            new ComponentName(YourActivity.this,
                                    "your_package_name.SplashActivity"),
                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                            PackageManager.DONT_KILL_APP);

                    pm.setComponentEnabledSetting(
                            new ComponentName(YourActivity.this,
                                    "your_package_name.SplashActivityAlias"),
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                            PackageManager.DONT_KILL_APP);
Faxriddin Abdullayev
źródło
4

AndroidManifest.xml przykład:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name="com.pritesh.resourceidentifierexample.MainActivity"
                  android:label="@string/app_name"
                  android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <!--<category android:name="android.intent.category.LAUNCHER"/>-->
            </intent-filter>
        </activity>

        <activity-alias android:label="RED"
                        android:icon="@drawable/ic_android_red"
                        android:name="com.pritesh.resourceidentifierexample.MainActivity-Red"
                        android:enabled="true"
                        android:targetActivity="com.pritesh.resourceidentifierexample.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="GREEN"
                        android:icon="@drawable/ic_android_green"
                        android:name="com.pritesh.resourceidentifierexample.MainActivity-Green"
                        android:enabled="false"
                        android:targetActivity="com.pritesh.resourceidentifierexample.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="BLUE"
                        android:icon="@drawable/ic_android_blue"
                        android:name="com.pritesh.resourceidentifierexample.MainActivity-Blue"
                        android:enabled="false"
                        android:targetActivity="com.pritesh.resourceidentifierexample.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

    </application>

Następnie postępuj zgodnie z poniższym kodem w MainActivity:

ImageView imageView = (ImageView)findViewById(R.id.imageView);
            int imageResourceId;
            String currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date());
            int hours = new Time(System.currentTimeMillis()).getHours();
            Log.d("DATE", "onCreate: "  + hours);

            getPackageManager().setComponentEnabledSetting(
                    getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

            if(hours == 13)
            {
                imageResourceId = this.getResources().getIdentifier("ic_android_red", "drawable", this.getPackageName());
                getPackageManager().setComponentEnabledSetting(
                        new ComponentName("com.pritesh.resourceidentifierexample", "com.pritesh.resourceidentifierexample.MainActivity-Red"),
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
            }else if(hours == 14)
            {
                imageResourceId = this.getResources().getIdentifier("ic_android_green", "drawable", this.getPackageName());
                getPackageManager().setComponentEnabledSetting(
                        new ComponentName("com.pritesh.resourceidentifierexample", "com.pritesh.resourceidentifierexample.MainActivity-Green"),
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

            }else
            {
                imageResourceId = this.getResources().getIdentifier("ic_android_blue", "drawable", this.getPackageName());
                getPackageManager().setComponentEnabledSetting(
                        new ComponentName("com.pritesh.resourceidentifierexample", "com.pritesh.resourceidentifierexample.MainActivity-Blue"),
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

            }

            imageView.setImageResource(imageResourceId);
Pritesh Patel
źródło
Dostaję com.pritesh.resourceidentifierexample.MainActivity-Red doesn't exist in com.pritesh.resourceidentifierexamplewyjątek. tutaj użyłem twojego manifestu, żeby zademonstrować mój problem
Tejas Pandya
0

Aby uzyskać rozwiązanie Markusa, potrzebowałem pierwszej intencji, więc:

Intent myLauncherIntent = new Intent(Intent.ACTION_MAIN);
            myLauncherIntent.setClassName(this,  this.getClass().getName());
            myLauncherIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PuZZleDucK
źródło
0

Stosując wspomniane sugestie, spotkałem się z problemem zabijania aplikacji, gdy ikona domyślna zostanie zmieniona na nową. Więc zaimplementowałem kod z kilkoma poprawkami. Krok 1). W pliku AndroidManifest.xml utwórz dla domyślnej aktywności z android: enabled = "true" i innym aliasem z android: enabled = "false". Twoje nie będą zawierały, ale dołączały te z android: enabled = "true".

       <activity
        android:name=".activities.SplashActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">

    </activity>
    <!-- <activity-alias used to change app icon dynamically>   : default icon, set enabled true    -->
    <activity-alias
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:name=".SplashActivityAlias1" <!--put any random name started with dot-->
        android:enabled="true"
        android:targetActivity=".activities.SplashActivity"> <!--target activity class path will be same for all alias-->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>
    <!-- <activity-alias used to change app icon dynamically>  : sale icon, set enabled false initially -->
    <activity-alias
        android:label="@string/app_name"
        android:icon="@drawable/ic_store_marker"
        android:roundIcon="@drawable/ic_store_marker"
        android:name=".SplashActivityAlias" <!--put any random name started with dot-->
        android:enabled="false"
        android:targetActivity=".activities.SplashActivity"> <!--target activity class path will be same for all alias-->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>

Krok 2). Utwórz metodę, która będzie używana do wyłączania pierwszego aliasu czynności zawierającego domyślną ikonę i włączania drugiego aliasu zawierającego ikonę, która musi zostać zmieniona.

/**
 * method to change the app icon dynamically
 *
 * @param context
 * @param isNewIcon  : true if new icon need to be set; false to set default 
 * icon
 */

public static void changeAppIconDynamically(Context context, boolean isNewIcon) {
    PackageManager pm = context.getApplicationContext().getPackageManager();
    if (isNewIcon) {
        pm.setComponentEnabledSetting(
                new ComponentName(context,
                        "com.example.dummy.SplashActivityAlias1"), //com.example.dummy will be your package
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

        pm.setComponentEnabledSetting(
                new ComponentName(context,
                        "com.example.dummy.SplashActivityAlias"),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
    } else {
        pm.setComponentEnabledSetting(
                new ComponentName(context,
                        "com.example.dummy.SplashActivityAlias1"),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);

        pm.setComponentEnabledSetting(
                new ComponentName(context,
                        "com.example.dummy.SplashActivityAlias"),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
    }
}

Krok 3). Teraz wywołaj tę metodę w zależności od wymagań, powiedz po kliknięciu przycisku lub konkretnej dacie lub specyficznych warunkach okazji, po prostu jak -

// Switch app icon to new icon
    GeneralUtils.changeAppIconDynamically(EditProfileActivity.this, true);
// Switch app icon to default icon
            GeneralUtils.changeAppIconDynamically(EditProfileActivity.this, false);

Mam nadzieję, że pomoże to tym, którzy zmierzą się z problemem zabijania aplikacji przy zmianie ikony. Miłego kodowania :)

Abhijeet
źródło