最近开发过程中有使用到复制/粘帖功能,也在其中遇到了一些问题,就顺势学习一下复制粘贴相关的知识。

一、前言

Android提供了一个强大的剪切板框架(以至于在复制某些内容粘帖到我的项目中的时候出现的格式问题的BUG)用于复制和粘帖。同时支持简单和复杂的数据类型,简单的文本数据直接存储在剪贴板中,而复杂的数据存储为一个引用,即粘贴应用程序解析为内容提供者(这里涉及到ContentProvider)。

二、框架&使用

框架图

要复制数据,应用程序将ClipData对象放在ClipboardManager全局剪贴板上。它ClipData包含一个或多个ClipData.Item对象和一个 ClipDescription对象。要粘贴数据,应用程序会从中ClipData获取其MIME类型ClipDescription,并从ClipData.Item或从内容提供者 获取数据ClipData.Item。

可以看出Android剪贴板框架主要涉及到ClipboardManager、ClipData、ClipData.Item、ClipDescription这四个类,下面详细说明

ClipboardManager是系统全局的剪贴板对象,通过context.getSystemService(CLIPBOARD_SERVICE)获取。

ClipData,即clip(剪切)对象,在系统剪贴板里只存在一个,当另一个clip对象进来时,前一个clip对象会消失。

ClipData.Item,即 data item,它包含了文本、Uri或者Intent数据,一个clip对象可以包含一个或多个Item对象。通过 addItem(ClipData.Item item)可以实现往clip对象中添加Item。

文本:文本是直接放在 clip 对象中,然后放在剪贴板里;粘贴这个字符串的时候直接从剪贴板拿到这个对象,把字符串放入你的应用存储中。

Uri:对于复杂数据的剪贴拷贝并不是直接将数据放入内存,而是通过 Uri 来实现,毕竟 Uri 的中文名叫:统一资源标识符。通过 Uri 能定位手机上所有资源,这当然能实现拷贝了,只不过需要做一些额外的处理工作。(对于 Uri 不是很理解,如有误,望指正~)

Intent:复制的时候 Intent 会被直接放入 clip 对象,这相当于拷贝了一个快捷方式。

ClipDescription ,即 clip metadata,它包含了 ClipData 对象的 metadata 信息。可以通过 getMimeType(int index) 获取(一般 index = 0,有兴趣的可以去看下 ClipData 的源码)。MimeType 一般有以下四种类型:

// 对应 ClipData.newHtmlText(label, text, htmlText) 的 MimeType

public static final String MIMETYPE_TEXT_HTML = "text/html";

// 对应 ClipData.newIntent(label, intent) 的 MimeType

public static final String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";

// 对应 ClipData newPlainText(label, text) 的 MimeType

public static final String MIMETYPE_TEXT_PLAIN = "text/plain";

// 对应 ClipData newPlainText(label, text) 的 MimeType

public static final String MIMETYPE_TEXT_URILIST = "text/uri-list";

接下来看看简单的使用,以文本操作为例

public void putTextIntoClip(Context context){

ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);

//创建ClipData对象

ClipData clipData = ClipData.newPlainText("simple text copy", "Clipboard test.");

//添加ClipData对象到剪切板中

clipboardManager.setPrimaryClip(clipData);

}

创建ClipData的方法还有另外四个:

//创建一个包含 htmlText 的 ClipData

//一般在浏览器中对网页进行拷贝的时候会调用此方法,其中 htmlText 是包含 HTML 标签的字符串

public static ClipData newHtmlText(CharSequence label, CharSequence text, String htmlText)

//创建一个包含 Intent 的 ClipData

public static ClipData newIntent(CharSequence label, Intent intent)

//创建一个包含 Uri 的 ClipData,MimeType 会根据 Uri 进行修改

public static ClipData newUri(ContentResolver resolver, CharSequence label, Uri uri)

//与 newUri 相对应,但是并不会根据 Uri 修改 MimeType

public static ClipData newRawUri(CharSequence label, Uri uri)

从剪切板中获取数据,同样以文本操作为例

public void getTextFromClip(Context context){

ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);

//判断剪切版时候有内容

if(!clipboardManager.hasPrimaryClip())

return;

ClipData clipData = clipboardManager.getPrimaryClip();

//获取 ClipDescription

ClipDescription clipDescription = clipboardManager.getPrimaryClipDescription();

//获取 lable

String lable = clipDescription.getLabel().toString();

//获取 text

String text = clipData.getItemAt(0).getText().toString();

}

顺带说一下之前遇到的问题,我boss直接从网易新闻复制了内容,粘帖到我们自己的app中,之后文本的样式都不对,这是因为复制的内容是包含HTML标签的字符串,导致内容显示有问题,String text = clipData.getItemAt(0).coerceToText(context).toString();最后使用coerceToText()将剪贴板数据强制转换为文本解决问题。

三、官方建议

Designing Effective Copy/Paste Functionality

To design effective copy and paste functionality for your application, remember these points:

At any time, there is only one clip on the clipboard. A new copy operation by any application in the system overwrites the previous clip. Since the user may navigate away from your application and do a copy before returning, you can't assume that the clipboard contains the clip that the user previously copied in your application.

The intended purpose of multiple ClipData.Item objects per clip is to support copying and pasting of multiple selections rather than different forms of reference to a single selection. You usually want all of the ClipData.Item objects in a clip to have the same form, that is, they should all be simple text, content URI, or Intent, but not a mixture.

When you provide data, you can offer different MIME representations. Add the MIME types you support to the ClipDescription, and then implement the MIME types in your content provider.

When you get data from the clipboard, your application is responsible for checking the available MIME types and then deciding which one, if any, to use. Even if there is a clip on the clipboard and the user requests a paste, your application is not required to do the paste. You should do the paste if the MIME type is compatible. You may choose to coerce the data on the clipboard to text using coerceToText() if you choose. If your application supports more than one of the available MIME types, you can allow the user to choose which one to use.

为设计有效的复制和粘贴功能,请记住以下几点:

任何时候,剪切板只有一个clip。系统中任何一个app的复制操作都会覆盖上一次操作。用于用户可以到导航你的app,在返回之前复制一次,你不能假设剪切板中包含用户在你的app中复制剪切的数据。

clip的多个ClipData.Item对象是支持复制和粘贴多个选择,而不是对单个选择的不同形式的引用。你通常希望ClipData.Item剪辑中的所有 对象具有相同的形式,即它们应该是简单的文本,内容URI或者Intent混合。

当你提供数据是,你可以提供不同的MIME属性,添加MIME类型到ClipDescription中,然后在内容提供者中事项MIME类型。

当你获取剪切板的数据时,你的app检查MIME类型的可用性然后确定使用的MIME类型。即使用户请求粘帖剪切板上的数据,你的app也不是需要粘帖的。如果MIME类型兼容你应该粘帖。你也可以选择用coerceToText()方法强制将数据转化为文本。如果你的app支持多种MIME类型,你可能允许用户选择使用MIME类型

Android剪切板标签,教你使用剪切板——Android中的复制粘贴相关推荐

  1. Android中的复制粘贴

    The Clipboard Framework 当使用clipboard framework时,把数据放在一个剪切对象(clip object)里,然后这个对象会放在系统的剪贴板里. clip obj ...

  2. ios开发读取剪切板的内容_iOS开发_iphone 实现剪贴板操作_iphone 复制粘贴功能(转)...

    在iOS中,可以使用剪贴板实现应用程序之中以及应用程序之间实现数据的共享.比如你可以从iPhone QQ复制一个url,然后粘贴到safari浏览器中查看这个链接的内容. 一.在iOS中下面三个控件, ...

  3. android浏览器多标签页面,360浏览器HD推出Android版 支持多标签页浏览

    [搜狐IT消息]9月8日消息,<移动新发现>今日报道,继360浏览器HD正式登陆苹果官方App Store后,360日前发布了适用于Android平板电脑的360浏览器HD(aPad)1. ...

  4. Android中的复制粘贴?

    我们知道,windows系统中有剪贴板,Android中也有剪切板(ClipboardManager) 在android api 11之前,ClipboardManager全称(父类):android ...

  5. 服务器xp系统无法粘贴到本地,3步教你xp、2003远程桌面怎样复制粘贴本地文件

    win2003和winxp系统都比较古老了,但是现在仍有很多客户在使用,原因是因为这两个系统占用系统内存特别小,但是远程桌面使用会有一点很不方便,很多客户会问,怎么复制本地文件到远程桌面里呢,下面我们 ...

  6. Qt剪切板QClipboard 复制粘贴自定义数据

    一.常用数据类型 QClipboard类提供了对操作系统剪切板的操作接口,最常用的做法是复制粘贴文本,如下面示例 QClipboard *clipboard = QGuiApplication::cl ...

  7. Android 防复制粘贴使用总结

                               SDKClipboard类(防复制粘贴) 为提供更安全的防复制粘贴的解决方案,eSDK引入了安全剪切板.用户使用安全剪切板接口,既能防止内容从沙箱 ...

  8. android输入法剪切板历史记录,讯飞输入法剪切板功能知多少?

    原标题:讯飞输入法剪切板功能知多少? 复制+粘贴"是日常操作,但批量复制时前次内容就被覆盖,粘贴很不方便:如果一次复制给多个朋友,依然需要来回操作很不省心:有时翻找上一次或者以前的聊天内容, ...

  9. android 剪切板监听_安卓监听剪切复制粘贴事件实例

    本文的剪切复制粘贴事件只针对文本,URI 和 intent 不在讨论范围内. 实例代码实现了2个功能: 监听剪切复制粘贴事件: 获取剪切复制或粘贴的文本: 剪切复制 有2个方法监听剪切复制事件:剪切板 ...

  10. 计算机关闭系统剪切板上的内容,怎样删除电脑粘贴板上的内容?三个方法教你清空剪切板...

    我们平时经常使用电脑,但是大多数人其实只是懂得最基础的一些电脑应用,也就是其实只懂得一些皮毛.还有一些工作者虽然会经常使用电脑,电脑中的很多软件也可以熟练应用.可是实际上对于电脑深层的一些操作还是没有 ...

最新文章

  1. 百度编辑器修改,不让它自动替换html标签
  2. 2.4 Add a dynamic map
  3. RHEL6基础四十九之RHEL文件(夹)权限进阶篇
  4. 【数据结构与算法】之深入解析“不同路径III”的求解思路与算法示例
  5. 《移动App测试的22条军规》—第1章1.2节移动App的生命周期
  6. windows下node安装
  7. 一点等于多少厘米_马桶知识介绍,你了解马桶多少
  8. Bert在CV领域的应用
  9. 单片机c语言编程要点,第1章单片机的C语言编程_2015要点.ppt
  10. ERROR1045(28000): AccessforuserODBC‘@‘ (using password: YES)
  11. python画相关系数矩阵图_pyhton中matplotlib箱线图的绘制(matplotlib双轴图、箱线图、散点图以及相关系数矩阵图))...
  12. python 抓取豆瓣一拍一所有妹子客片
  13. Qt echarts 教程(1):qt echarts的基本使用方法
  14. 第二十七篇 -- 学习第四十五天打卡20190810
  15. Android开发之指南针
  16. 择校秘籍|保研去 北大软微 还是 中科院计算所?
  17. 11. 求解一元二次方程
  18. kubernetes安装脚本-非高可用版。一键安装含Master和Node。
  19. pjsip php,pjsip 搭建 sip服务器
  20. Android开发 如何计算最小屏幕宽度sw

热门文章

  1. DCDC电源负载瞬态响应分析
  2. ACM常用数据结构小结与实现
  3. java平均数函数_java求平均数的函数
  4. 【建行】龙支付新老用户赚200元详细教程
  5. C语言中 各数据类型求绝对值abs(),fabsf()等函数的使用。
  6. css3做的好看的小便签,纯CSS3 便签条折角效果
  7. 这里带你了解IR2104驱动电路
  8. Electron 仿制WeGame(二)
  9. crc原理及c代码实现
  10. 创建一个三维空间形状,算立方体,球体,正三棱锥表面积体积