Android Oreo快捷方式权限对话框取消检测与重复快捷方式禁止方法
关于Android固定快捷方式的两个问题解答
嘿,我来帮你搞定这两个关于固定快捷方式的问题~
一、如何检测用户是否拒绝了固定快捷方式的权限?
没错,ShortcutManager确实没有直接提供取消回调,但我们可以通过启动系统请求固定的Intent并获取返回结果来判断用户的操作,不管是用传统的startActivityForResult还是现在推荐的ActivityResultContracts都能实现。
系统的固定快捷方式请求是通过Intent(ShortcutManager.ACTION_PIN_SHORTCUT)触发的,当你用带结果的方式启动这个Intent后,就能在回调里拿到用户的操作结果:
- 如果返回码是
Activity.RESULT_OK,说明用户同意并成功创建了快捷方式; - 如果是
Activity.RESULT_CANCELED,那就代表用户取消了操作(包括拒绝权限的情况)。
代码示例(旧版startActivityForResult)
// 定义请求码 private static final int REQUEST_PIN_SHORTCUT = 1001; // 构建固定快捷方式的Intent Intent pinIntent = new Intent(ShortcutManager.ACTION_PIN_SHORTCUT); // 填充快捷方式的必要信息(id、图标、名称等) pinIntent.putExtra(Intent.EXTRA_SHORTCUT_ID, "my_unique_shortcut_id"); pinIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "我的快捷方式"); pinIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(context, R.drawable.ic_shortcut)); ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); // 检查系统是否支持固定快捷方式 if (shortcutManager.isRequestPinShortcutSupported()) { startActivityForResult(pinIntent, REQUEST_PIN_SHORTCUT); } // 在onActivityResult中处理结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_PIN_SHORTCUT) { if (resultCode == RESULT_OK) { // 用户同意创建 Toast.makeText(this, "快捷方式已固定", Toast.LENGTH_SHORT).show(); } else { // 用户取消了操作 Toast.makeText(this, "你取消了固定快捷方式", Toast.LENGTH_SHORT).show(); } } }
代码示例(新版ActivityResultContracts)
如果你的项目用了AndroidX,更推荐用这种方式(避免旧API的兼容性问题):
// 注册ActivityResult回调 ActivityResultLauncher<Intent> pinShortcutLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { // 用户同意创建 Toast.makeText(this, "快捷方式已固定", Toast.LENGTH_SHORT).show(); } else { // 用户取消了操作 Toast.makeText(this, "你取消了固定快捷方式", Toast.LENGTH_SHORT).show(); } } ); // 发起固定请求 ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); Intent pinIntent = new Intent(ShortcutManager.ACTION_PIN_SHORTCUT); pinIntent.putExtra(Intent.EXTRA_SHORTCUT_ID, "my_unique_shortcut_id"); pinIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "我的快捷方式"); // 填充图标等其他信息... if (shortcutManager.isRequestPinShortcutSupported()) { pinShortcutLauncher.launch(pinIntent); }
二、如何禁止创建重复的快捷方式?
要避免重复创建,核心思路就是在发起固定请求前,先检查这个快捷方式是否已经被固定到桌面。我们可以通过ShortcutManager.getPinnedShortcuts()获取所有已固定的快捷方式列表,然后对比唯一标识(比如快捷方式的id)来判断是否存在。
代码示例
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); String targetShortcutId = "my_unique_shortcut_id"; // 检查是否已存在该快捷方式 boolean isShortcutPinned = false; List<ShortcutInfo> pinnedShortcuts = shortcutManager.getPinnedShortcuts(); for (ShortcutInfo shortcut : pinnedShortcuts) { if (targetShortcutId.equals(shortcut.getId())) { isShortcutPinned = true; break; } } if (!isShortcutPinned) { // 不存在才发起固定请求 Intent pinIntent = new Intent(ShortcutManager.ACTION_PIN_SHORTCUT); pinIntent.putExtra(Intent.EXTRA_SHORTCUT_ID, targetShortcutId); pinIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "我的快捷方式"); // 填充图标等其他信息... if (shortcutManager.isRequestPinShortcutSupported()) { pinShortcutLauncher.launch(pinIntent); } } else { Toast.makeText(this, "快捷方式已存在", Toast.LENGTH_SHORT).show(); }
这里需要注意,一定要给每个快捷方式设置唯一的id,这样才能准确判断是否重复。如果是用ComponentName来标识,也可以对比shortcut.getIntent().getComponent()是否和目标ComponentName一致,但用id是最直接可靠的方式。
内容的提问来源于stack exchange,提问作者Raju Ugale
相关产品推荐
相关产品推荐

