Clipboard是Android提供的一个系统服务,它提供了一个全局的剪贴板,让文字、图片、数据,在多App间共享成为可能,今天,我们来了解下它的真面目,以及被玩坏的新姿势。

老规矩,Google API文档镇楼:
https://developer.android.com/guide/topics/text/copy-paste.html

说实话,如果不是为了让Clipboard玩出花,我真不想写这一篇,因为——这文档写的真是太TM详细了。

Clipboard应用

我们先来看看一些App对Clipboard的应用,例如手机迅雷,如果你复制了一个链接,那么打开迅雷后,会自动检测并提示下载:

再例如一些翻译软件,例如有道词典、沪江小D,他们都有一个功能,即复制查词,使用的也是这个原理,我这没装这些App,就不截图了,再例如比较常用的手淘喵口令,实际上也是利用这个功能,当然,也有一些比较专业的Clipboard App,例如Clipboard Actions:

我们可以看见,实际上,他就是帮你解析了各种可能的剪贴板,并对他们提供了各种后续功能的集合,确实非常实用,不过,看完今天的文章,相信你要写一个这样的App,估计也就分分钟。

OK,这些就是一些Clipboard的基本使用场景,更多场景,没有做不到,只有想不到。

基本使用

Clipboard的基本使用,就是三部曲。

获得ClipboardManager:

ClipboardManager mClipboardManager = mClipboardManager =
(ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

Copy:

ClipData mClipData;
String text = "hello world";
mClipData = ClipData.newPlainText("test", text);
mClipboardManager.setPrimaryClip(mClipData);

Paste:

ClipData clipData = mClipboardManager.getPrimaryClip();
ClipData.Item item = clipData.getItemAt(0);
String text = item.getText().toString();

结束了,简直不能再简单,API文档也写的非常详细,Demo都写了好几个。

不止于文字

我们可以创建以下三种类型的ClipData:

类型 描述
Text newPlainText(label, text) 返回ClipData对象,其中ClipData.Item对象包含一个String
URI newUri(resolver, label, URI) 返回ClipData对象,其中ClipData.Item对象包含一个URI
Intent newIntent(label, intent) 返回ClipData对象,其中ClipData.Item对象包含一个Intent

对应的,我们也能获取到不同类型的ClipData。

ClipboardManager管理

ClipboardManager中有很多判断与操作方法:

类型 描述
getPrimaryClip() 返回剪贴板上的当前Copy内容
getPrimaryClipDescription() 返回剪贴板上的当前Copy的说明
hasPrimaryClip() 如果当前剪贴板上存在Copy返回True
setPrimaryClip(ClipData clip) 设置剪贴板上的当前Copy
setText(CharSequence text) 设置文本到当前Copy
getText() 获取剪贴板复制的文本

玩出一朵小FaFa

在了解了上面这些内容后,我们就可以做一些比较有意思的东西了,例如,我们可以通过监控用户剪贴板中的内容,来做一些自动的推断,例如,用户复制了一个英文单词,那么我们可以推断,用户可能要进行翻译,再例如,用户复制了一个链接,那么我们也可以推断,用户可能需要打开这个链接,等等。

Google在文档中,直接给出了示例的代码:

// Examines the item on the clipboard. If getText() does not return null, the clip item contains the
// text. Assumes that this application can only handle one item at a time.ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);// Gets the clipboard as text.
pasteData = item.getText();// If the string contains data, then the paste operation is done
if (pasteData != null) {return;// The clipboard does not contain text. If it contains a URI, attempts to get data from it
} else {Uri pasteUri = item.getUri();// If the URI contains something, try to get text from itif (pasteUri != null) {// calls a routine to resolve the URI and get data from it. This routine is not// presented here.pasteData = resolveUri(Uri);return;} else {// Something is wrong. The MIME type was plain text, but the clipboard does not contain either// text or a Uri. Report an error.Log.e("Clipboard contains an invalid data type");return;}
}

其实非常简单,就是判断三种复制类型,但是我们可以在App中设置一些类似Scheme的标记,用来进行一些功能的区分,就好像淘宝的喵口令——『喵口令XXXXXXX喵口令』,我们可以通过解析这些Scheme,来获取内容,并进行对应的操作。这也是我们前面提到的Clipboard Actions这个App做的事情。

玩出一朵大FaFa

我们首先来看ClipData.Item.coerceToText()这样一个方法,这个方法可以将剪贴板里面的内容,直接转化为文字,但是这个转换,是有一定算法的,在API文档中有比较详细的说明,这里简单的看下:

这个东西能干什么呢,我们知道,有些App会复制之后,打开一个Intent,为了简单,会直接通过ClipData.Item.coerceToText()来返回一个Intent的URI,然后通过解析URI来启动Intent,那么这里就可以被我们来利用了。

public void fakeClipboard() {// 添加一个假的Intent,模拟用户最新加入的剪贴板内容Intent intent = new Intent();intent.setComponent(new ComponentName("com.hjwordgames", "com.hjwordgames.Splash"));intent.setAction("android.intent.action.VIEW");ClipData setClipData;setClipData = ClipData.newIntent("intent", intent);mClipboardManager.setPrimaryClip(setClipData);// 呵呵哒 App以为获取的是自己需要的Intent,结果却被狸猫换太子ClipData clipData = mClipboardManager.getPrimaryClip();ClipData.Item myItem;myItem = clipData.getItemAt(0);String clipDataString = myItem.coerceToText(this.getApplicationContext()).toString();try {Intent myIntent = Intent.parseUri(clipDataString, 0);startActivity(myIntent);} catch (URISyntaxException e) {e.printStackTrace();}
}

其实不一定是通过Fake Intent,其它的文字、图片等等,都可以被『偷天换日』。

另外,要实现这个监听,我们需要注册一个回调——addPrimaryClipChangedListener,Android真是体贴到没朋友:

mClipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {@Overridepublic void onPrimaryClipChanged() {Log.d("xys", "onPrimaryClipChanged: ");}
});

那么在这里,我们就可以完全实现剪贴板的『狸猫换太子』。那么假如我们是一个『某淘』软件的竞品,那么完全可以让『汪口令』失效,甚至替换为我们自己的应用,同理,还有一些翻译类软件也是一样,不过还好,也许是我的内心比较阴暗,目前还没有看见这样的App。

欢迎大家关注我的公众号:

Clipboard还能玩出花相关推荐

  1. 简单的Postman,还能玩出花?

    Postman是一款我们在工作中使用频率非常高的API调试工具,估计很多童鞋在使用它时也比较粗暴,填好接口地址.参数,直接send就完事了,估计大家要说了,这么简单的东西还能玩出什么花来.今天就和大家 ...

  2. Spring Security 玩出花!两种方式 DIY 登录

    Spring Security 玩出花!两种方式 DIY 登录 一般情况下,我们在使用 Spring Security 的时候,用的是 Spring Security 自带的登录方案,配置一下登录接口 ...

  3. 简单的Postman,硬是玩出花!我能咋办

    Postman是一款我们在工作中使用频率非常高的API调试工具,估计很多童鞋在使用它时也比较粗暴,填好接口地址.参数,直接send就完事了,估计大家要说了,这么简单的东西还能玩出什么花来.今天就和大家 ...

  4. android 手机输入法表情,最近手机输入法玩出花,讯飞输入法安卓版让表情包说话?...

    原标题:最近手机输入法玩出花,讯飞输入法安卓版让表情包说话? 网络社交流行"能发图就别说话",但一夜之间,一部分高级玩家已经进化到"斗嘴",参加斗图的表情拥有了 ...

  5. 如何在新时代下的结对编程中将代码玩出花来

    好久没写文章了,标题起的有点膨胀. 你猜我想说什么 我想写一个结对编程小记.最近在和 S (帅气的花名) 利用业余时间,进行了一次结对编程.现在我准备把结对编程的一些思考分享给大家,下面开始吧. PS ...

  6. Linux- 系统随你玩之--玩出花活的命令浏览器下

    文章目录 1.背景 2.常规操作 2.1.测试相关 2.1.1.修改 HTML 请求标头 2.1.2. 模拟不同浏览器发出 2.1.3.重定向 2.2. 下载相关操作 2.2.1. 后台下载 2.2. ...

  7. Linux- 系统随你玩之--玩出花活的命令浏览器-双生姐妹花

    文章目录 1.背景 2.命令浏览器-双生姐妹花 2.1.姐妹花简介 2.2 .验名正身 2.3.常用功能选项 3.常用实操 3.1.发送请求获取文件 3.1.1.抓取页面内容到一个文件中 3.1.2. ...

  8. 杜邦接口还有一个跟他相反的叫什么_日本新晋网红“Imma”出道,虚拟技术还能玩出什么花样?...

    原标题:日本新晋网红"Imma"出道,虚拟技术还能玩出什么花样? 作者 | Talk君 图片均来源于网络 "她竟然不是真人?" 这是很多人得知"Imm ...

  9. 代码注释也可以玩出花来

    1.这是一个被代码耽误的诗人 2.来一份1987年的代码看看 3.产品经理要对此负责 ‍4.不敢看,也不敢问 5.老实的程序员 6.程序员正确发牢骚的地方 7.阅读源码的人,心里一定的崩溃的 8.第一 ...

最新文章

  1. UnicodeEncodeError\: gbk codec cant encode character \\xa1 in position 9699的解决办法
  2. python办公模块_Python 办公自动化教程
  3. LeetCode: 102. Binary Tree Level Order Traversal
  4. FPGA优化之高扇出
  5. 小谈 Java 单元测试
  6. java五子棋以当前空位为中心 取9个点_java 五子棋有点问题,哪位帮忙破一下、、...
  7. 方舟服务器修改错误,方舟进服务器提示网络错误怎么办 | 手游网游页游攻略大全...
  8. asp.net 截屏 截取web页面 源代码
  9. 自动化测试---页面截图
  10. yum提示“Cannot retrieve metalink for repository: epel/x86_64” 解决方法
  11. Oracle SQL注入常用语句
  12. jieba 使用笔记
  13. 企业微信工具栏获取外部联系人unionid
  14. vagaa搜索服务器没响应,Vagaa(哇嘎)搜索不到资源怎么办?
  15. 小米电纸书MiReader安装微信读书
  16. 基4fft matlab,快速傅里叶变换基4时间抽取FFT算法
  17. ISBN码书籍信息查询
  18. 计算机打不开guest用户,win10系统打不开guest账户的解决方法
  19. 机器学习项目一:共享单车
  20. 【干货】java课程实战培训

热门文章

  1. jvm十:类加载器解析
  2. 从构建分布式秒杀系统聊聊验证码
  3. bzoj 2878 [Noi2012]迷失游乐园——树上的期望dp
  4. 10.5 QQ 支持
  5. j2se学习中的一些零碎知识点2之基础知识
  6. 不仅仅是商务旗舰,金立M2017的拍照实力同样给力
  7. Linux系统分区和挂载浅谈
  8. 汇编语言第二课作业2.1
  9. nginx http请求强转https 无www强转www服务 过百度https认证
  10. java list多字段排序_java中list通过多条件排序