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. shortcutAdd
Metoda 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, Toast
gdy skrót został zainstalowany, a drugi, gdy został odinstalowany. Więc za Toast
każdym razem, gdy zmieniam ikonę, dostaję dwie sekundy. To nie jest idealne, ale cóż, o ile reszta mojej aplikacji jest idealna ...
Spróbuj tego, to działa dobrze dla mnie:
1. Zmodyfikuj swoją
MainActivity
sekcję wAndroidManifest.xml
, usuń z niej, wiersz zMAIN
kategorią wintent-filter
sekcji2. Utwórz
<activity-alias>
dla każdej ze swoich ikon. Lubię to3. Ustaw programowo: ustaw atrybut ENABLE na odpowiedni
activity-alias
Uwaga: co najmniej jeden musi być zawsze włączony.
źródło
Nie możesz zmienić manifestu ani zasobu w podpisanym i zapieczętowanym pliku APK, chyba że poprzez uaktualnienie oprogramowania.
źródło
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:
Następnie musisz utworzyć intencję uruchamiania aplikacji:
Utwórz intencję skrótu instalacji za pomocą programu uruchamiającego aplikacje i niestandardowej ikony:
I wreszcie uruchom zamiar transmisji:
źródło
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
źródło
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:
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ć.
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)
źródło
Wypróbuj to rozwiązanie
Dodaj następujący kod, jeśli chcesz zmienić ikonę aplikacji
źródło
AndroidManifest.xml
przykład:Następnie postępuj zgodnie z poniższym kodem w
MainActivity
:źródło
com.pritesh.resourceidentifierexample.MainActivity-Red doesn't exist in com.pritesh.resourceidentifierexample
wyjątek. tutaj użyłem twojego manifestu, żeby zademonstrować mój problemAby uzyskać rozwiązanie Markusa, potrzebowałem pierwszej intencji, więc:
źródło
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".
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.
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 -
Mam nadzieję, że pomoże to tym, którzy zmierzą się z problemem zabijania aplikacji przy zmianie ikony. Miłego kodowania :)
źródło