You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11版本三星A10、Galaxy S9/S10设备编程创建第三方应用固定快捷方式异常问题

解决三星Android 11设备上固定其他应用快捷方式显示自身应用的问题

这个问题是三星One UI在Android 11版本上的定制限制导致的——你的代码在原生Android和其他品牌设备上逻辑完全正确,但三星系统对跨应用创建固定快捷方式做了额外的校验拦截,最终把你设置的目标应用Intent替换成了当前应用的启动Intent。

问题根源分析

三星One UI在Android 11中加强了快捷方式的权限管控,当第三方应用尝试创建其他应用的固定快捷方式时,系统会默认替换Intent为发起应用的Intent,除非满足以下两个关键条件:

  • 目标应用的启动Intent必须明确携带Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_CLEAR_TASK标记
  • ShortcutInfo的唯一ID必须与目标应用绑定,避免和当前应用的快捷方式ID产生冲突

修复方案

下面是针对三星设备修改后的代码,同时兼容其他Android 11+设备:

val targetPackageName = finalPackageName ?: return
val context = context ?: return

// 1. 获取目标应用的启动Intent并添加必要标记
val shortcutIntent = context.packageManager.getLaunchIntentForPackage(targetPackageName)?.apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
} ?: run {
    Toast.makeText(context, "目标应用未安装", Toast.LENGTH_SHORT).show()
    return
}

val shortcutManager = context.getSystemService(ShortcutManager::class.java) ?: return

if (shortcutManager.isRequestPinShortcutSupported) {
    // 2. 生成与目标应用绑定的唯一ID,避免冲突
    val uniqueShortcutId = "shortcut_${targetPackageName}_${System.currentTimeMillis()}"
    
    val shortcut = ShortcutInfo.Builder(context, uniqueShortcutId)
        .setShortLabel(finalAppName)
        .setLongLabel("打开${finalAppName}")
        .setIcon(Icon.createWithBitmap(finalBitmap))
        .setIntent(shortcutIntent)
        .build()

    // 3. 使用适配Android 11的PendingIntent Flag
    val broadcastIntent = Intent("test_action")
    val pendingIntentFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        PendingIntent.FLAG_IMMUTABLE
    } else {
        PendingIntent.FLAG_UPDATE_CURRENT
    }
    val pendingIntent = PendingIntent.getBroadcast(context, 123, broadcastIntent, pendingIntentFlags)

    // 注册广播接收器(注意:建议用动态注册的方式,避免内存泄漏)
    val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            findNavController().navigate(R.id.resultFragment)
            context.unregisterReceiver(this)
        }
    }
    context.registerReceiver(receiver, IntentFilter("test_action"))

    shortcutManager.requestPinShortcut(shortcut, pendingIntent.intentSender)
} else {
    Toast.makeText(context, "不支持固定快捷方式!", Toast.LENGTH_SHORT).show()
}

额外注意事项

  1. 权限检查:虽然Android Oreo及以上不再需要com.android.launcher.permission.INSTALL_SHORTCUT权限,但部分三星设备可能仍需在Manifest中声明该权限作为兼容
  2. 图标资源:确保finalBitmap是符合快捷方式图标的规范(建议尺寸为192x192dp,格式为PNG)
  3. 广播接收器优化:如果你的项目使用了Jetpack的LocalBroadcastManager,建议改用它来注册广播,避免全局广播的性能问题

内容的提问来源于stack exchange,提问作者Syed Rafaqat Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:19:06