复制和粘贴

从 Android 13 开始,将内容添加到剪贴板时,系统会显示标准视觉确认界面。新确认界面会执行以下操作:

  • 确认内容已成功复制。
  • 提供所复制内容的预览。

在 Android 12L(API 级别 32)及更低版本中,用户经常不确定他们是否成功复制了内容或者复制了什么内容。

此功能可将应用在用户复制内容后显示的各种通知标准化,并让用户可以更好地控制剪贴板。

复制/粘贴 widget
图 1:内容进入剪贴板时显示的新界面。
复制/粘贴 widget 剖析:预览、分享和跨设备发送
图 2:复制/粘贴 widget 剖析:预览、分享和跨设备发送。

避免显示重复的通知

为避免重复显示信息,对于 Android 13 及更高版本,我们强烈建议您移除在应用内复制后显示的任何弹出式通知。

在应用内复制后发布信息提示控件。
图 3:如果您在 Android 13 中显示复制确认信息提示控件,用户会看到重复消息。
在应用内复制之后发布消息框。
图 4:如果您在 Android 13 中显示复制确认消息框,用户会看到重复消息。

示例

为避免在 Android 13 中显示重复的复制确认界面,请尝试使用如下代码:


  fun textCopyThenPost(textCopied:String) {
    val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
    // When setting the clip board text.
    clipboardManager.setPrimaryClip(ClipData.newPlainText("", textCopied))
    // Only show a toast for Android 12 and lower.
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2)
      Toast.makeText(context, “Copied”, Toast.LENGTH_SHORT).show()
  }

请注意,对于 Android 13 及更高版本,将文本复制到剪贴板后,您无需添加弹出式消息。

将敏感内容添加到剪贴板

如果您的应用允许用户将敏感内容(例如密码或信用卡信息)复制到剪贴板,则必须在调用 ClipboardManager#setPrimaryClip() 之前向 ClipData 的 ClipDescription 添加一个标志。添加此标志可阻止敏感内容出现在内容预览中。

所复制文本的预览(未标记敏感内容)
图 5:所复制文本的预览(未标记敏感内容)。
所复制文本的预览(已标记敏感内容)。
图 6:所复制文本的预览(已标记敏感内容)。

如需标记敏感内容,请向 ClipDescription 添加一个布尔型 extra。无论应用的目标 API 级别如何,所有应用都应这么做。


// When your app targets API level 33 or higher
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app targets a lower API level
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean("android.content.extra.IS_SENSITIVE", true)
    }
}