Java getPrimaryClip()返回ClipData{text/plain{NULL}

Java getPrimaryClip()返回ClipData{text/plain{NULL},java,android,clipboardmanager,Java,Android,Clipboardmanager,请帮我解决这个问题。 这是我的密码 @Override public int onStartCommand(Intent intent, int flags, int startId) { clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE); clipboard.addPrimaryClipChangedListener(this); return ST

请帮我解决这个问题。 这是我的密码

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);

        clipboard.addPrimaryClipChangedListener(this);


        return START_STICKY;
    }

    @Override
    public void onPrimaryClipChanged() {

        Log.d("log",clipboard.getPrimaryClip()+"");

        ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);

        String clipText = item.getText().toString();

        Log.d("log",clipText);

        new SendClipBoardData().execute(postClipDataUrl,clipText);
    }
有时我在
ClipData.Item=clipboard.getPrimaryClip().getItemAt(0)处出错

错误:
java.lang.NullPointerException:尝试对空对象引用调用接口方法“java.lang.String java.lang.CharSequence.toString()”

clipboard.getPrimaryClip()
返回
ClipData{text/plain{NULL}
, 但是当我把同样的复制文本粘贴到我的便笺中时,我可以看到文本,我无法检测到问题,有时它起作用,有时不起作用

还有一个问题,当复制工作正常时,我会得到两到三次复制的文本结果,但我的事件只工作了一次,它可以是什么?
提前感谢。

首先,不能保证剪贴板上确实有任何数据-例如,当你第一次打开手机时,你希望剪贴板是空的。第二,如果有数据,你需要检查它的格式是否正确。尝试将图像粘贴到文本框中是没有意义的

如果没有内容,则
clipboard.getPrimaryClip()
将返回null。如果有内容,但不是文本(例如,URL的处理方式与文本不同),则
item.getText()
将返回null。这会导致代码中出现异常,因为您正在对空引用调用
toString()

下面是一个简短的示例,有点像这样:

if (clipboard.hasPrimaryClip()
    && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN))
{
    // Put your paste code here
}
但正如我所提到的,某些东西,比如URL,将不符合这种模式,即使它们可以安全地转换为文本。要处理所有这些问题,您可以尝试以下方法:

if (clipboard.hasPrimaryClip())
{
    ClipData data = clipboard.getPrimaryClip();
    if (data.getItemCount() > 0)
    {
        CharSequence text = data.getItemAt(0).coerceToText(this);
        if (text != null)
        {
            // Put your paste-handling code here
        }
    }
}

@Saket Mittal感谢您的编辑您是否得到了解决方案,我突然遇到了同样的问题,即为什么
getItemAt(0)
而不是
getItemAt(clipData.getItemCount()-1)
以及这些项目在这里意味着什么?尽管大多数Android应用程序都不支持它,Android被设计成允许同时复制粘贴多个东西。例如,如果您有一个联系人列表,并且希望复制三个联系人,您可能会将每个联系人的内容放在一个单独的
ClipData.Item
中。如果您只打算支持单个项目,并且ClipData中有多个项目,那么最直观的方法是使用列表中的第一个项目。有关详细信息,请参阅中的章节。@Andrew,我知道。编辑器
MonoSpace
执行此操作。但这很奇怪。如果我清空剪贴板
ClipData.newPlainText(“,s”);剪贴板.setPrimaryClip(clip)我的应用程序本身仅在逻辑上为空。在外部,可以在
MonoSpace
中看到原始复制的字符串。