it-swarm.com.ru

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

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

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

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

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

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

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

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

54
Sgotenks

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

Ниже я разработал один метод для создания ярлыка на домашнем экране 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);

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

65
Siddiq Abu Bakkar

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

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

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

Начиная с 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 для создания новых ярлыков без каких-либо ограничений.

6
android developer

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

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

3
noob

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

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

    }
2
Krishnadas PC
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);
1
Piush Kumar
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 иконки. Я не понимал??

0
selçuk doğan