0

根据“人物和对话”</a>,Android 11 上的对话通知的先决条件之一如下:

该通知与有效的长期动态或缓存的共享快捷方式相关联。通知可以通过调用setShortcutId()或来设置这种关联setShortcutInfo()

我只能有 5 个快捷方式。这是否意味着我不能为超过 5 人发送对话通知?

4

1 回答 1

1

看来您实际上可以发布超过 5 个快捷方式。您可以通过设置较高的数字来制作排名低于所有其他通知的通知rank,并使用shortcutManager.pushDynamicShortcut().

如果您没有任何启动器快捷方式,上述操作将创建一个。如果您不希望这样,建议...只需删除您刚刚创建的快捷方式

问:我的快捷方式会出现在长按应用启动器上下文菜单中吗?答:他们可以根据他们的等级,但如果您不希望在启动器上显示快捷方式,您可以在发送通知时ShortcutManager#removeDynamicShortcuts()或之后删除快捷方式。#removeAllDynamicShortcuts()您还可以对排名较高的其他应用快捷方式进行排名,因此只有那些动态快捷方式才会出现在启动器上。


下面是一些想法。普通手机上的快捷方式似乎会出现在三个地方:

  • 启动器——通过长按应用程序图标或固定;
  • 直接分享;
  • 对话通知。

这些快捷方式都来自同一个池。这是有道理的,但由于每个快捷方式只有一个等级,这意味着启动器列表和直接共享列表是相同的。这是您可能不想要的;您可能会在一个对话中分享更多内容,但更频繁地打开另一个对话。在我的应用程序中,我通过以下方式解决了这个问题:

  • 我维护用户何时与联系人分享/打开与联系人聊天的统计信息
  • 每当最常用/最常用的联系人列表发生变化时,我都会使用shortcutManager.pushDynamicShortcut();更新快捷方式。如果已存在具有相同 id 的快捷方式,则会对其进行更新。我使用旧的细节shortcutManager.getShortcuts()
    • 根据快捷方式是否成为或不再成为直接共享目标,我设置或取消设置类别
    • 指定等级允许在启动器中重新排序快捷方式
  • 每当我需要推送通知时,我都会检查我是否已经有对话的快捷方式。如果没有,我只是创建一个排名为 10000 的新的。

这允许拥有完全不同的启动器和直接共享快捷方式,并发布许多对话通知。

一些随机观察:

  • 向对话通知添加快捷方式 ID 也会将其图标添加到通知中,即使您没有明确设置。

  • shortcutManager.maxShortcutCountPerActivity实际上在我的设备(LineageOS)上返回 15(!),即使启动器和直接共享仅显示常规 4 个图标。

  • 如果您更新快捷方式名称和/或图标,大多数情况下它会立即在启动器中更新。这包括固定的快捷方式。

  • 用于IconCompat.createWithAdaptiveBitmap()创建适用于各种图标形状的图标。系统会保留图像,您不需要保留它。请参阅该方法的文档。

    还有两种方法需要注意:

    • IconCompat.createWithAdaptiveBitmapContentUri()与上述相同,但适用于内容 URI。这对于创建Person通知很有用,因为这允许不将图标保留在内存中。不过貌似没有办法将URI权限传递给快捷方式管理器,所以这个方法不能用。(如果我在这里错了,请纠正我!)

      编辑:如果您在内联(直接)回复后取消通知,系统可能会决定将您的回复添加到它而不是实际取消它。显然,此时它可能会失去 URI 权限。在 URI 上调用此解决方法似乎有所帮助:

      fun Uri.grantReadPermissionToSystem() {
          applicationContext.grantUriPermission("com.android.systemui", this,
                  Intent.FLAG_GRANT_READ_URI_PERMISSION)
      }
      
    • IconCompat.createWithData()从压缩图像数据 (PNG/JPEG) 创建内存高效图标。然而,它不是自适应的。而且,用它制作的图标根本无法使用ShortcutManager

另外不要忘记查看People 示例应用程序的自述文件

于 2021-05-12T00:10:48.740 回答