Как разместить значок приложения на главном экране пусковой установки?

Как вы знаете, когда приложение установлено с нумерацией, значок создается на экране меню запуска. Что я хочу сделать, так это создать значок на главном экране пользователя во время установки. (без нажатия значка в течение 5 секунд.)

Я слышал это из другого источника, чтобы просто добавить

<category android:value="android.intent.category.HOME" />

в файл AndroidManifest.xml, но он не работает.

Есть ли другой способ сделать это?

Ответы

Ответ 1

Вы можете использовать это:

Intent shortcutIntent = new Intent();
shortcutIntent.setClassName("packageName", "className");
//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, "shortcut_name");
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(context, R.drawable.icon));
//intent.putExtra("duplicate", false);
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
            context.sendBroadcast(addIntent);

Вы должны использовать следующие разрешения в своем AndroidManaifest.xml

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

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

Обратите внимание, что, возможно, выше API не документирован. Но он работает.

Ответ 2

Теперь это разрешено службами Google Play. Вам больше не нужно добавлять какие-либо коды. Теперь, когда вы устанавливаете приложение из Google Play Store, он автоматически создает логотип на главном экране. Его можно обрабатывать в настройках магазина Google Play. Исключение: если вы используете какие-либо пользовательские ромы или пусковые установки, это не сработает с некоторыми.

Ответ 3

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

public static void addShortcut(Context context)
{
    Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");

    ApplicationInfo appInfo = context.getApplicationInfo();

    // Shortcut name
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, appInfo.name);
    shortcut.putExtra("duplicate", false); // Just create once

    // Setup activity shoud be shortcut object 
    ComponentName component = new ComponentName(appInfo.packageName, appInfo.className);
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(component));

    // Set shortcut icon
    ShortcutIconResource iconResource = Intent.ShortcutIconResource.fromContext(context, appInfo.icon);
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);

    context.sendBroadcast(shortcut);
}

public static void deleteShortcut(Context context)
{
    Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");

    ApplicationInfo appInfo = context.getApplicationInfo();

    // Shortcut name
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, appInfo.name);

    ComponentName comp = new ComponentName(appInfo.packageName, appInfo.className);
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));

    context.sendBroadcast(shortcut);
}

Разрешения:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

BroadcastReceiver:

<receiver android:name="YOUR.PACKAGE.PackageReplacedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <data android:scheme="package" android:path="YOUR.PACKAGE" />
    </intent-filter>
</receiver>

Ответ 4

У меня были проблемы с вышеупомянутыми ответами, и потому, что API 22 и, возможно, другие API возвращаются в getApplicationInfo(). className в режиме отладки/эмуляции:
"Com.android.tools.fd.runtime.BootstrapApplication"

Самое главное, что мне нужно было установить весь путь к классу для имени класса. (см. изменения)

Например, у меня было следующее:
PACKAGENAME = com.example.user.myapp
= MainActivity имя класса

В Ответ Кайлаша Мне нужно было изменить эту строку:

shortcutIntent.setClassName("packageName", "className");

к

shortcutIntent.setClassName("com.example.user.myapp", "com.example.user.myapp.MainActivity");



В Ответ ChristopheCVB мне нужно было изменить эту строку:

ComponentName comp = new ComponentName(appInfo.packageName, appInfo.className);

к

ComponentName comp = new ComponentName(appInfo.packageName, appInfo.packageName+".MainActivity");

Ответ 5

Надежное решение для всех устройств (устройство Pre/Post Oreo).

createShortcutOnHome(CurrentActivity.this, ActivityToOpen.class, "app name", R.mipmap.ic_launcher);

Этот метод может быть размещен в вашем Util.

 public static void createShortcutOnHome(@NonNull Activity activity, Class activityToOpen, String title, @DrawableRes int icon) {
        Intent shortcutIntent = new Intent(activity, activityToOpen);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { // code for adding shortcut on pre oreo device 
            Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
            intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
            intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
            intent.putExtra("duplicate", false);
            Parcelable parcelable = Intent.ShortcutIconResource.fromContext(activity, icon);
            intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, parcelable);
            activity.sendBroadcast(intent);
            System.out.println("added_to_homescreen");
        } else { 
            ShortcutManager shortcutManager = activity.getSystemService(ShortcutManager.class);
            assert shortcutManager != null;
            if (shortcutManager.isRequestPinShortcutSupported()) {
                ShortcutInfo pinShortcutInfo =
                        new ShortcutInfo.Builder(activity, "browser-shortcut-")
                                .setIntent(shortcutIntent)
                                .setIcon(Icon.createWithResource(activity, icon))
                                .setShortLabel(title)
                                .build();

                shortcutManager.requestPinShortcut(pinShortcutInfo, null);
                System.out.println("added_to_homescreen");
            } else {
                System.out.println("failed_to_add");
            }
        }
    }

Ответ 6

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

Это функция, которую я на самом деле пишу сейчас, так что, надеюсь, получится хорошо. Но да, это значит, чтобы он не был из onCreate(), поэтому он не вызывается каждый раз!