Android中数据的复制和粘贴的实现粗解

来源:互联网 发布:seo赚钱培训 编辑:程序博客网 时间:2024/06/07 13:18

通过标题你就可以猜到,本篇博客并不会介绍Android中数据复制和粘贴的源码实现流程、逻辑架构等,我只是根据google提供的文档稍微整理一下,平常基本上是用不到的,有什么不对的地方,劳烦各位大声指出!!
文本的复制和粘贴将由ClipboardManager进行管理(默认的InputView是支持粘贴复制的),它提供多种数据类型的拷贝和粘贴,包括文本、复杂的数据结构、二进制数据流等;其中剪贴板是有系统持有的,剪贴板在同一时刻只能持有一个ClipData,当然一个ClipData里面可以包含过个ClipData.Item,其实真实的数据由ClipData.Item持有的;在使用Intent作为ClipData的数据体时,被粘贴的应用将由于这个Intent指向的应用的快捷键!!!(没有试过)

在Android系统中专门有一个系统服务负责数据的复制和粘贴的,他就是ClipBoardManager,当然了,这个Manager只是对内部的Service进行封装之后暴露给开发者的接口。获取ClipBoardManager的实例对象很简单,Android系统中几乎所有的Manager实例都是通过这种方法获取的:

ClipboardManager clipboard = (ClipboardManager)        getSystemService(Context.CLIPBOARD_SERVICE);

一个ClipData包含一个ClipDescription和至少一个ClipData.Item对象。ClipDescription包含带粘贴的元数据和一个关于有效MIME的数组,ClipData.Item.coerceToText()使用此方法可以强行将剪贴板上的数据转换成一个CharSequence对象,其中Intennt会被转换成一个Intent的URI对象,然后通过使用URI转换成字符串。

复制文本:

ClipboardManager clipboard = (ClipboardManager)        getSystemService(Context.CLIPBOARD_SERVICE);ClipData clip = ClipData.newPlainText("simple text","Hello, World!");clipboard .setPrimaryClip(clip);

粘贴文本:

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);if(clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN))){    ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);    pasteData = item.getText();//获取纯文本数据    //Uri pasteUri = item.getUri();//获取URI,然后从根据Uri获取数据}

复制URI:

    private static final String CONTACTS = "content://com.example.contacts";    private static final String COPY_PATH = "/copy";    ...    ClipboardManager clipboard = (ClipboardManager)            getSystemService(Context.CLIPBOARD_SERVICE);        Uri copyUri = Uri.parse(CONTACTS + COPY_PATH + "/" + lastName);        ClipData clip = ClipData.newUri(getContentResolver(),"URI",copyUri);    clipboard .setPrimaryClip(clip);

粘贴URI:

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);if(clipboard.hasPrimaryClip()){    ClipData clip = clipboard.getPrimaryClip();        if (clip != null) {            ClipData.Item item = clip.getItemAt(0);            Uri pasteUri = item.getUri();            if (pasteUri != null) {                String uriMimeType = cr.getType(pasteUri);                if (uriMimeType != null) {                    if (uriMimeType.equals(MIME_TYPE_CONTACT)) {                        Cursor pasteCursor = cr.query(uri, null, null, null, null);                        if (pasteCursor != null) {                                if (pasteCursor.moveToFirst()) {                                //对获取的数据进行处理,显示或者保存等                                }                        }                    }                    pasteCursor.close();                }            }        }}

复制Intent:

    ClipboardManager clipboard = (ClipboardManager)        getSystemService(Context.CLIPBOARD_SERVICE);    Intent appIntent = new Intent(this, com.example.demo.myapplication.class);    ClipData clip = ClipData.newIntent("Intent",appIntent);    clipboard .setPrimaryClip(clip);

粘贴Intent:

    //这个粘贴与纯文本粘贴类似:    ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);    Intent pasteIntent = clipboard.getPrimaryClip().getItemAt(0).getIntent();    if (pasteIntent != null) {        //处理获取到的Intent    }

通过使用ContentProvider粘贴复制复杂数据:

   需要添加一个用于copy的URI,并将这个URI添加至COntentProvider的getType方法,在ClipData调用newUri方法时会调用getType方法,并将返回的一个String用于表示这个URI表示的MIME。
    //以下是源码:    static public ClipData newUri(ContentResolver resolver, CharSequence label,            Uri uri) {        Item item = new Item(uri);        String[] mimeTypes = null;        if ("content".equals(uri.getScheme())) {            String realType = resolver.getType(uri);            mimeTypes = resolver.getStreamTypes(uri, "*/*");            if (realType != null) {                if (mimeTypes == null) {                    mimeTypes = new String[] { realType };                } else {                    String[] tmp = new String[mimeTypes.length + 1];                    tmp[0] = realType;                    System.arraycopy(mimeTypes, 0, tmp, 1, mimeTypes.length);                    mimeTypes = tmp;                }            }        }        if (mimeTypes == null) {            mimeTypes = MIMETYPES_TEXT_URILIST;        }        return new ClipData(label, mimeTypes, item);    }

使用ClipboardManager 的注意事项:

1、ClipBorad这同一时刻只能保存一个ClipData,只保存最新的ClipData。2、不要复制多种类型数据的混合体3、在使用ContentProvider最好另外定义一个Uri用以表示copy数据的Uri。4、当MIME检测都不匹配时,可以将内容强制转换成纯文本的内容。

好了,关于Android系统的ClipboardManager就介绍到这里,有兴趣的朋友可以以关注我,遇到问题大家一起讨论一下!!
这是我的微信公众号,如果可以的话,希望您可以帮忙关注一下,这将是对我最大的鼓励了,谢谢!!
这里写图片描述

原创粉丝点击