android - 为什么在同一个应用程序中无法再访问为我的应用程序填充的剪贴板?
问题描述
我为填充Android clipboard
编写了这个函数:
fun copyToClip(s: String = "") {
val clipboard = cx.getSystemService
(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText(if (s == "") "" else "Formula", s);
clipboard.setPrimaryClip(clip);
}
此功能用于粘贴clipboard
内容
fun clipToPaste(): String {
val clipboard = cx.getSystemService(Context.CLIPBOARD_SERVICE)
as ClipboardManager
if ((!clipboard.hasPrimaryClip()) ||
!(clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN)))
return ""
else
return clipboard.getPrimaryClip().getItemAt(0).getText().toString()
}
而这个例程用于测试空clipboard
。
fun hasClip(): Boolean {
val clipboard = cx.getSystemService(Context.CLIPBOARD_SERVICE)
as ClipboardManager
if ((clipboard.hasPrimaryClip()) ||
clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN))
return clipboard.getPrimaryClip().getItemAt(0).getText().toString().length!=0
return false
}
它有效。hasClip
但是,在返回后的一段时间false
,当我调试时,剪贴板值为""
(空)。
奇怪的是clipboard
内容仍然可用于其他系统应用程序,但不再适用于我自己的应用程序。
我不知道发生了什么...
PS:我的应用程序是如何在 API 28 之前在手机中运行的,我不使用clearPrimaryClip
功能来清除clipboard
更新
使用编辑器MonoSpace进行新测试,显示所有活动的文本剪贴板,我得出的结论是这段代码有问题
val clipboard = cx.getSystemService(Context.CLIPBOARD_SERVICE)
as ClipboardManager
val clip = ClipData.newPlainText("", "")
clipboard.setPrimaryClip(clip)
失败是因为此方法不会清除剪贴板的任何条目,也不会创建新的空条目。如果您有 4 个条目,则继续执行相同的 4 个条目。唯一的区别是您无法访问应用程序内的剪贴板,直到您在应用程序内复制某些内容。
假设应用程序必须与 pre API 28 兼容,则没有已知的方法可以在没有低级编程的情况下擦除剪贴板。
解决方案
推荐阅读
- javascript - 多选选项返回 React 中两个选择的结果
- javascript - DataTable如何定义多个初始化参数?
- ruby - 用 RVM 安装 ruby 找不到
- php - 无法判断 IPN 是否正常工作,因为它没有写入 sqlDatabase
- iot - 是否有月损小于 10 毫秒的自动实时时钟?
- c# - 标签中的文本可以包含eval吗?
- javascript - 作为 chrome 响应的一部分返回的调试脚本
- python - scipy.stats.chisquare 没有给出输入数据的预期结果
- javascript - 我的翻转时钟走得太快,跳过偶数。我怎样才能解决这个问题?
- python - Poll several messages from Kafka