Come modificare un'icona di applicazione in modo programmato in Android?

È ansible cambiare un'icona di applicazione direttamente dal programma?
Voglio dire, cambiare icon.png nella cartella res\drawable .
Vorrei permettere agli utenti di cambiare l'icona dell'applicazione dal programma in modo che la prossima volta vedranno l'icona selezionata in precedenza nel lanciatore.

  • android mediaplayer stream file mp3 online
  • Eclipse ADT si blocca quando il completamento automatico di popup
  • Android Google Maps v2 permanent Marker InfoWindow
  • C'è codice per Snackbar in Android L o ci aspettiamo di implementarli?
  • Posso combinare il mio codice in qualche tipo di "attività globale"?
  • Con SAX Parser, ottieni il valore di un attributo
  • 9 Solutions collect form web for “Come modificare un'icona di applicazione in modo programmato in Android?”

    È una vecchia domanda, ma ancora triggers poiché non esiste una funzionalità Android esplicita. E i ragazzi di facebook trovarono un lavoro intorno – in qualche modo. Oggi ho trovato un modo che funziona per me. Non è perfetto (vedi commenti alla fine di questa risposta), ma funziona!

    L'idea principale è che aggiorni l'icona della scorciatoia di mia applicazione, creata dal lanciatore nella mia schermata iniziale. Quando voglio cambiare qualcosa sull'icona di collegamento, lo rimuovo prima e ricrea con una nuova bitmap.

    Ecco il codice. Ha un increment button. Quando viene premuto, la scorciatoia viene sostituita da quella che ha un nuovo numero di count.

    Innanzitutto hai bisogno di queste due autorizzazioni nel tuo manifesto:

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

    Allora avete bisogno di questi due methods per installare e disinstallare i collegamenti. Il metodo shortcutAdd crea una bitmap con un numero in esso. Questo è solo per dimostrare che cambia in realtà. Probabilmente vuoi cambiare quella parte con qualcosa che desideri nella tua app.

     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); } 

    E infine, qui ci sono due listener per aggiungere il primo collegamento e aggiornare la scorciatoia con un contatore incrementale.

     @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); } }); } 

    Osservazioni:

    • In questo modo funziona anche se l'applicazione controlla più scorciatoie sulla schermata iniziale, ad esempio con diversi extra nell'intento. Hanno solo bisogno di nomi diversi in modo che il diritto sia disinstallato e reinstallato.

    • La gestione programmata delle scorciatoie in Android è una funzionalità Android ben conosciuta, ampiamente usata ma non ufficiale. Sembra funzionare sul lanciatore predefinito e non l'ho mai provato altrove. Quindi non mi incolpa, quando ottieni questo email utente "Non funziona sul mio XYZ, telefono radicato a due radici e super"

    • Il lanciatore scrive un Toast quando è stato installato un collegamento e uno quando un collegamento è stato disinstallato. Così ho due Toast s each volta che cambio l'icona. Questo non è perfetto, ma bene, finché il resto della mia applicazione è perfetto …

    Prova questo, funziona bene per me =)

    1. Modifica la sezione MainActivity in AndroidManifest.xml, elimina da essa, linea con la categoria MAIN nella sezione filter intent

     <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. Crea <activity-alias> , per ognuna delle icone. Come questo

     <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. Impostare in modo programmato: impostare l'attributo ENABLE per l'alias attività appropriato

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

    Nota: alless uno deve essere abilitato in each momento.

    Non è ansible modificare il manifesto o la risorsa nell'APK firmato e sigillato, ad exception di un aggiornamento software.

    Programmaticamente, puoi pubblicare il lanciatore di applicazioni:

    Nel tuo AndroidManifest.xml, aggiungere:

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

    Quindi è necessario creare l'intenzione di lanciare l'applicazione:

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

    Crea un'intenzione di collegamento di installazione con il tuo lancio dell'applicazione e l'icona personalizzata:

     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"); 

    E infine lanciare l'intento di trasmissione:

     getApplicationContext().sendBroadcast(intent); 

    Supponendo che intendi cambiare l'icona mostrata sulla schermata iniziale, questo potrebbe essere facilmente fatto creando un widget che faccia esattamente questo. Ecco un articolo che dimostra come ciò possa essere realizzato per un'applicazione di tipo "nuovo messaggio" simile all'iPhone:

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

    La soluzione di PA funziona parzialmente per me. Dettaglio i miei risultati qui sotto:

    1) Il primo frammento di codice non è corretto, vedere di seguito:

     <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) Utilizzare il seguente codice per distriggersre tutte le icone prima di triggersre un'altra, altrimenti aggiungerà una nuova icona, anziché sostituirla.

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

    MA, se usi il codice qui sopra, allora la scorciatoia sullo schermo di home sarà rimossa! E non verrà aggiunto automaticamente. Potresti essere in grado di aggiungere l'icona a livello di programmazione, ma probabilmente non rimarrà nella stessa posizione di prima.

    3) Si noti che l'icona non verrà modificata immediatamente, potrebbe richiedere alcuni secondi. Se si fa clic su di esso subito dopo la modifica, potrebbe essere visualizzato un errore che dice: "L'applicazione non è installata".

    Quindi, IMHO questa soluzione è adatta solo per cambiare l'icona solo nel lancio di applicazioni, non per i collegamenti (cioè l'icona in home screen)

    Per get la soluzione da parte di Markus ho bisogno del primo intento così:

     Intent myLauncherIntent = new Intent(Intent.ACTION_MAIN); myLauncherIntent.setClassName(this, this.getClass().getName()); myLauncherIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Fare riferimento all'esempio

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

    Si prega quindi di seguire il codice riportto di seguito in MainActivity dopo aver riferito sopra la risposta

     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); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.