📅  最后修改于: 2023-12-03 15:17:09.915000             🧑  作者: Mango
在 Android 10 及以上版本中,无法直接使用 ClipboardManager
的 setText()
方法来复制文本,否则会抛出 java.lang.IllegalStateException
异常。这是由于 Android 10 引入了新的隐私限制,禁止应用在后台无限制地访问剪贴板。
下面将介绍如何在 Kotlin 代码中复制文本,并兼容 Android 10 及以上版本的限制。
在代码中先声明一个 ClipboardManager
对象:
val clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
这里的 getSystemService()
方法可以从 Android 系统的服务中获取一个 ClipboardManager
对象,需要传入参数 Context.CLIPBOARD_SERVICE
。然后使用 as
关键字将其转换为 ClipboardManager
类型。
在需要复制文本的地方,调用 clipboardManager.setPrimaryClip()
方法,并使用 ClipData.newPlainText()
创建一个纯文本格式的 ClipData
对象:
val clipData = ClipData.newPlainText("label", "text")
clipboardManager.setPrimaryClip(clipData)
这里的 "label"
是一个可选的标签,用于区分多个 ClipData
对象;"text"
是要复制的文本。
在 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 的新隐私限制,以及判断剪贴板中是否包含纯文本格式的数据。