Android создает ярлыки на домашнем экране
Что я хочу сделать, это:
1) Я в деятельности, есть 2 кнопки. Если я нажму первый, ярлык будет создан на моем домашнем экране. Ярлык открыть html
Страница, которая была ранее загружена, поэтому я хочу использовать браузер по умолчанию, но я не хочу использовать Интернет, потому что у меня уже есть страница.
2) Вторая кнопка создает еще один ярлык, который запускает действие. И я хочу передать в активность некоторые дополнительные аргументы (например, строки)...........
Возможно ли это? Я нашел ссылку и несколько похожих вопросов, таких как Android: есть ли способ программирования для создания ярлыка в Интернете на домашнем экране?
Они, кажется, являются ответом на мой вопрос, но кто-то сказал мне, что этот код не будет работать на всех устройствах, и это устарело, и что то, что я хочу сделать, невозможно.......
Эта техника не рекомендуется. Это внутренняя реализация, а не часть Android SDK. Это не будет работать на всех реализациях домашнего экрана. Может не работать на всех прошлых версиях Android. Он может не работать в будущих версиях Android, так как Google не обязан поддерживать внутренние недокументированные интерфейсы. Пожалуйста, не используйте это
Что значит внутренняя реализация? Этот код заслуживает доверия или нет..... помогите мне пожалуйста.....
9 ответов
Код примера использует недокументированные интерфейсы (разрешение и намерение) для установки ярлыка. Как сказал вам "кто-то", это может работать не на всех телефонах и может сломаться в будущих выпусках Android. Не делай этого.
Правильный способ - прослушать быстрый запрос с домашнего экрана - с фильтром намерений, как в вашем манифесте:
<activity android:name=".ShortCutActivity" android:label="@string/shortcut_label">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Затем в действии, которое получает намерение, вы создаете намерение для своего ярлыка и возвращаете его как результат действия.
// create shortcut if requested
ShortcutIconResource icon =
Intent.ShortcutIconResource.fromContext(this, R.drawable.icon);
Intent intent = new Intent();
Intent launchIntent = new Intent(this,ActivityToLaunch.class);
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launchIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, someNickname());
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
setResult(RESULT_OK, intent);
Ниже я разработал один метод для создания ярлыка на рабочем столе Android [протестировано в моем собственном приложении]. Просто позвони.
private void ShortcutIcon(){
Intent shortcutIntent = new Intent(getApplicationContext(), MainActivity.class);
shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Test");
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.ic_launcher));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
}
Не забудьте изменить название своей деятельности, значок ресурса и разрешение.
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
Удачного кодирования!!!
Редактировать:
Для Duplicate Issue Первый вариант - добавить строку под кодом в коде, иначе он каждый раз создает новую.
addIntent.putExtra("duplicate", false);
Второй вариант - сначала удалить значок ярлыка приложения, а затем установить его снова, если первый вариант не сработал.
Трансляция com.android.launcher.action.INSTALL_SHORTCUT больше не имеет никакого эффекта, начиная с Android Oreo. ССЫЛКА НА САЙТ
Если вы хотите поддерживать все версии Android, особенно Android 8.0 или Oreo и новее, используйте код ниже, чтобы создать ярлык:
public static void addShortcutToHomeScreen(Context context)
{
if (ShortcutManagerCompat.isRequestPinShortcutSupported(context))
{
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, "#1")
.setIntent(new Intent(context, YourActivity.class).setAction(Intent.ACTION_MAIN)) // !!! intent's action must be set on oreo
.setShortLabel("Test")
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_launcher))
.build();
ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null);
}
else
{
// Shortcut is not supported by your launcher
}
}
Добавить разрешение в файле манифеста:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
Начиная с Android O, это способ создать ярлык:
if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
final ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(context, shortcutId)
.setIcon(Icon.createWithResource(context, R.mipmap.ic_launcher))
.setShortLabel(label)
.setIntent(new Intent(context, MainActivity.class).setAction(Intent.ACTION_MAIN))
.build();
shortcutManager.requestPinShortcut(pinShortcutInfo, null);
}
К сожалению, у него много ограничений:
- Требуется, чтобы пользователь согласился добавить его.
- Не может быть добавлено / удалено в фоновом режиме.
- Вы должны иметь возможность обновить его, но для меня это не сработало.
- Не будет удалено, если удалено целевое приложение. Только тот, который его создал.
- Невозможно создать значок на основе ресурса целевого приложения, кроме случаев, когда оно принадлежит текущему приложению. Вы можете сделать это из растрового изображения, хотя.
Для версий до Android O вы также можете использовать ShortcutManagerCompat для создания новых ярлыков без каких-либо ограничений.
Я немного улучшил решение выше. Теперь он сохраняет в настройках, был ли ярлык уже добавлен, и не добавляет его при новых запусках приложения, если пользователь удалил его. Это также экономит немного времени, так как код для добавления существующего ярлыка больше не запускается.
final static public String PREFS_NAME = "PREFS_NAME";
final static private String PREF_KEY_SHORTCUT_ADDED = "PREF_KEY_SHORTCUT_ADDED";
// Creates shortcut on Android widget screen
private void createShortcutIcon(){
// Checking if ShortCut was already added
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
boolean shortCutWasAlreadyAdded = sharedPreferences.getBoolean(PREF_KEY_SHORTCUT_ADDED, false);
if (shortCutWasAlreadyAdded) return;
Intent shortcutIntent = new Intent(getApplicationContext(), IntroActivity.class);
shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "YourAppName");
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.ic_launcher));
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
// Remembering that ShortCut was already added
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(PREF_KEY_SHORTCUT_ADDED, true);
editor.commit();
}
@ Сиддик Абу Баккар Ответ работает. Но для предотвращения создания ярлыка при каждом запуске приложения используйте общие настройки.
final String PREF_FIRST_START = "AppFirstLaunch";
SharedPreferences settings = getSharedPreferences(PREF_FIRST_START, 0);
if(settings.getBoolean("AppFirstLaunch", true)){
// record the fact that the app has been started at least once
settings.edit().putBoolean("AppFirstLaunch", false).commit();
ShortcutIcon();
}
Поскольку API level 26
, с помощью com.android.launcher.action.INSTALL_SHORTCUT
устарела. Новый способ создания ярлыков с использованием ShortcutManager
,
Упоминается, что существует 3 вида ярлыков: статические, динамические и закрепленные. Исходя из ваших требований, вы можете создать их.
Чтобы добавить ярлык на главный экран, используйте этот код.
public void addShortcutToHomeScreen(Context context) {
if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, "#1")
.setIntent(new Intent(context, MainActivity.class).setAction(Intent.ACTION_MAIN)) // !!! intent's action must be set on oreo
.setShortLabel("Label Goes Here")
.setIcon(IconCompat.createWithResource(context, R.mipmap.ic_launcher_shortcut))
.build();
ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null);
} else {
Toast.makeText(context, R.string.no_shortcut, Toast.LENGTH_SHORT).show();
}
}
и никаких дополнительных разрешений не требуется!!!
public static void addShortcutToHomeScreen(Context context)
{
if (ShortcutManagerCompat.isRequestPinShortcutSupported(context))
{
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, "#1")
.setIntent(new Intent(context, YourActivity.class).setAction(Intent.ACTION_MAIN)) // !!! intent's action must be set on oreo
.setShortLabel("Test")
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_launcher))
.build();
ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null);
}
else
{
// Shortcut is not supported by your launcher
}
}
Я использовал его, но некоторые устройства на домашнем экране добавляют 2 иконки. Я не понимал??
final Intent shortcutIntent = new Intent(this, SomeActivity.class);
final Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
// Sets the custom shortcut's title
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
// Set the custom shortcut icon
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.icon));
// add the shortcut
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
sendBroadcast(intent);