首页 > 解决方案 > 为什么在同一个应用程序中无法再访问为我的应用程序填充的剪贴板?

问题描述

我为填充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 兼容,则没有已知的方法可以在没有低级编程的情况下擦除剪贴板。

标签: androidkotlin

解决方案


推荐阅读