Как разместить значок приложения на главном экране пусковой установки?
Как вы знаете, когда приложение установлено с нумерацией, значок создается на экране меню запуска.
Что я хочу сделать, так это создать значок на главном экране пользователя во время установки.
(без нажатия значка в течение 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()
, поэтому он не вызывается каждый раз!