如何在粘贴到Android剪贴板时确定使用了哪个应用?

时间:2015-06-24 11:58:00

标签: java android android-layout android-activity clipboard

我已经制作了下面的android代码来获取粘贴到Android剪贴板的代码。虽然它有效,但我想确定在将这些数据粘贴到剪贴板时使用了哪个Android应用程序。

我该如何做到这一点?

Android代码:

@SuppressLint("NewApi")
public String readFromClipboard(Context context) {
    int sdk = android.os.Build.VERSION.SDK_INT;
    if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
        android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context
                .getSystemService(context.CLIPBOARD_SERVICE);
        return clipboard.getText().toString();
    } else {
        ClipboardManager clipboard = (ClipboardManager) context
                .getSystemService(Context.CLIPBOARD_SERVICE);

        // Gets a content resolver instance
        ContentResolver cr = context.getContentResolver();

        // Gets the clipboard data from the clipboard
        ClipData clip = clipboard.getPrimaryClip();
        if (clip != null) {

            String text = null;
            String title = null;

            // Gets the first item from the clipboard data
            ClipData.Item item = clip.getItemAt(0);

            // Tries to get the item's contents as a URI pointing to a note
            Uri uri = item.getUri();

            // If the contents of the clipboard wasn't a reference to a
            // note, then
            // this converts whatever it is to text.
            if (text == null) {
                text = coerceToText(context, item).toString();
            }

            return text;
        }
    }
    return "";
}

@SuppressLint("NewApi")
public CharSequence coerceToText(Context context, ClipData.Item item) {
    // If this Item has an explicit textual value, simply return that.
    CharSequence text = item.getText();
    if (text != null) {
        return text;
    }

    // If this Item has a URI value, try using that.
    Uri uri = item.getUri();
    if (uri != null) {

        // First see if the URI can be opened as a plain text stream
        // (of any sub-type). If so, this is the best textual
        // representation for it.
        FileInputStream stream = null;
        try {
            // Ask for a stream of the desired type.
            AssetFileDescriptor descr = context.getContentResolver()
                    .openTypedAssetFileDescriptor(uri, "text/*", null);
            stream = descr.createInputStream();
            InputStreamReader reader = new InputStreamReader(stream,
                    "UTF-8");

            // Got it... copy the stream into a local string and return it.
            StringBuilder builder = new StringBuilder(128);
            char[] buffer = new char[8192];
            int len;
            while ((len = reader.read(buffer)) > 0) {
                builder.append(buffer, 0, len);
            }
            return builder.toString();

        } catch (FileNotFoundException e) {
            // Unable to open content URI as text... not really an
            // error, just something to ignore.

        } catch (IOException e) {
            // Something bad has happened.
            Log.w("ClippedData", "Failure loading text", e);
            return e.toString();

        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                }
            }
        }

        // If we couldn't open the URI as a stream, then the URI itself
        // probably serves fairly well as a textual representation.
        return uri.toString();
    }

要明确的是,我不想在首次粘贴此数据时运行服务,而是希望确定事后粘贴的来源。

0 个答案:

没有答案