Как использовать shortcutmanagercompat.requestpinshortcut?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как использовать shortcutmanagercompat.requestpinshortcut?

Сообщение 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}"
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... inshortcut
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»