Es una pregunta antigua, pero aún activa, ya que no hay una función explícita de Android. Y los chicos de Facebook encontraron una solución, de alguna manera. Hoy, encontré una manera que funciona para mí. No es perfecto (vea las observaciones al final de esta respuesta) ¡pero funciona!
La idea principal es que actualizo el icono del acceso directo de mi aplicación, creado por el iniciador en mi pantalla de inicio. Cuando quiero cambiar algo en el icono de acceso directo, lo elimino primero y lo vuelvo a crear con un nuevo mapa de bits.
Aquí está el código. Tiene un botón increment
. Cuando se presiona, el acceso directo se reemplaza por uno que tiene un nuevo número de conteo.
Primero necesita estos dos permisos en su manifiesto:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
Entonces necesita estos dos métodos para instalar y desinstalar accesos directos. El shortcutAdd
método crea un mapa de bits con un número. Esto es solo para demostrar que realmente cambia. Probablemente quieras cambiar esa parte con algo que quieras en tu aplicación.
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);
}
Y finalmente, aquí hay dos oyentes para agregar el primer acceso directo y actualizar el acceso directo con un contador incremental.
@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);
}
});
}
Observaciones:
Esta manera también funciona si su aplicación controla más accesos directos en la pantalla de inicio, por ejemplo, con diferentes extras en el Intent
. Solo necesitan nombres diferentes para que se desinstale y reinstale el correcto.
El manejo programático de accesos directos en Android es una característica de Android bien conocida, ampliamente utilizada pero no oficialmente compatible. Parece funcionar en el iniciador predeterminado y nunca lo probé en ningún otro lado. Así que no me culpen, cuando reciban estos correos electrónicos de usuario "No funciona en mi teléfono XYZ, doble rooteado, súper arruinado"
El iniciador escribe un Toast
cuando se instaló un acceso directo y uno cuando se desinstaló un acceso directo. Entonces obtengo dos Toast
s cada vez que cambio el ícono. Esto no es perfecto, pero bueno, siempre y cuando el resto de mi aplicación sea perfecta ...
Prueba esto, funciona bien para mí:
1) Modifique su
MainActivity
secciónAndroidManifest.xml
, elimínela, alinee con laMAIN
categoría en laintent-filter
sección2) Crea
<activity-alias>
, para cada uno de tus íconos. Me gusta esto3) Establecer mediante programación: establecer el atributo ENABLE para el apropiado
activity-alias
Tenga en cuenta que al menos uno debe estar habilitado en todo momento.
fuente
No puede cambiar el manifiesto o el recurso en el APK firmado y sellado, excepto a través de una actualización de software.
fuente
Programáticamente, es posible que desee publicar el iniciador de la aplicación usted mismo:
Nota: este método ya no funciona a partir de Android 8.0 - Oreo
En su AndroidManifest.xml, agregue:
Entonces necesitas crear tu intención de iniciador de aplicaciones:
Cree una intención de acceso directo de instalación con el iniciador de su aplicación y el icono personalizado:
Y finalmente lanzar la intención de transmisión:
fuente
Suponiendo que quiere decir cambiar el icono que se muestra en la pantalla de inicio, esto podría hacerse fácilmente creando un widget que haga exactamente esto. Aquí hay un artículo que demuestra cómo se puede lograr para una aplicación de tipo "mensajes nuevos" similar a iPhone:
http://www.cnet.com/8301-19736_1-10278814-251.html
fuente
La solución de @ PA me funciona parcialmente. Detalla mis hallazgos a continuación:
1) El primer fragmento de código es incorrecto, vea a continuación:
2) Debe usar el siguiente código para deshabilitar todos los íconos antes de habilitar otro, de lo contrario agregará un ícono nuevo, en lugar de reemplazarlo.
PERO, si usa el código anterior, ¡se eliminará el acceso directo en la pantalla de inicio! Y no se volverá a agregar automáticamente. Es posible que pueda volver a agregar el icono mediante programación, pero probablemente no se mantendrá en la misma posición que antes.
3) Tenga en cuenta que el ícono no cambiará de inmediato, puede tomar varios segundos. Si hace clic justo después de cambiar, puede recibir un error que dice: "La aplicación no está instalada".
Entonces, en mi humilde opinión, esta solución solo es adecuada para cambiar el ícono solo en el iniciador de aplicaciones, no para los accesos directos (es decir, el ícono en la pantalla de inicio)
fuente
Prueba esta solución
Agregue el siguiente código cuando desee cambiar el ícono de su aplicación
fuente
AndroidManifest.xml
ejemplo:Luego siga el código dado a continuación en
MainActivity
:fuente
com.pritesh.resourceidentifierexample.MainActivity-Red doesn't exist in com.pritesh.resourceidentifierexample
excepción. aquí he usado tu nombre de manifiesto solo para demostrar mi problemaPara que Markus funcionara, necesitaba la primera intención:
fuente
Aplicando las sugerencias mencionadas, me he enfrentado al problema de que la aplicación sea eliminada cada vez que el ícono predeterminado se cambia a nuevo. Así que he implementado el código con algunos ajustes. Paso 1). En el archivo AndroidManifest.xml, cree una actividad predeterminada con android: enabled = "true" y otros alias con android: enabled = "false". Tu no contendrá pero agregará aquellos con android: enabled = "true".
Paso 2). Cree un método que se utilizará para deshabilitar el primer alias de actividad que contiene el ícono predeterminado y habilitar el segundo alias que contiene el ícono debe cambiarse.
Paso 3). Ahora llame a este método según sus requisitos, digamos al hacer clic en el botón o en una fecha específica o en condiciones específicas de la ocasión, simplemente como -
Espero que esto ayude a aquellos que enfrentan el problema de que la aplicación muera en el cambio de ícono. Happy Coding :)
fuente