Android создает ярлыки на домашнем экране - PullRequest
56 голосов
/ 14 июня 2011

Что я хочу сделать, это:

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

2) Вторая кнопкасоздайте другой ярлык, который запускает действие.И я хочу передать в упражнение некоторые дополнительные аргументы (например, строки) ...........

Возможно ли это?Я нашел ссылку и некоторые похожие вопросы, такие как Android: есть ли способ программирования для создания ярлыка в Интернете на домашнем экране

Они, кажется, ответят на мой вопрос, но кто-то сказал мнеэтот код не будет работать на всех устройствах, и он устарел, и то, что я хочу сделать, невозможно .......

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

Что означает внутренняя реализация?Этот код заслуживает доверия или нет ..... помогите мне пожалуйста .....

Ответы [ 9 ]

83 голосов
/ 14 июня 2011

Пример кода использует недокументированные интерфейсы (разрешение и намерение) для установки ярлыка. Как сказал вам «кто-то», это может работать не на всех телефонах и может сломаться в будущих выпусках 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);
66 голосов
/ 12 декабря 2013

Я разработал один метод ниже для создания ярлыка на рабочем столе 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" />

Удачное кодирование !!!

Редактировать:

Для дублированного выпуска, первый вариант заключается в добавлении ниже строки в коде, в противном случае он каждый раз создает новую.

addIntent.putExtra("duplicate", false);

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

9 голосов
/ 15 мая 2018

Трансляция com.android.launcher.action.INSTALL_SHORTCUT больше не имеет никакого эффекта, начиная с Android Oreo. LINK

Если вы хотите поддерживать все версии 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"/>
8 голосов
/ 19 ноября 2017

Начиная с 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);
            }

У него много ограничений, к сожалению:

  1. Требуется, чтобы пользователь согласился добавить его.
  2. Не может быть добавлено / удалено в фоновом режиме.
  3. Вы должны иметь возможность обновить его, но для меня это не сработало.
  4. Не будет удалено, если удалено целевое приложение. Только тот, который его создал.
  5. Невозможно создать значок на основе ресурса целевого приложения, кроме случаев, когда оно принадлежит текущему приложению. Вы можете сделать это из растрового изображения.

Для версий до Android O вы также можете использовать ShortcutManagerCompat для создания новых ярлыков без каких-либо ограничений.

8 голосов
/ 27 мая 2014

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

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();
}
3 голосов
/ 24 августа 2017

Поскольку API level 26, использование com.android.launcher.action.INSTALL_SHORTCUT устарело. Новый способ создания ярлыков использует ShortcutManager.

В нем упоминается, что существует 3 вида ярлыков: статические, динамические и закрепленные. Исходя из ваших требований, вы можете создать их.

2 голосов
/ 12 октября 2015

@ Сиддик Абу Баккар Ответ работает. Но для предотвращения создания ярлыка при каждом запуске приложения используйте общие настройки.

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();

    }
1 голос
/ 24 сентября 2016
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);
0 голосов
/ 08 октября 2018
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 иконки.Я не поняла ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...