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

如何检查是否已授予「主屏幕快捷方式」权限?

解决Glance Widget固定权限引导问题

核心问题说明

你遇到的INSTALL_SHORTCUT权限无效是因为它仅适用于桌面快捷方式创建,和Glance Widget的固定逻辑完全无关。Android系统对Widget固定的权限管理没有单独的可查询权限项,而是通过系统级的requestPinAppWidget流程(Glance底层调用此API)处理,用户拒绝一次后再次调用不会弹出请求,需要通过回调判断结果并引导用户手动操作。

解决方案步骤

1. 添加固定请求的回调监听

修改你的requestPinGlanceAppWidget调用,传入PendingIntent来接收用户操作结果:

val glanceManager = GlanceAppWidgetManager(context)
// 创建回调PendingIntent
val pinCallbackIntent = PendingIntent.getBroadcast(
    context,
    0,
    Intent(context, WidgetPinResultReceiver::class.java),
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

// 发起Widget固定请求
glanceManager.requestPinGlanceAppWidget(
    receiver = TrackerWidgetReceiver::class.java,
    pendingIntent = pinCallbackIntent
)

2. 实现回调接收器

创建一个BroadcastReceiver来处理固定结果,当用户拒绝时引导至应用详情设置页:

class WidgetPinResultReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val isPinnedSuccess = intent?.getBooleanExtra(AppWidgetManager.EXTRA_APPWIDGET_PINNED, false) ?: false
        if (!isPinnedSuccess) {
            // 打开应用详情设置页,引导用户手动添加Widget
            val settingsIntent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
                data = Uri.fromParts("package", context?.packageName, null)
                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            }
            context?.startActivity(settingsIntent)
        }
    }
}

3. 注册接收器到Manifest

在AndroidManifest.xml中注册上述接收器:

<receiver
    android:name=".WidgetPinResultReceiver"
    android:exported="false" />

额外说明

  • 无需声明INSTALL_SHORTCUT权限,该权限与Widget固定无关。
  • 应用详情设置页中,用户可通过“小组件”相关选项(部分系统可能在“权限”或“高级设置”下)手动添加你的Widget;也可以引导用户长按桌面空白处,直接进入系统Widget添加界面选择你的应用。

内容的提问来源于stack exchange,提问作者Olesya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:16:06