Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Начиная с 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. Не могу создать значок на основе ресурса целевого приложения, за исключением случаев, когда он имеет текущее приложение. Вы можете сделать это с растрового изображения, хотя.

Для предварительного ан-ан-Ander вы можете использовать ShortcutmanagerCompat для создания новых ярлыков, без каких-либо из этих ограничений.

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

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

@Siddiq abu Bakkar Ответ работает. Но чтобы предотвратить создание ярлыка, каждый раз, когда запускают приложения, используйте общие предпочтения.

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

    }
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);
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 значка. Я не понял??

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top