使用 getPrimaryClip() 复制数据给出 { text/plain {NULL} }

mjo*_*osh 4 android clipboardmanager

我在{ text/plain {NULL} }使用时得到了,ClipData但如果我使用不推荐使用的方法,mClipboard.getText()它就可以正常工作。

if (mClipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
    ClipData clipData = mClipboard.getPrimaryClip();
    ClipData.Item item = clipData.getItemAt(0);
    Log.d(TAG, clipData.toString());
    Log.d(TAG, mClipboard.getText());
}
Run Code Online (Sandbox Code Playgroud)

更新

三星 Galaxy Tab 3 中存在问题。

三星 Galaxy Tab 3

Pro*_*ver 5

您的问题原因未知。因为它适用于我测试过的设备(S6 5.0)。您可能想查看已弃用getText()方法的实现:

public CharSequence getText() {
    ClipData clip = getPrimaryClip();
    if (clip != null && clip.getItemCount() > 0) {
        return clip.getItemAt(0).coerceToText(mContext);
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

为了获取文本它使用方法 coerceToText() 。根据该方法的描述:

     * Turn this item into text, regardless of the type of data it
     * actually contains.
Run Code Online (Sandbox Code Playgroud)

因此,我认为弃用方法 getText() 是由于性能问题或其他原因。

反正。由于方法getText()使用未弃用的 API,作为一种变通方法,coerceToText()如果调用推荐的 API 返回 null ,您可以使用此方法的部分源代码(特别是 method ):

ClipboardManager mclipboard =(ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
boolean isTextPlain = mclipboard.getPrimaryClip().getDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN);
    CharSequence text = null;
if (isTextPlain){
    ClipData clipData = mclipboard.getPrimaryClip();
    ClipData.Item item = clipData.getItemAt(0);
    if (  item!= null ){
        text = item.getText();
        if (text == null){
            // taken from source of clipData.getText() method
            text =  item.coerceToText(this);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)