📜  kotlin 复制文本 android 10 - Kotlin (1)

📅  最后修改于: 2023-12-03 15:17:09.915000             🧑  作者: Mango

Kotlin 复制文本 Android 10

在 Android 10 及以上版本中,无法直接使用 ClipboardManagersetText() 方法来复制文本,否则会抛出 java.lang.IllegalStateException 异常。这是由于 Android 10 引入了新的隐私限制,禁止应用在后台无限制地访问剪贴板。

下面将介绍如何在 Kotlin 代码中复制文本,并兼容 Android 10 及以上版本的限制。

1. 声明剪贴板管理器

在代码中先声明一个 ClipboardManager 对象:

val clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

这里的 getSystemService() 方法可以从 Android 系统的服务中获取一个 ClipboardManager 对象,需要传入参数 Context.CLIPBOARD_SERVICE。然后使用 as 关键字将其转换为 ClipboardManager 类型。

2. 复制文本

在需要复制文本的地方,调用 clipboardManager.setPrimaryClip() 方法,并使用 ClipData.newPlainText() 创建一个纯文本格式的 ClipData 对象:

val clipData = ClipData.newPlainText("label", "text")
clipboardManager.setPrimaryClip(clipData)

这里的 "label" 是一个可选的标签,用于区分多个 ClipData 对象;"text" 是要复制的文本。

3. 检查剪贴板访问权限

在 Android 10 及以上版本中,应用在后台默认无法无限制地访问剪贴板。如果想要在后台复制文本,必须先申请剪贴板访问权限。否则会抛出 java.lang.SecurityException 异常。

为了保证兼容性,需要先检查当前应用是否已经被授予剪贴板访问权限:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&
    clipboardManager.primaryClipDescription?.label != null &&
    clipboardManager.primaryClipDescription!!.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN) &&
    packageManager.checkPermission(Manifest.permission.READ_CLIPBOARD_IN_BACKGROUND, packageName) ==
    PackageManager.PERMISSION_GRANTED
) {
    // 可在后台访问剪贴板
    ...
} else {
    // 无法在后台访问剪贴板
    ...
}

这里使用了三个条件来判断当前是否可以在后台访问剪贴板:

  • Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q,即当前 Android 版本是否高于或等于 Android 10;
  • clipboardManager.primaryClipDescription?.label != null,即当前剪贴板中是否存在一个 ClipData 对象,并且其标签不为空;
  • clipboardManager.primaryClipDescription!!.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN),即当前剪贴板中的 ClipData 对象是否包含纯文本格式的数据。

如果以上条件都满足,还需要检查当前应用是否被授予了 READ_CLIPBOARD_IN_BACKGROUND 权限。

总结

使用 Kotlin 在 Android 10 及以上版本中复制文本,需要先声明一个 ClipboardManager 对象,然后调用 clipboardManager.setPrimaryClip() 方法来复制文本。在检查剪贴板访问权限时,需要注意 Android 10 的新隐私限制,以及判断剪贴板中是否包含纯文本格式的数据。