Android的文本和输入---复制和粘贴
复制流化的数据
你可以复制和粘贴被流化的大文本和二进制数据。这种数据可以是以下形式:
1. 保存在实际设备上的的文件;
2. 来自套接字中的数据流;
3. 保存在底层数据库系统中的大数据。
针对数据流的内容提供器使用一个文件描述对象(如AssetFileDescriptor,而不是Cursor对象)来提供对数据的访问。粘贴数据的应用程序会使用这个文件描述对象来读取数据流。
按照以下步骤创建使用提供其来复制数据流的应用程序:
1. 创建一个准备放入剪贴板上的数据流所对应的内容URI。包括以下可选的内容:
A.给数据流编制一个要放到URI上的标识,然后在包含该标识和对应数据流名称的提供器中维护一个表;
B.直接把数据流的名称编写到该URI上;
C.使用能够始终从该提供器中返回当前数据流的唯一URI。如果你选择这种方法,你必须要记住,无论何时,通过URI把数据流复制到剪贴板时,都要更新你的提供器,以便指向不同的数据流。
2. 给你计划提供的每种数据流都提供一个MIME类型。粘贴数据的应用程序需要这个信息来判断它们是否可以粘贴剪贴板上的数据。
3. 实现ContentProvider类中的一个方法,让它返回对应数据流的文件描述对象。如果你把标识编写到了内容的URI上,就可以使用这个方法来判断对应的数据流是否打开。
4. 要把数据流复制到剪贴板上,就要构造该内容的URI并把它放到剪贴板上。
要粘贴一个数据流,应用程序就要从剪贴板上获取剪贴对象和其中的URI,并在调用ContentResolver对象的打开数据流的文件描述对象的方法中使用它。ContentResolver方易做图调用对应的ContentProvider方法,并把内容的URI传递给它。你提供器会把这个文件描述对象返回给ContentResolver的方法。然后粘贴数据的应用程序就有能力从数据流中读取该数据了。
下面介绍了对内容提供器来说最为重要的几个文件描述对象方法。其中的每一个方法在ContentResolver对象都有对应的附加了Descriptor字符串的方法名称,例如:ContentReslolver中对应openAssetFile()方法的是openAssetFileDescriptor()方法。
openTypeAssetFile()
如果内容提供器支持所提供的MIME类型,那么这个方易做图返回一个资源文件的描述对象。调用者应用提供一个MIME类型模式。如果内容提供器可以提供这个MIME类型, 那么它就会返回一个AssetFileDescriptor文件句柄,否则它会抛出一个异常。
这个方法能够处理文件的内容,你可以使用它来读取内容提供器已经复制到剪贴板中资源。
openAssetFile()
这个方法是比openTypeAssetFile()方法更一般化的形式。它不针对MIME类型来进行过滤,但可以读取文件的内容。
openFile()
这个方法比openAssetFile()方法还要一般化。它不能够文件的内容。
你可以选择使用代用文件描述符方法的openPipeHelper()方法,它允许粘贴数据的应用程序在后台线程中使用管道来读取流式数据。要使用这个方法,你需要实现ContentProvider.PipeDataWriter接口。在Note Pad示例中就是这么做的,详细请看NotePadProvider.java的openTypeAssetFile()方法。
设计有效的复制/粘贴功能
要给你的应用程序设计有效的复制/粘贴功能,就要记住以下几点:
1. 任何时候,在剪贴板上都只有一个剪贴对象。系统中,任何一个新的应用程序的复制操作都会覆写之前的剪贴对象。因为用户在做了复制操作之后离开你的应用程序,因此你不能假设剪贴板中所包含的剪贴对象就是之前在你的应用程序中复制的那个对象。
2. 每个剪切对象中的多个ClipData.Item对象的用途是支持对多个被选择的对象的复制和粘贴,而不是对同一个选择对象应用的不同形式。通常,剪贴对象中的所有的ClipData.Item对象都要要有相同的格式,也就是说,它们应用都是简单的文本、内容URI或Intent对象,而不是混合的。
3. 在你提供数据时,你能够提供不同的MIME说明。把MIME类型添加到ClipDescription对象中,然后在你的内容提供器中实现该MIME类型。
4. 当你从剪贴板中获取数据时,你的应用程序要负责检查MIME类型是否可用,如果可用,然后再决定使用那种类型,否则即使在剪贴板上有剪贴对象,并且用户请求粘贴操作,那么你的应用程序也不会执行粘贴操作。如果MIME类型是兼容,你才应该执行粘贴操作。你可以选择使用coerceToText()方法,把剪贴板上的数据强制转换成文本。如果你的应用程序支持多种可用的MIME类型,那么你可以允许用户来选择使用那种类型。
分享到: 上一篇:Android的文本和输入---复制和粘贴(五)
补充:移动开发 , Android ,