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);
  • 1
  • 2
  • 1
  • 2

Copy:

ClipData mClipData;
String text = "hello world";
mClipData = ClipData.newPlainText("test", text);
mClipboardManager.setPrimaryClip(mClipData);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

Paste:

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

结束了,简直不能再简单,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;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

其实非常简单,就是判断三种复制类型,但是我们可以在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();}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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

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

mClipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {@Overridepublic void onPrimaryClipChanged() {Log.d("xys", "onPrimaryClipChanged: ");}
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

Android Clipboard 基本使用相关推荐

  1. Android中的复制粘贴

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

  2. Android优秀项目下载列表

    FlipsideCamera: https://github.com/andb129/FlipsideCamera 从两个摄像头同时拍下某一个瞬间的 app rebase-android: https ...

  3. Android 开源项目列表

    FlipsideCamera: https://github.com/andyb129/FlipsideCamera 从两个摄像头同时拍下某一个瞬间的 app rebase-android: http ...

  4. 如何自学Android--转

    原文地址:http://blog.csdn.net/lavor_zl/article/details/51217319 1. Java知识储备 本知识点不做重点讲解:  对于有基础的同学推荐看< ...

  5. 转载:实用 FRIDA 进阶 --- objection :内存漫游、hook anywhere、抓包

    转载:实用FRIDA进阶:内存漫游.hook anywhere.抓包:https://www.anquanke.com/post/id/197657 frida github 地址:https://g ...

  6. 安卓应用安全指南 六、困难问题

    六.困难问题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 在 Andro ...

  7. :实用 FRIDA 进阶 --- objection :内存漫游、hook anywhere、抓包

    转载:实用FRIDA进阶:内存漫游.hook anywhere.抓包:https://www.anquanke.com/post/id/197657 frida github 地址:https://g ...

  8. ZXing 源码分析(简阅)

    导读 虽然有句话在程序员中说:"别人造好的轮子,不要重复发明轮子",但是只会用别人的东西,对自己个人技术的提升也是不可能的0.0 那么最好的方式就是看源码. 本篇文章就是个人在使用 ...

  9. objection - 基于frida的命令行hook工具食用手册

    0x1 介绍&安装Objection objection是基于frida的命令行hook工具, 可以让你不写代码, 敲几句命令就可以对java函数的高颗粒度hook, 还支持RPC调用 目前只 ...

最新文章

  1. 1.18 static的常见问题和使用误区
  2. 你有一个向LiveVideoStackCon讲师提问的机会
  3. Linux下编译GDAL
  4. vscode中安装webpack_VSCode下手动构建webpack项目(示例代码)
  5. bzoj2425 [HAOI2010]计数 组合数
  6. java 集合操作工具包_java之操作集合的工具类--Collections
  7. 使用 Segue 傳送選取的 Table Cell 內容到下一個 View
  8. linux服务器中解压与打包jar文件
  9. android视图动画(ViewAnimation动画)
  10. 使用FlashPaper在线转换.doc为.swf
  11. GAS超标,以太坊告急
  12. 帝豪gs车机系统wince_用销量告诉你答案 选帝豪GS准没错
  13. [Python]调用百度API进行自然语言处理 标签、关键字 以及 词法分析
  14. python乱码系列1
  15. 第一讲 Matlab/Simulink入门——简单系统模型的Simulink仿真
  16. 请给我一篇关于父母育儿方面书籍推荐的文案
  17. linux音频文件格式转换,在Ubuntu @ Linux 中音频和音乐文件的格式转换
  18. 响应式网页设计_响应式网页设计–如何使网站在手机和平​​板电脑上看起来不错
  19. 建筑与计算机技术,建筑与结构设计中计算机技术的应用探析
  20. python实现自动发送qq消息

热门文章

  1. 李子柒与袁隆平同台获奖,程序员表示:我们太像了!
  2. 手机无root安装v2p
  3. Tech Insight首登武汉云栖大会,阿里云 MVP匠心打造
  4. Reno7 60W超级闪充充电架构
  5. s5pv210-nand-dm9000-dts-2
  6. 精灵混合加密系统_多种解锁体验,小益天猫精灵智能指纹锁E206T
  7. Spring Boot 与ElasticSearch
  8. RPA应用场景-差旅与报销
  9. 上门按摩预约系统的优势
  10. selectionSort