Я хочу создать закрепленный ярлык, чтобы пользователь мог запустить действия приложения. На моем устройстве Poco M5S с Android 13 метод upsertpinshortcut работает так же, как и ожидалось. В первый раз система просит разрешения добавить ярлык. Однако на устройстве пользователя OnePlus с Android 12 (по умолчанию метод вообще не работает. Нет никаких исключений или тостов. После вызова requestPinShortcut ничего не происходит. Нет ярлыков, никаких диалогов разрешений. Настройки устройства для приложения не имеют возможности разрешить ярлыки. Что может быть не так? Итак, то же устройство, то же самое requestPinShortcut , но в случае, если мое приложение ничего не произойдет.
fun upsertPinShortcut(model: IconicsButtonEntity) {
try {
if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
val pinShortcut = createPinShortcutInfo(model)
val result = if (context.isPinShortcutExists(pinShortcut.id)) {
ShortcutManagerCompat.updateShortcuts(context, listOf(pinShortcut))
} else {
ShortcutManagerCompat.requestPinShortcut(context, pinShortcut, null)
}
if (!result) {
EventManager.emit(AppEvent.MainActivity.ShowToast(R.string.failed_to_pin_shortcut))
}
} else {
EventManager.emit(AppEvent.MainActivity.ShowToast(R.string.warning_launcher_not_support_pin_shortcut, Toast.LENGTH_LONG))
}
} catch (error: Exception) {
EventManager.emit(AppEvent.MainActivity.ShowToast(error.message ?: "Unknown error", Toast.LENGTH_LONG))
}
}
fun Context.isPinShortcutExists(pinShortcutId: String): Boolean {
val existingPinShortcuts = ShortcutManagerCompat.getShortcuts(this, ShortcutManagerCompat.FLAG_MATCH_PINNED)
return existingPinShortcuts.firstOrNull { it.id == pinShortcutId } != null
}
private fun createPinShortcutInfo(model: IconicsButtonEntity): ShortcutInfoCompat {
val intent = Intent(context, ExecutionActivity::class.java)
intent.setAction(BuildConfig.ACTION_EXECUTE_PROGRAM)
intent.putExtra(ProgramWorker.PROGRAM_ID, model.programId.toString())
return ShortcutInfoCompat.Builder(context, createShortcutId(model.programId))
.setIntent(intent)
.setIcon(createIconCompat(context, model))
.setShortLabel(model.label)
.build()
}
private fun createIconCompat(
context: Context,
model: IconicsButtonEntity,
): IconCompat {
val totalAreaDp = 48
val totalAreaPx = totalAreaDp.toPx
val liveAreaDp = 44
val iconSizeDp = liveAreaDp / 2
val offsetPx = (totalAreaDp.toPxFloat - iconSizeDp.toPxFloat) / 2
val bitmap = Bitmap.createBitmap(totalAreaPx, totalAreaPx, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
GradientDrawable().apply {
setColor(model.backgroundColor)
setBounds(0, 0, totalAreaPx, totalAreaPx)
draw(canvas)
}
val iconicsBitmap = IconicsDrawable(context, model.iconName)
.color { IconicsColor.colorInt(model.iconTintColor) }
.size { IconicsSize.dp(iconSizeDp) }
.toBitmap()
canvas.drawBitmap(iconicsBitmap, offsetPx, offsetPx, null)
return IconCompat.createWithBitmap(bitmap)
}
private fun createShortcutId(programId: Int): String {
return "programId=${programId}"
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... inshortcut
Как использовать shortcutmanagercompat.requestpinshortcut? ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1740904755
Anonymous
Я хочу создать закрепленный ярлык, чтобы пользователь мог запустить действия приложения. На моем устройстве Poco M5S с Android 13 метод upsertpinshortcut работает так же, как и ожидалось. В первый раз система просит разрешения добавить ярлык. Однако на устройстве пользователя OnePlus с Android 12 (по умолчанию метод вообще не работает. Нет никаких исключений или тостов. После вызова requestPinShortcut ничего не происходит. Нет ярлыков, никаких диалогов разрешений. Настройки устройства для приложения не имеют возможности разрешить ярлыки. Что может быть не так? Итак, то же устройство, то же самое requestPinShortcut , но в случае, если мое приложение ничего не произойдет.
fun upsertPinShortcut(model: IconicsButtonEntity) {
try {
if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
val pinShortcut = createPinShortcutInfo(model)
val result = if (context.isPinShortcutExists(pinShortcut.id)) {
ShortcutManagerCompat.updateShortcuts(context, listOf(pinShortcut))
} else {
ShortcutManagerCompat.requestPinShortcut(context, pinShortcut, null)
}
if (!result) {
EventManager.emit(AppEvent.MainActivity.ShowToast(R.string.failed_to_pin_shortcut))
}
} else {
EventManager.emit(AppEvent.MainActivity.ShowToast(R.string.warning_launcher_not_support_pin_shortcut, Toast.LENGTH_LONG))
}
} catch (error: Exception) {
EventManager.emit(AppEvent.MainActivity.ShowToast(error.message ?: "Unknown error", Toast.LENGTH_LONG))
}
}
fun Context.isPinShortcutExists(pinShortcutId: String): Boolean {
val existingPinShortcuts = ShortcutManagerCompat.getShortcuts(this, ShortcutManagerCompat.FLAG_MATCH_PINNED)
return existingPinShortcuts.firstOrNull { it.id == pinShortcutId } != null
}
private fun createPinShortcutInfo(model: IconicsButtonEntity): ShortcutInfoCompat {
val intent = Intent(context, ExecutionActivity::class.java)
intent.setAction(BuildConfig.ACTION_EXECUTE_PROGRAM)
intent.putExtra(ProgramWorker.PROGRAM_ID, model.programId.toString())
return ShortcutInfoCompat.Builder(context, createShortcutId(model.programId))
.setIntent(intent)
.setIcon(createIconCompat(context, model))
.setShortLabel(model.label)
.build()
}
private fun createIconCompat(
context: Context,
model: IconicsButtonEntity,
): IconCompat {
val totalAreaDp = 48
val totalAreaPx = totalAreaDp.toPx
val liveAreaDp = 44
val iconSizeDp = liveAreaDp / 2
val offsetPx = (totalAreaDp.toPxFloat - iconSizeDp.toPxFloat) / 2
val bitmap = Bitmap.createBitmap(totalAreaPx, totalAreaPx, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
GradientDrawable().apply {
setColor(model.backgroundColor)
setBounds(0, 0, totalAreaPx, totalAreaPx)
draw(canvas)
}
val iconicsBitmap = IconicsDrawable(context, model.iconName)
.color { IconicsColor.colorInt(model.iconTintColor) }
.size { IconicsSize.dp(iconSizeDp) }
.toBitmap()
canvas.drawBitmap(iconicsBitmap, offsetPx, offsetPx, null)
return IconCompat.createWithBitmap(bitmap)
}
private fun createShortcutId(programId: Int): String {
return "programId=${programId}"
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79472874/how-to-use-shortcutmanagercompat-requestpinshortcut[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия