C'est une vieille question, mais toujours active car il n'y a pas de fonctionnalité Android explicite. Et les gars de Facebook ont trouvé un travail - en quelque sorte. Aujourd'hui, j'ai trouvé un moyen qui fonctionne pour moi. Pas parfait (voir remarques à la fin de cette réponse) mais ça marche!
L'idée principale est de mettre à jour l'icône du raccourci de mon application, créée par le lanceur sur mon écran d'accueil. Lorsque je veux changer quelque chose sur l'icône de raccourci, je le supprime d'abord et le recrée avec un nouveau bitmap.
Voici le code. Il a un bouton increment
. Lorsqu'il est enfoncé, le raccourci est remplacé par un raccourci doté d'un nouveau numéro de comptage.
Vous avez d'abord besoin de ces deux autorisations dans votre manifeste:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
Ensuite, vous avez besoin de ces deux méthodes pour installer et désinstaller des raccourcis. La shortcutAdd
méthode crée une image bitmap contenant un nombre. C'est juste pour démontrer que cela change réellement. Vous voulez probablement changer cette partie avec quelque chose que vous voulez dans votre application.
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);
}
Et enfin, voici deux écouteurs pour ajouter le premier raccourci et mettre à jour le raccourci avec un compteur incrémentiel.
@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);
}
});
}
Remarques:
Cette méthode fonctionne également si votre application contrôle plus de raccourcis sur l'écran d'accueil, par exemple avec différents extras dans le Intent
. Ils ont juste besoin de noms différents pour que le bon soit désinstallé et réinstallé.
La gestion programmatique des raccourcis sous Android est une fonctionnalité Android bien connue, largement utilisée mais non officiellement prise en charge. Cela semble fonctionner sur le lanceur par défaut et je ne l'ai jamais essayé nulle part ailleurs. Alors ne me blâmez pas, lorsque vous recevez ces e-mails d'utilisateur "Cela ne fonctionne pas sur mon téléphone XYZ, double rooté, super foutu"
Le lanceur écrit un Toast
lorsqu'un raccourci a été installé et un autre lorsqu'un raccourci a été désinstallé. Je reçois donc deux Toast
s à chaque fois que je change d'icône. Ce n'est pas parfait, mais bon, tant que le reste de mon application est parfait ...
Essayez ceci, cela fonctionne bien pour moi:
1 . Modifiez votre
MainActivity
section dansAndroidManifest.xml
, supprimez-la, ligne avecMAIN
catégorie dansintent-filter
section2. Créez
<activity-alias>
, pour chacune de vos icônes. Comme ça3. Définir par programme: définissez l'attribut ENABLE pour le
activity-alias
Remarque, au moins un doit être activé à tout moment.
la source
Vous ne pouvez pas modifier le manifeste ou la ressource dans l'APK signé et scellé, sauf par le biais d'une mise à niveau logicielle.
la source
Par programme, vous souhaiterez peut-être publier vous-même le lanceur d'applications:
Remarque: cette méthode ne fonctionne plus à partir d'Android 8.0 - Oreo
Dans votre AndroidManifest.xml, ajoutez:
Ensuite, vous devez créer votre intention de lanceur d'applications:
Créez une intention de raccourci d'installation avec votre lanceur d'application et l'icône personnalisée:
Et enfin lancez l'intention de diffusion:
la source
En supposant que vous vouliez dire changer l'icône affichée sur l'écran d'accueil, cela pourrait facilement être fait en créant un widget qui fait exactement cela. Voici un article qui montre comment cela peut être accompli pour une application de type "nouveaux messages" similaire à l'iPhone:
http://www.cnet.com/8301-19736_1-10278814-251.html
la source
La solution de @ PA fonctionne partiellement pour moi. Détaillez mes conclusions ci-dessous:
1) Le premier extrait de code est incorrect, voir ci-dessous:
2) Devrait utiliser le code suivant pour désactiver toutes les icônes avant d'en activer une autre, sinon il ajoutera une nouvelle icône, au lieu de la remplacer.
MAIS, si vous utilisez le code ci-dessus, le raccourci sur l'écran d'accueil sera supprimé! Et il ne sera pas automatiquement ajouté. Vous pourrez peut-être ajouter une icône par programme, mais elle ne restera probablement pas dans la même position qu'avant.
3) Notez que l'icône ne sera pas modifiée immédiatement, cela peut prendre plusieurs secondes. Si vous cliquez dessus juste après la modification, vous pourriez obtenir une erreur disant: "L'application n'est pas installée".
Donc, à mon humble avis, cette solution ne convient que pour changer d'icône dans le lanceur d'application uniquement, pas pour les raccourcis (c'est-à-dire l'icône sur l'écran d'accueil)
la source
Essayez cette solution
Ajoutez le code suivant lorsque vous souhaitez modifier l'icône de votre application
la source
AndroidManifest.xml
exemple:Ensuite, suivez le code ci-dessous dans
MainActivity
:la source
com.pritesh.resourceidentifierexample.MainActivity-Red doesn't exist in com.pritesh.resourceidentifierexample
exception. ici, j'ai utilisé votre nom manifeste juste pour démontrer mon problèmePour que la solution de Markus fonctionne, j'avais besoin de la première intention, alors soyez:
la source
En appliquant les suggestions mentionnées, j'ai rencontré le problème de la suppression de l'application chaque fois que l'icône par défaut est remplacée par une nouvelle icône. J'ai donc implémenté le code avec quelques ajustements. Étape 1). Dans le fichier AndroidManifest.xml, créez pour l'activité par défaut avec android: enabled = "true" et autre alias avec android: enabled = "false". Votre ne contiendra pas mais les ajoutera avec android: enabled = "true".
Étape 2). Créez une méthode qui sera utilisée pour désactiver le 1er alias d'activité qui contient l'icône par défaut et activer le 2ème alias qui contient l'icône doit être changé.
Étape 3). Maintenant, appelez cette méthode en fonction de vos besoins, par exemple, un clic sur un bouton ou des conditions spécifiques à une date ou à une occasion, simplement comme -
J'espère que cela aidera ceux qui sont confrontés au problème de la mort d'une application lors du changement d'icône. Bon codage :)
la source