11

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

@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 item = clipboard.getPrimaryClip().getItemAt(0);

错误:java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String java.lang.CharSequence.toString()' on a null object reference

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

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

4

1 回答 1

8

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

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

Android 开发者文档展示了一个简短的示例,有点像这样:

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
        }
    }
}
于 2016-08-16T02:42:05.867 回答