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

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

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

Для версий до 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);
Другие вопросы по тегам