Подтвердить что ты не робот

Android создает ярлыки на главном экране

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

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

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

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

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

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

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

4b9b3361

Ответ 1

В примере кода используются недокументированные интерфейсы (разрешение и намерение) для установки ярлыка. Как сказал вам "кто-то", это может не работать на всех телефонах и может разорваться в будущих выпусках 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);

Ответ 2

Я разработал один из способов, приведенных ниже, для создания значка ярлыка на андроиде Homescreen [Протестировано в моем собственном приложении]. Просто позвоните.

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" />

Счастливое кодирование!!!

Edit:

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

addIntent.putExtra("duplicate", false);

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

Ответ 3

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

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

Ответ 4

Трансляция 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 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"/>

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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

    }

Ответ 8

final Intent shortcutIntent = new Intent(this, SomeActivity.class);

final Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
// Sets the custom shortcut 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);

Ответ 9

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 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 иконки. Я не понимал??

Ответ 10

Это будет дублировать ярлыки, если вы откроете активность из ярлыка главного экрана вместо ярлыков основного приложения (после очистки кеша):

Blockquote

public static void addShortcutToHomeScreen (Контекст контекста) {if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {

, , @Glocker