Android提供复制和粘贴功能强大的基于剪贴板的框架。它支持简单和复杂的数据类型,包括文本串,复杂的数据结构,文本和二进制数据流,甚至应用的资产。简单的文本数据被直接存储在剪贴板中,而复杂的数据被存储作为该粘贴应用程序与内容提供商解析的引用。复制和粘贴都在应用程序中,并实现了框架的应用程序之间进行。
由于框架的一部分使用内容提供商,这个主题假定一些熟悉Android的内容提供商的API,这是在主题中介绍
的内容提供商。
剪贴板框架
当您使用剪贴板框架,你把数据转化为剪辑对象,然后把剪辑对象在全系统剪贴板。剪辑对象可以采取三种形式:
- 文本
-
文本字符串。您可以直接把串入剪辑对象,您然后将复制到剪贴板。要粘贴字符串,将剪贴板中的剪辑对象和字符串复制到您的应用程序的存储。
- URI
-
一个
开放的 代表任何形式的URI的对象。这主要是用于从内容提供者复制复杂的数据。要复制的数据,你把一个
开放的 对象转换为剪辑对象,并把剪辑对象复制到剪贴板。要粘贴数据,你得到的剪辑对象,得到
的Uri 对象,它解析为数据源,如内容提供商,以及从源头到应用程序的存储复制数据。
- 意图
-
一个
意图 。这支持复制应用程序快捷方式。要复制的数据,创建一个意图,把它变成一个剪辑对象,并把剪辑对象复制到剪贴板。要粘贴数据,你得到的剪辑对象,然后意图对象复制到你的应用程序的内存区域。
剪贴板只拥有一次剪辑对象。当应用程序将一个剪辑对象在剪贴板上,以前的剪辑对象消失。
如果你希望允许用户将数据粘贴到你的应用程序,你不必处理所有类型的数据。给你的用户将其粘贴选项之前,您可以检查剪贴板上的数据。除了具有一定的数据格式,剪辑对象也包含了告诉你什么MIME类型或类型可用的元数据。该元数据可以帮助你决定??是否你的应用程序可以做一些与剪贴板数据非常有用。例如,如果你有一个应用程序,主要处理可能要忽略包含URI或意图剪辑对象的文本。
您也可以允许用户将文本粘贴无论在剪贴板上的数据的形式。要做到这一点,您可以强制剪贴板数据转换成文本表示,然后粘贴这个文本。这是一节中所述强制转换剪贴板文本。
剪贴板类
本节介绍剪贴板框架使用的类。
ClipboardManager
在Android系统中,系统剪贴板是由全球代表
ClipboardManager 类。您不要直接实例化这个类; 相反,你会得到通过调用它的一个引用
getSystemService(CLIPBOARD_SERVICE) 。
ClipData,ClipData.Item和ClipDesc??ription
将数据添加到剪贴板中,您可以创建一个ClipData 同时包含数据的描述和数据本身的对象。剪贴板仅容纳一个
ClipData 一次。一个ClipData 包含
ClipDescription 对象和一个或多个
ClipData.Item 对象。
一个ClipDescription 对象包含有关片段元数据。尤其是,它含有可用MIME类型的片段的数据数组。当你把一个剪辑在剪贴板,这个数组可用于粘贴的应用程序,它可以检查它,看看他们是否可以处理任何可用的MIME类型。
一个ClipData.Item 对象包含文本,URI或意向数据:
- 文本
-
一个
CharSequence的 。
- URI
-
一个
开放的 。这通常包含的内容提供者的URI,尽管任何URI被允许的。提供数据的应用程序将URI剪贴板上。希望粘贴数据的应用程序从剪贴板中得到URI并用它来 ??访问内容提供商(或其他数据源)和检索数据。
- 意图
-
一个
意图 。此数据类型可以让你的应用程序快捷方式复制到剪贴板。然后,用户可以粘贴快捷方式到他们的应用程序供以后使用。
您可以添加多个ClipData.Item 到剪辑对象。这允许用户多重选择作为一个剪辑复制和粘贴。例如,如果你有一个列表小工具,允许用户同时选择多个项目,可以将所有的项目一次复制到剪贴板。要做到这一点,您可以创建一个单独的
ClipData.Item 每个列表项,然后你添加
ClipData.Item 对象的ClipData 对象。
ClipData方便的方法
该ClipData 类为创建静态便捷方法ClipData 与单个对象ClipData.Item
对象和一个简单的ClipDescription 对象:
-
newPlainText(标签,文本)
-
返回
ClipData 对象,其单
ClipData.Item 对象包含的文本字符串。该
ClipDescription 对象的标签设置标签 。在单MIME类型ClipDescription 是
MIMETYPE_TEXT_PLAIN 。
使用
newPlainText()
来创建一个文本字符串的剪辑。
-
newUri(解析器,标签,URI)
-
返回
ClipData 对象,其单
ClipData.Item 对象包含一个URI。该
ClipDescription 对象的标签设置标签 。如果URI是内容的URI(Uri.getScheme() 返回
内容: ),该方法使用的ContentResolver的 中提供的对象分解器 ,从内容提供商检索可用的MIME类型,并将它们存储在ClipDescription 。对于一个URI不是一个内容: URI,该方法将MIME类型
MIMETYPE_TEXT_URILIST 。
使用
newUri()
来从URI,特别是剪辑的内容: URI。
-
newIntent(标签,意图)
-
返回
ClipData 对象,其单
ClipData.Item 对象包含一个意图 。该ClipDescription 对象的标签设置标签 。MIME类型设置为MIMETYPE_TEXT_INTENT 。
使用
newIntent()
从一个Intent对象创建一个剪辑。
强迫剪贴板数据为文本
即使您的应用程序只能处理文字,您可以通过该方法将其转换从剪贴板复制非文本数据
ClipData.Item.coerceToText() 。
此方法转换数据ClipData.Item 文本和返回的CharSequence 。该值
ClipData.Item.coerceToText()
返回基于数据的形式ClipData.Item :
- 文本
-
如果
ClipData.Item 是文本(的getText() 不为null),
coerceToText() 返回文本。
- URI
-
如果
ClipData.Item 是一个URI(getUri() 不为null),
coerceToText() 试图使用它作为一个内容URI:
- 意图
-
如果
ClipData.Item 是一个Intent(getIntent() 不为null),
coerceToText() 将其转换为一个Intent URI并返回它。的表示是相同的,通过返回
Intent.toUri(URI_INTENT_SCHEME) 。
剪贴板框架总结于图1中要复制的数据,应用程序将一个
ClipData 对象上ClipboardManager 全局剪贴板。所述ClipData 包含一个或多个
ClipData.Item 对象,一个
ClipDescription 对象。要粘贴数据,应用程序获取
ClipData ,从获取它的MIME类型
ClipDescription ,并且无论是从获取数据ClipData.Item 或由供应商所提到的内容
ClipData.Item 。
图1. Android的剪贴板框架
复制到剪贴板
如前所述,将数据复制到你的句柄全球剪贴板
ClipboardManager 对象,创建一个ClipData
对象,添加ClipDescription 和一个或多个
ClipData.Item 对象给它,并添加完成
ClipData 反对ClipboardManager 对象。这在下面详细过程描述:
-
如果您使用的是内容URI复制数据,建立一个内容提供商。
该
笔记本示例应用程序是使用复制和粘贴内容提供商的一个例子。该
NotePadProvider类实现内容提供商。在
记事本类定义了供应商和其他应用程序,包括支持的MIME类型之间的契约。
-
获取系统剪贴板:
...
//如果用户选择复制 的情况下- [R 。ID 。menu_copy :
//获取一个句柄到剪贴板服务。 ClipboardManager 剪贴板= (ClipboardManager ) getSystemService (语境。CLIPBOARD_SERVICE );
-
将数据复制到一个新的ClipData 对象:
-
对于文本
//创建一个新的文本剪辑放在剪贴板 ClipData 夹= ClipData 。newPlainText (“纯文本” ,“你好,世界!” );
-
对于一个URI
该片段由编码记录ID到内容的URI提供商构建了一个URI。这种技术是覆盖在一节更详细编码的URI标识符:
//创建一个基于基本URI,并根据联系人的姓记录ID上的URI //声明基本URI字符串 私人 静态 最终 字符串联系= “内容://com.example.contacts” ;
//声明一个路径字符串您使用复制数据URI 私人 静态 最终 字符串COPY_PATH = “/复制” ;
//声明的URI粘贴到剪贴板 乌里copyUri = 开放的我们。解析(联系+ COPY_PATH + “/” + 的lastName );
.. 。
//创建一个新的URI剪辑对象。该系统采用匿名getContentResolver()对象 //从供应商获得的MIME类型。剪辑对象的标签是“URI”,其数据是 //开放的我们以前创建的。 ClipData 夹= ClipData 。newUri (getContentResolver (),“URI” ,copyUri );
-
对于意向
这段代码构建了一个应用程序的意图,然后把它在剪辑对象:
//创建意图 意图appIntent = 新 意图(此,COM 。例如,演示,所有MyApplication 。类);
...
//创建与它的意图剪辑对象。它的标签是“意图”,其数据是 //意图对象先前创建 ClipData 夹= ClipData 。newIntent (“意图” ,appIntent );
-
将新的剪辑对象剪贴板上:
//设置剪贴板的主剪辑。 剪贴板。setPrimaryClip (夹);
从剪贴板粘贴
如前所述,您可以通过获取全局剪贴板对象,得到了剪辑对象,看着它的数据从剪贴板粘贴数据,如果可能从剪辑对象中的数据复制到自己的存储。本节详细介绍了如何为三种形式剪贴板数据的做到这一点。
粘贴纯文本
要粘贴纯文本,首先获得全局剪贴板并验证它是否可以返回纯文本。然后得到的剪辑对象,并使用其文本复制到自己的存储
的getText() ,如以下过程中所述:
-
获取全球
ClipboardManager 使用对象
getSystemService(CLIPBOARD_SERVICE) 。同时声明一个全局变量包含所粘贴的文本:
ClipboardManager clipboard = ( ClipboardManager ) getSystemService ( Context . CLIPBOARD_SERVICE );
String pasteData = "" ;
-
接下来,确定是否要启用或禁用当前??活动的“粘贴”选项。您应该验证剪贴板中包含一个剪辑,并可以处理由剪辑表示的数据的类型:
//获取“粘贴”菜单项的ID 菜单项mPasteItem = 菜单。则findItem (? 。ID 。menu_paste );
//如果剪贴板中不包含数据,禁用粘贴菜单项。 //如果它不包含数据,决定是否可以处理
这将禁用粘贴菜单项,从剪贴板中有数据,但它不是纯文本 mPasteItem 。的setEnabled (??假); } 其他 {
//这使得粘贴菜单项,因为剪贴板中包含明文 mPasteItem 。的setEnabled (??真) ; } }
-
将数据从复制到剪贴板。如果“粘贴”菜单项启用这一点在方案只到达,这样你就可以假定剪贴板包含纯文本。你还不知道它是否包含一个文本字符串或指向纯文本的URI。下面的代码片段测试,但它只是显示了处理纯文本格式的代码:
//响应用户选择“粘贴” 的情况下- [R 。ID 。menu_paste :
//检查剪贴板上的项目。如果的getText()没有返回null,剪辑的项目包含 //文本。假定该应用程序只能同时处理一个项目。 ClipData 。项项= 剪贴板。getPrimaryClip ()。话getItemAt (0 );
//获取剪贴板为文本。 pasteData = 项目。的getText ();
//如果字符串包含数据,然后粘贴操作完成后 ,如果 (pasteData != 空) { 返回;
//剪贴板中不包含文本。如果它包含一个URI,试图从中获取数据 } 其他 { 乌里pasteUri = 项目。getUri ();
//如果URI包含的东西,尝试从它那里得到的文本 ,如果 (pasteUri != 空) {
//调用程序来解析URI,并从中获取数据。这个程序是不是 //这里提出。 pasteData = resolveUri (乌里); 回报; } 其他 {
//东西是错误的。MIME类型是纯文本,但剪贴板中不包含任何 //文本或一个URI。报告错误。 日志。? (“剪贴板中包含一个无效的数据类型” ); 回报; } }
从内容URI粘贴数据
如果ClipData.Item 对象包含内容的URI,你已经确定你可以处理它的MIME类型之一,创建一个
ContentResolver的 ,然后调用相应的内容提供商的方法来检索数据。
以下过程介绍如何从内容提供商基于在剪贴板上的内容URI获取数据。它检查应用程序可以使用MIME类型可以从供应商:
-
声明一个全局变量包含MIME类型:
//声明一个MIME类型常量来匹配由供应商提供的MIME类型 的公共 静态 最终 字符串MIME_TYPE_CONTACT = “vnd.android.cursor.item / vnd.example.contact”
-
获得全局剪贴板。还可以获得内容解析,以便您可以访问内容提供商:
//获取句柄到剪贴板经理 ClipboardManager 剪贴板= (ClipboardManager )getSystemService (语境。CLIPBOARD_SERVICE );
//获取内容解析器实例 ContentResolver的CR = getContentResolver ();
-
获取剪贴板中的主要片段,并获得其内容为URI:
//获取剪贴板中的剪贴板数据 ClipData 夹= 剪贴板。getPrimaryClip ();
如果 (夹!= 空) {
//获取数据从剪贴板中的第一项 ClipData 。项项= 夹。话getItemAt (0 );
//尝试获取项目的内容为URI 乌里pasteUri = 项目。getUri ();
-
测试以查看该URI是一个内容URI通过调用
的getType(URI) 。如果此方法返回null 乌里 没有指向一个有效的内容提供商:
//如果剪贴板中包含一个URI引用 如果 (pasteUri != 空) {
//这是一个内容URI? 字符串uriMimeType = CR 。的getType (pasteUri );
-
测试以查看的内容提供商支持的MIME类型,目前的应用可以理解的。如果是这样,调用
ContentResolver.query() 来获取数据。返回值是一个
游标 :
//如果返回值不为空,URI是一个开放的内容 ,如果 (uriMimeType != 空) {
//是否内容提供商提供一个MIME类型,目前的应用程序可以使用? 如果 (uriMimeType 。的equals (MIME_TYPE_CONTACT )) {
//从内容提供商获取的数据。 光标pasteCursor = CR 。查询(URI , 空, 空, 空, 空);
//如果游标包含数据,移动到第一条记录 ,如果 (pasteCursor != 空) { 如果 (pasteCursor 。moveToFirst ()) {
//从这里光标获取数据。代码将根据该变化 的数据模型的//格式。 } }
//关闭光标 pasteCursor 。关闭(); } } } }
粘贴一个Intent
要粘贴一个Intent,首先获得全局剪贴板。检查
ClipData.Item 对象以查看它是否包含一个意图。然后调用
getIntent() 的意图复制到自己的存储。下面的代码演示这一点:
//获取句柄到剪贴板经理 ClipboardManager 剪贴板= (ClipboardManager )getSystemService (语境。CLIPBOARD_SERVICE );
//检查是否剪辑项目包含一个Intent,通过测试,看是否getIntent()返回null 意向pasteIntent = 剪贴板。getPrimaryClip ()话getItemAt (0 )。getIntent ();
如果 (pasteIntent != 空) {
//处理这个意图
} 其他 {
//忽略剪贴板,或发出一个错误,如果你的应用程序所期待的意图是 //剪贴板上 }
使用内容提供商能够复制复杂数据
内容提供商支持复制,如数据库记录或文件流复杂的数据。要复制的数据,你把剪贴板内容URI。粘贴应用程序然后从剪贴板中得到这个URI,并用它来检索数据库中的数据或文件流描述符。
由于粘贴应用程序只有为你的数据内容的URI,它需要知道要检索的数据块。您可以通过在URI本身编码为数据的标识符提供该信息,或者您也可以提供一个独特的URI,将返回要复制的数据。哪种技术选择取决于数据的组织。
以下各节描述了如何设置的URI,如何提供复杂的数据,以及如何提供文件流。该描述假定您熟悉内容提供商设计的一般原则。
编码的URI的标识符
为将数据复制到一个URI剪贴板一个有用的方法是进行编码的标识符的URI本身的数据。然后内容提供商可以从URI中的标识符,并使用它来检索数据。粘贴应用程序不必知道该标识符的存在; 所有它做的是从剪贴板让你“参考”(URI中加上标识符),给它的内容提供商,并取回数据。
你通常通过它串联到URI的末尾标识符编码到URI的内容。例如,假设你定义你的供应商URI作为下面的字符串:
“内容://com.example.contacts”
如果你想要的名称编码到这个URI,你可以使用下面的代码片段:
字符串uriString中= “内容://com.example.contacts” + “/” + “史密斯”
// uriString中现在包含的内容://com.example.contacts/Smith。
//从字符串表示生成一个URI对象 的Uri copyUri = 开放的我们。解析(uriString中);
如果您已经使用内容提供商,您可能要添加,表示URI是复制一个新的URI路径。例如,假设你已经拥有以下URI路径:
"content://com.example.contacts" / people "content://com.example.contacts" / people / detail "content://com.example.contacts" / people / images
你可以添加另一个路径是特定于复制的URI:
“内容://com.example.contacts/copying”
然后,您可以通过模式匹配检测“复制”URI和代码,具体的复制和粘贴处理。
你通常如果你已经在使用一个内容提供商,内部数据库,或内部表来组织你的数据使用的编码技术。在这些情况下,您有多个作品,你要复制的数据,大概每件的唯一标识符。在回答粘贴申请查询时,您可以通过其标识符查找数据并将其返回。
如果没有多个数据,那么你可能不需要进行编码的标识符。你可以简单地使用URI所独有的提供商。在回应查询时,您的供应商将返回它目前包含的数据。
过得去ID一个记录在使用
笔记本的示例应用程序从笔记列表中打开一张纸条。该示例使用_id 字段从一个SQL数据库,但你可以有你想要的任何数字或字符的标识符。
复制数据结构
您设置复制和粘贴复杂的数据内容提供商作为的一个子类
ContentProvider的 组成部分。你也应该编码URI你把剪贴板,使其指向要提供确切的记录。另外,你必须考虑你的应用程序的现有状态:
-
如果你已经有了一个内容提供商,您可以添加到它的功能。您可能只需要修改其
查询()
方法来处理的URI从要粘贴数据的应用程序来。你可能会想修改来处理“复制”URI模式的方法。
-
如果你的应用程序维护一个内部数据库,您可能希望该数据库移动到内容提供商,以便从它拷贝。
-
如果你目前没有使用数据库,可以实现一个简单的内容提供商,其唯一目的是提供数据的应用程序,从剪贴板粘贴。
在内容提供商,你将要覆盖至少有以下方法:
-
查询()
-
粘贴的应用程序会认为他们可以通过使用此方法,你把剪贴板上的URI获取数据。为了支持复制,你应该有这种方法检测含有一种特殊的“复制”路径的URI。然后,应用程序可以创建一个“复制”URI放在剪贴板上,包含副本路径和一个指向要复制的准确记录。
-
的getType()
-
这个方法应该返回的MIME类型或类型为你打算复制数据。该方法
newUri() 调用
的getType() ,以将MIME类型到新ClipData 对象。
MIME类型复杂数据中的主题描述
内容提供商。
注意,不必有任何的其他内容提供者的方法,如
插入件() 或
更新() 。一个粘贴应用程序只需要得到您的支持的MIME类型,并从供应商复制数据。如果你已经有了这些方法,他们不会复制操作干扰。
下面的代码片段demonsrate如何设置你的应用程序来复制复杂的数据:
-
在您的应用程序的全局常量,声明基本URI字符串,标识您正在使用复制数据的URI字符串的路径。同时声明MIME类型为复制的数据:
//声明基本URI字符串 私人 静态 最终 字符串联系= “内容://com.example.contacts” ;
//声明为您用来复制数据URI路径字符串 私人 静态 最终 字符串COPY_PATH = “/复制” ;
//声明一个MIME类型复制的数据 公共 静态 最终 字符串MIME_TYPE_CONTACT = “vnd.android.cursor.item / vnd.example.contact”
-
在从用户拷贝数据的活动,设置代码将数据复制到剪贴板。在回答一个副本的请求,把URI剪贴板上:
公共 类 MyCopyActivity 扩展 活动 {
...
//用户已经选择了名称,并请求副本。 案例- [R ,ID 。menu_copy :
//追加姓氏基础URI //名称存储在“姓氏” uriString中= 联系+ COPY_PATH + “/” + 的lastName ;
//将字符串成一个URI 乌里copyUri = 开放的我们。解析(uriString中);
//获取句柄到剪贴板
将剪贴板中的主剪辑。 剪贴板。setPrimaryClip (夹);
-
在内容提供商在全球范围内,建立一个URI匹配,并添加一个URI模式将匹配你把剪贴板上的URI:
公共 类 MyCopyProvider 扩展 ContentProvider的 {
...
//一个开放的匹配对象,它简化了内容的URI匹配模式。 私人 静态 最终 UriMatcher sURIMatcher = 新 UriMatcher (UriMatcher 。NO_MATCH );
//一个整数,开关会根据输入的URI使用图案 私人 静态 最终 INT GET_SINGLE_CONTACT = 0 ;
...
//增加了对内容的URI的匹配。它匹配 //“的内容://com.example.contacts/copy/*” sUriMatcher 。addURI (联系, “名/ *” ,GET_SINGLE_CONTACT );
-
建立
查询()
方法。这种方法可以处理不同的URI模式,这取决于你如何编写代码,但只显示为剪贴板复制操作模式:
//设置你的供应商的查询()
根据输入的内容URI在Switch 开关 (sUriMatcher 。比赛(URI )) {
案件GET_SINGLE_CONTACT :
//查询并返回被请求的名字联系。在这里,您将解码 //传入的URI,查询基础上,姓氏的数据模型,并返回结果 //作为光标。
...
}
-
设立的getType() 方法返回一个适当的MIME类型复制的数据:
//设置您的提供商的getType() method. public String getType ( Uri uri ) {
...
switch ( sUriMatcher . match ( uri )) {
case GET_SINGLE_CONTACT :
return ( MIME_TYPE_CONTACT );
本节从内容粘贴数据URI
介绍了如何从剪贴板中获取内容URI,并使用它来 ??获取和粘贴数据。
复制数据流
您可以复制并粘贴大量的文本和二进制数据流。该数据可以具有形式如下列:
-
存储在实际设备上的文件。
-
从插座流。
-
大量存储在提供商的基础数据库系统中的数据。
数据流的内容提供商提供了一个文件描述符对象访问其数据,如AssetFileDescriptor 而不是
光标 对象。粘贴应用程序读取使用该文件描述符中的数据流。
要设置您的应用程序与供应商复制数据流,请按照下列步骤操作:
-
数据流你把剪贴板上设置了内容URI。这样做的选择包括以下内容:
-
编码数据流的识别符上的URI,如在部分中所述
编码对URI的标识符,然后保持在提供商包含标识符和相应的流名称的表。
-
直接在URI编码流的名称。
-
使用唯一的URI总是返回从提供当前流。如果你使用这个选项,你要记得更新你的供应商,指向不同的流时,你流复制到通过URI剪贴板。
-
提供一个MIME类型为您计划提供每种类型的数据流。粘贴应用程序需要这些信息来确定是否可以粘贴剪贴板上的数据。
-
实施中的一个
的ContentProvider 返回文件描述符要流的方法。如果你的内容URI标识编码,使用这种方法来确定要打开的流。
-
到数据流复制到剪贴板,建设内容URI并将其放在剪贴板上。
要粘贴数据流,一个应用程序获取的剪辑从剪贴板,获取URI,并使用它在一个呼叫ContentResolver的 打开的流文件描述方法。该ContentResolver的 方法调用相应的
ContentProvider的 方法,传递内容的URI。你的供应商返回的文件描述符ContentResolver的 方法。粘贴然后应用程序有责任从流中读取数据。
下面的列表显示了内容提供商最重要的文件描述符的方法。每一个都有一个相应ContentResolver的 方法与字符串“描述符”追加到方法名称; 例如,
ContentResolver的 模拟
openAssetFile() 是
openAssetFileDescriptor() :
-
openTypedAssetFile()
-
此方法应返回一个资产的文件描述符,但只有当提供MIME类型由提供者的支持。主叫方(应用程序做粘贴)提供了一个MIME类型模式。(已复制了URI到剪贴板的应用程序)的内容提供商返回
AssetFileDescriptor 文件句柄,如果它可以提供MIME类型,或者抛出,如果它不能例外。
此方法处理文件的小节。你可以用它来阅读内容提供商已经复制到剪贴板资产。
-
openAssetFile()
-
这种方法是一种更一般的形式
openTypedAssetFile() 。它不会过滤允许的MIME类型,但它可以读取文件的小节。
-
打开文件()
-
这是一个更一般的形式
openAssetFile() 。它不能读取文件的小节。
您可以选择使用
openPipeHelper()
方法与你的文件描述符的方法。这使得应用程序粘贴在使用管道后台线程读取数据流。要使用此方法,您需要实现
ContentProvider.PipeDataWriter 接口。这样的例子在给出笔记本示例应用程序,在openTypedAssetFile() 的方法
NotePadProvider.java 。
设计有效的复制/粘贴功能
要设计有效的复制和粘贴功能为您的应用程序,请记住以下几点:
-
在任何时候,只有一个在剪贴板剪辑。通过系统中的任何应用程序的新副本操作将覆盖以前的剪辑。由于用户可以导航到你的应用程序,距离返回前做一个副本,你不能假设剪贴板中包含了用户在先前复制剪辑您的
应用程序。
-
多的预期目的
ClipData.Item
每剪辑对象是支持多个选择的复制和粘贴,而不是不同的形式的参考单个选择。您通常希望所有的
ClipData.Item 短片中的对象具有相同的形式,即,他们都应该是简单的文本,内容URI或意向 ,但不是的混合物。
-
当您提供的数据,可以提供不同的MIME表示。添加您的支持MIME类型
ClipDescription ,然后实现在内容提供商的MIME类型。
-
当您从剪贴板中获取数据,您的应用程序负责检查可用的MIME类型,然后决定使用哪一个,如果有的话。即使是在剪贴板上的夹子和用户请求糊状,您的应用程序不需要进行粘贴。你应该做的,如果贴的MIME类型是兼容的。您可以选择强迫剪贴板上的数据使用文本
coerceToText() ,如果你选择。如果你的应用程序支持的可用MIME类型不止一个,你可以允许用户选择使用哪一个。
|