分享

复制和粘贴| Android开发者

 图书馆送餐人员 2016-03-01

快速浏览

  • 复制和粘贴数据的基于剪贴板的框架。
  • 支持简单和复杂的数据,包括文本串,复杂的数据结构,文本和二进制流数据和应用程序的资产。
  • 复制并直接膏简单的文本,并从剪贴板。
  • 复制并粘贴使用内容提供商的复杂数据。
  • 需要API 11。

在该文献

  1. 剪贴板框架
  2. 剪贴板类
    1. ClipboardManager
    2. ClipData,ClipDesc??ription和ClipData.Item
    3. ClipData方便的方法
    4. 强迫剪贴板数据为文本
  3. 复制到剪贴板
  4. 从剪贴板粘贴
    1. 粘贴纯文本
    2. 从内容URI粘贴数据
    3. 粘贴一个Intent
  5. 使用内容提供商能够复制复杂数据
    1. 编码的URI的标识符
    2. 复制数据结构
    3. 复制数据流
  6. 设计有效的复制/粘贴功能

重点班

  1. ClipboardManager
  2. ClipData
  3. ClipData.Item
  4. ClipDesc??ription
  5. 乌里
  6. 的ContentProvider
  7. 意图

相关样本

  1. 记事本示例应用程序

也可以看看

  1. 内容提供商

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类型ClipDescriptionMIMETYPE_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对象。这在下面详细过程描述:

  1. 如果您使用的是内容URI复制数据,建立一个内容提供商。

    笔记本示例应用程序是使用复制和粘贴内容提供商的一个例子。该 NotePadProvider类实现内容提供商。在 记事本类定义了供应商和其他应用程序,包括支持的MIME类型之间的契约。

  2. 获取系统剪贴板:

    ...

    //如果用户选择复制
    的情况下- [R 。ID 。menu_copy :

    //获取一个句柄到剪贴板服务。
    ClipboardManager 剪贴板= (ClipboardManager )
            getSystemService (语境。CLIPBOARD_SERVICE );
  3. 将数据复制到一个新的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 );
  4. 将新的剪辑对象剪贴板上:
    //设置剪贴板的主剪辑。
    剪贴板。setPrimaryClip (夹);

从剪贴板粘贴

如前所述,您可以通过获取全局剪贴板对象,得到了剪辑对象,看着它的数据从剪贴板粘贴数据,如果可能从剪辑对象中的数据复制到自己的存储。本节详细介绍了如何为三种形式剪贴板数据的做到这一点。

粘贴纯文本

要粘贴纯文本,首先获得全局剪贴板并验证它是否可以返回纯文本。然后得到的剪辑对象,并使用其文本复制到自己的存储 的getText() ,如以下过程中所述:

  1. 获取全球ClipboardManager使用对象 getSystemService(CLIPBOARD_SERVICE) 。同时声明一个全局变量包含所粘贴的文本:
    ClipboardManager clipboard =  ( ClipboardManager ) getSystemService ( Context . CLIPBOARD_SERVICE ); 

    String pasteData = "" ;
  2. 接下来,确定是否要启用或禁用当前??活动的“粘贴”选项。您应该验证剪贴板中包含一个剪辑,并可以处理由剪辑表示的数据的类型:
    //获取“粘贴”菜单项的ID 
    菜单项mPasteItem = 菜单。则findItem (? 。ID 。menu_paste );

    //如果剪贴板中不包含数据,禁用粘贴菜单项。
    //如果它不包含数据,决定是否可以处理




       

            这将禁用粘贴菜单项,从剪贴板中有数据,但它不是纯文本
            mPasteItem 。的setEnabled (??假);
        } 其他 {

            //这使得粘贴菜单项,因为剪贴板中包含明文
            mPasteItem 。的setEnabled (??真) ;
        }
    }
  3. 将数据从复制到剪贴板。如果“粘贴”菜单项启用这一点在方案只到达,这样你就可以假定剪贴板包含纯文本。你还不知道它是否包含一个文本字符串或指向纯文本的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类型可以从供应商:

  1. 声明一个全局变量包含MIME类型:
    //声明一个MIME类型常量来匹配由供应商提供的MIME类型
    的公共 静态 最终 字符串MIME_TYPE_CONTACT = “vnd.android.cursor.item / vnd.example.contact”
  2. 获得全局剪贴板。还可以获得内容解析,以便您可以访问内容提供商:
    //获取句柄到剪贴板经理
    ClipboardManager 剪贴板= (ClipboardManager )getSystemService (语境。CLIPBOARD_SERVICE );

    //获取内容解析器实例
    ContentResolver的CR = getContentResolver ();
  3. 获取剪贴板中的主要片段,并获得其内容为URI:
    //获取剪贴板中的剪贴板数据
    ClipData 夹= 剪贴板。getPrimaryClip ();

    如果 (夹!= 空) {

        //获取数据从剪贴板中的第一项
        ClipData 。项项= 夹。话getItemAt (0 );

        //尝试获取项目的内容为URI
        乌里pasteUri = 项目。getUri ();
  4. 测试以查看该URI是一个内容URI通过调用 的getType(URI) 。如果此方法返回null 乌里没有指向一个有效的内容提供商:
        //如果剪贴板中包含一个URI引用
        如果 (pasteUri != 空) {

            //这是一个内容URI?
            字符串uriMimeType = CR 。的getType (pasteUri );
  5. 测试以查看的内容提供商支持的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如何设置你的应用程序来复制复杂的数据:

  1. 在您的应用程序的全局常量,声明基本URI字符串,标识您正在使用复制数据的URI字符串的路径。同时声明MIME类型为复制的数据:

    //声明基本URI字符串
    私人 静态 最终 字符串联系= “内容://com.example.contacts” ;

    //声明为您用来复制数据URI路径字符串
    私人 静态 最终 字符串COPY_PATH = “/复制” ;

    //声明一个MIME类型复制的数据
    公共 静态 最终 字符串MIME_TYPE_CONTACT = “vnd.android.cursor.item / vnd.example.contact”
  2. 在从用户拷贝数据的活动,设置代码将数据复制到剪贴板。在回答一个副本的请求,把URI剪贴板上:
    公共 类 MyCopyActivity  扩展 活动 { 

        ...

    //用户已经选择了名称,并请求副本。
    案例- [R ,ID 。menu_copy :

        //追加姓氏基础URI
        //名称存储在“姓氏”
        uriString中= 联系+ COPY_PATH + “/” + 的lastName ;

        //将字符串成一个URI
        乌里copyUri = 开放的我们。解析(uriString中);

        //获取句柄到剪贴板
       


       

        将剪贴板中的主剪辑。
        剪贴板。setPrimaryClip (夹);
  3. 在内容提供商在全球范围内,建立一个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 );
  4. 建立 查询() 方法。这种方法可以处理不同的URI模式,这取决于你如何编写代码,但只显示为剪贴板复制操作模式:

    //设置你的供应商的查询()

       

       

        根据输入的内容URI在Switch
        开关 (sUriMatcher 。比赛(URI )) {

        案件GET_SINGLE_CONTACT :

            //查询并返回被请求的名字联系。在这里,您将解码
            //传入的URI,查询基础上,姓氏的数据模型,并返回结果
            //作为光标。

        ...

    }
  5. 设立的getType()方法返回一个适当的MIME类型复制的数据:

    //设置您的提供商的getType() method. 
    public String getType ( Uri uri ) {

        ...

        switch ( sUriMatcher . match ( uri )) {

        case GET_SINGLE_CONTACT :

                return ( MIME_TYPE_CONTACT );

本节从内容粘贴数据URI 介绍了如何从剪贴板中获取内容URI,并使用它来 ??获取和粘贴数据。

复制数据流

您可以复制并粘贴大量的文本和二进制数据流。该数据可以具有形式如下列:

  • 存储在实际设备上的文件。
  • 从插座流。
  • 大量存储在提供商的基础数据库系统中的数据。

数据流的内容提供商提供了一个文件描述符对象访问其数据,如AssetFileDescriptor而不是 光标对象。粘贴应用程序读取使用该文件描述符中的数据流。

要设置您的应用程序与供应商复制数据流,请按照下列步骤操作:

  1. 数据流你把剪贴板上设置了内容URI。这样做的选择包括以下内容:
    • 编码数据流的识别符上的URI,如在部分中所述 编码对URI的标识符,然后保持在提供商包含标识符和相应的流名称的表。
    • 直接在URI编码流的名称。
    • 使用唯一的URI总是返回从提供当前流。如果你使用这个选项,你要记得更新你的供应商,指向不同的流时,你流复制到通过URI剪贴板。
  2. 提供一个MIME类型为您计划提供每种类型的数据流。粘贴应用程序需要这些信息来确定是否可以粘贴剪贴板上的数据。
  3. 实施中的一个的ContentProvider返回文件描述符要流的方法。如果你的内容URI标识编码,使用这种方法来确定要打开的流。
  4. 到数据流复制到剪贴板,建设内容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类型不止一个,你可以允许用户选择使用哪一个。         

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多