Это старый вопрос, но он все еще активен, поскольку в нем нет явной функции Android. А ребята из фейсбука нашли обходной путь - как-то. Сегодня я нашел способ, который работает для меня. Не идеально (см. Примечания в конце этого ответа), но это работает!
Основная идея заключается в том, что я обновляю значок ярлыка моего приложения, созданный средством запуска на домашнем экране. Когда я хочу что-то изменить на ярлыке, я сначала удаляю его и воссоздаю с новым растровым изображением.
Вот код У него есть кнопка increment
. При нажатии ярлык заменяется на новый, имеющий новый счетный номер.
Сначала вам понадобятся эти два разрешения в вашем манифесте:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
Затем вам нужно это два метода для установки и удаления ярлыков. shortcutAdd
Метод создает битовую карту с номером в нем. Это просто чтобы продемонстрировать, что это действительно меняется. Вы, вероятно, хотите изменить эту часть с чем-то, что вы хотите в своем приложении.
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);
}
И наконец, вот два слушателя, которые добавляют первый ярлык и обновляют ярлык с помощью увеличивающегося счетчика.
@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);
}
});
}
Примечания:
Этот способ работает также, если ваше приложение контролирует больше ярлыков на главном экране, например, с различными дополнительными функциями в Intent
. Им просто нужны разные имена, так что правильное имя удаляется и переустанавливается.
Программная обработка ярлыков в Android - это широко известная, широко используемая, но официально не поддерживаемая функция Android. Кажется, он работает на лончере по умолчанию, и я никогда не пробовал его нигде. Так что не вините меня, когда вы получаете это электронное письмо пользователя "Это не работает на моем XYZ, телефон с двойным рутом, супер взорван"
Модуль запуска записывает, Toast
когда ярлык был установлен, и один, когда ярлык был удален. Таким образом, я получаю два Toast
с каждый раз, когда я меняю значок. Это не идеально, но хорошо, пока остальная часть моего приложения идеально ...
Попробуйте это, у меня это нормально работает:
1 Изменить свой
MainActivity
раздел вAndroidManifest.xml
, удалить из него, строка сMAIN
категорией вintent-filter
разделе2 Создайте
<activity-alias>
для каждой из ваших иконок. Как это3 Установить программно: установить атрибут ENABLE для соответствующего
activity-alias
Обратите внимание, по крайней мере, один должен быть включен всегда.
источник
Вы не можете изменить манифест или ресурс в подписанном и запечатанном APK, кроме как через обновление программного обеспечения.
источник
С программной точки зрения вы можете самостоятельно опубликовать панель запуска приложений:
Примечание: этот метод больше не работает, начиная с Android 8.0 - Oreo
В вашем AndroidManifest.xml добавьте:
Затем вам нужно создать намерение запуска приложения:
Создайте ярлык для установки с помощью панели запуска вашего приложения и пользовательского значка:
И, наконец, запустить намерение вещания:
источник
Предполагая, что вы имеете в виду изменение значка, отображаемого на главном экране, это можно легко сделать, создав виджет, который делает именно это. Вот статья, которая демонстрирует, как это можно сделать для приложения типа «новые сообщения», похожего на iPhone:
http://www.cnet.com/8301-19736_1-10278814-251.html
источник
Решение @ PA частично работает для меня. Подробно мои выводы ниже:
1) Первый фрагмент кода неверен, см. Ниже:
2) Следует использовать следующий код, чтобы отключить все значки перед включением другого, в противном случае он добавит новый значок вместо его замены.
НО, если вы используете код выше, то ярлык на домашнем экране будет удален! И он не будет автоматически добавлен обратно. Возможно, вы сможете программно добавить значок обратно, но он, вероятно, не будет оставаться в том же положении, что и раньше.
3) Обратите внимание, что значок не будет немедленно изменен, это может занять несколько секунд. Если вы щелкнете по нему сразу после изменения, вы можете получить сообщение об ошибке: «Приложение не установлено».
Итак, ИМХО, это решение подходит только для изменения значка в панели запуска приложений, а не для ярлыков (то есть значок на рабочем столе)
источник
Попробуйте это решение
Добавьте следующий код, если вы хотите изменить значок приложения
источник
AndroidManifest.xml
пример:Затем следуйте приведенному ниже коду
MainActivity
:источник
com.pritesh.resourceidentifierexample.MainActivity-Red doesn't exist in com.pritesh.resourceidentifierexample
исключение. здесь я использовал ваше манифестное имя, чтобы продемонстрировать свою проблемуЧтобы заставить решение работать Маркусом, мне понадобилось первое намерение, поэтому:
источник
Применяя упомянутые выше предложения, я столкнулся с проблемой того, что приложение будет убито, когда значок по умолчанию сменится на новый значок. Так что реализовали код с некоторыми настройками. Шаг 1). В файле AndroidManifest.xml создайте для активности по умолчанию с android: enabled = "true" и другие псевдонимы с android: enabled = "false". Вы не будете содержать, но добавлять их с помощью android: enabled = "true".
Шаг 2). Создайте метод, который будет использоваться для отключения первого псевдонима активности, который содержит значок по умолчанию, и включения второго псевдонима, который содержит значок, который необходимо изменить.
Шаг 3). Теперь вызовите этот метод в зависимости от ваших требований, скажем, по нажатию кнопки или по дате или по конкретным условиям, просто как -
Надеюсь, что это поможет тем, кто сталкивается с проблемой гибели приложения при смене значка. Удачного кодирования :)
источник