安卓 复制文字 及从 剪贴(切)板 获取内容

Posted 夜尽天明89

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓 复制文字 及从 剪贴(切)板 获取内容相关的知识,希望对你有一定的参考价值。

最近有个需求,进入某个界面后,要监听 剪贴(切)板 中是否有文字,有的话,拿到,分析是否是需要的,然后进行对应的处理。

功能看着简单,但是 因为手机系统原因,踩了个坑,这里记录下

先来个复制文字功能代码,很简单,不多说了

导包
import android.content.ClipboardManager

代码
val clipboardManager =
context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager
val clicpData =ClipData.newPlainText("字符串", "字符串")
clipboardManager?.primaryClip = clicpData

获取剪贴板内容

导包
import android.content.ClipData
import android.content.ClipboardManager

//获取复制内容
private fun getCopyContent(context: Context): String 

	try 

		val clipboardManager: ClipboardManager? =
			context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager

		if (clipboardManager != null) 

			val clipData: ClipData? = clipboardManager.primaryClip

			if (clipboardManager.hasPrimaryClip() && clipData != null && clipData?.itemCount ?: 0 > 0) 

				val item: ClipData.Item = clipData.getItemAt(0)

				val sequence: CharSequence = item.text

				return sequence.toString()

			 else 
				return ""
			

			 else 
				return ""
			

	 catch (e: Exception) 
		return ""
	


使用

copy_tv?.post 
	val text: String = getCopyContent(this)

	if (text.isEmpty()) 
		Toast.makeText(this, "复制文本为空", Toast.LENGTH_SHORT).show()
	 else 
		copy_tv?.text = text
	

这里有个地方是坑,要注意,就是 view.post…

同样的代码,在安卓 8.1.0系统手机上正常,但是在10就不行,获取到的内容,一直为空。

这是因为,在10系统上,不用post时

clipboardManager.hasPrimaryClip()  = false
clipData = null

通过查阅,得到一个猜想:在onCreate或者onResume方法时,View可能还处于申请获取焦点状态,导致获取不到剪切板数据,所以当所有View都绘制完毕后,就可以获取到剪切板数据了。

也就是说,在10上,需要等控件由了焦点,才能获取到剪切板中的数据。所有,这里用了post,在绘制完成,有了焦点后,再去检查 剪切板中是否有内容。

验证(图片是否有影响,分2种情况验证):
1、在头条上,找个内容进行复制

打开测试APP,看是否会自动获取及展示文字

2、如果文字中间有图片呢?打开浏览器,随便找个带图片的新闻

打开测试APP

以上是关于安卓 复制文字 及从 剪贴(切)板 获取内容的主要内容,如果未能解决你的问题,请参考以下文章

js 如何实现将div内的内容放到剪切板?

js将内容复制到剪切板(最简单的实现方式)

点击复制文字到剪贴板兼容性安卓ios

QT读取剪切板内容-实现复制粘贴文本和图片

js 操作剪贴板

C#复制图文信息到剪切板再粘贴到word