Как удалить ярлык приложения с домашнего экрана при удалении автоматически? - PullRequest
6 голосов
/ 25 января 2010

Я разрабатываю приложение, которое должно добавить ярлык на домашний экран после установки и удалить его после удаления приложения. Приложение будет предварительно установлено на устройстве конечного пользователя, но все равно должно иметь возможность удаления). Задача выглядит очень простой, но я столкнулся с множеством проблем при ее реализации.

Что я сделал:

  • Добавить ярлык на домашний экран, используя com.android.launcher.action.INSTALL_SHORTCUT при первом запуске приложения или на новом устройстве перезагрузка.
  • Вручную удалите ярлык, используя com.android.launcher.action.UNINSTALL_SHORTCUT.

Чего я не могу (и почти сдам):

  • Автоматически удаляет ярлык при приложение удаляется.

Невозможно использовать Intent.ACTION_PACKAGE_REMOVED, поскольку удаляемое приложение не получает этого намерения. Я выполнил несколько тестов и обнаружил, что единственный тип ярлыка, который удаляется с приложением, это ярлык, который создается из меню «Добавить на главный экран => Ярлыки => Приложения => Активность приложения». Ярлыки, которые создаются программно или объявляются в AndroidManifest, остаются на главном экране после удаления приложения.

На форумах почти нет документов и сообщений на эту тему, и меня немного смущает, почему такая простая операция, которая не противоречит политике безопасности Android, не может быть реализована прямым способом.

Можно ли попросить ОС удалить соответствующий ярлык при удалении приложения? Могу ли я отловить событие, когда приложение удаляется до его удаления?

Ответы [ 3 ]

2 голосов
/ 06 ноября 2012

Кажется, что вы не используете намерение install_shortcut правильно. Вероятно, вы создаете намерение без каких-либо параметров. Вы должны создать намерение с действием Intent.ACTION_MAIN param.

Intent shortcutIntent = new Intent(Intent.ACTION_MAIN);
shortcutIntent.setClassName(this, this.getClass().getName());

Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
            this,  R.drawable.launcher_icon);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
sendBroadcast(intent);
2 голосов
/ 25 января 2010

Я не верю, что вы можете сделать это.

Во-первых, потому что вы не можете удалить приложения, которые предварительно установлены в прошивке устройства & mdash; они существуют в разделе /system, который является файловой системой только для чтения.

Во-вторых, как вы заметили, ваше приложение не получает уведомлений об удалении .

Если пользователи могут не захотеть использовать ваше приложение, не будут ли они просто игнорировать значок приложения, так же как я это делаю для пары предустановленных приложений на моем телефоне?


Изменить:
Если вы собираетесь предварительно установить приложения (но не на прошивку, как отмечает commonsware.com), вы можете предварительно установить два APK. Один из которых не имеет средства запуска и состоит только из приемника вещания, который обрабатывает событие ACTION_PACKAGE_REMOVED и вызывает UNINSTALL_SHORTCUT.

Я не верю, что есть какие-либо явные проверки разрешений, которые требуют удаления ярлыка тем же приложением, которое его добавило, но вы можете обойти это в любом случае, используя sharedUserId для APK-.

1 голос
/ 25 января 2010

То, что вы описываете, является ограничением главного экрана. Следующая версия Launcher2 решает эту проблему и автоматически удаляет виджеты и ярлыки, связанные с приложением. Некоторые ярлыки могут быть оставлены, хотя, если не может быть найдена связь (например, если ваше приложение создает ярлык для музыкального проигрывателя)

...