【问题标题】:getPrimaryClip() returns ClipData { text/plain {NULL} }getPrimaryClip() 返回 ClipData { text/plain {NULL} }
【发布时间】:2015-07-24 12:07:13
【问题描述】:

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

@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} }, 但是当我将相同的复制文本粘贴到我的笔记中时,我可以看到文本,我无法检测到问题,有时它工作有时不。

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

【问题讨论】:

标签: java android clipboardmanager


【解决方案1】:

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

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

Android developer docs 显示一个简短的示例,有点像这样:

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
        }
    }
}

【讨论】:

  • 为什么是 getItemAt(0) 而不是 getItemAt(clipData.getItemCount()-1) 以及这里的意思是什么?
  • 虽然大多数安卓应用程序不支持它,但安卓被设计成允许一次复制粘贴多个东西。例如。如果您有一个联系人列表,并且想要复制三个联系人,您可能会将每个联系人的内容放在单独的ClipData.Item 中。如果只打算支持单个项目,而 ClipData 中有多个项目,最直观的做法是取列表中的第一项。有关详细信息,请参阅Android developer docs 中的部分。
  • @Andrew,我知道。编辑MonoSpace 做到了。但这很奇怪。如果我清空剪贴板ClipData.newPlainText("", s); clipboard.setPrimaryClip(clip);,我的应用程序只会在逻辑上为自己清空。在MonoSpace 外面可以看到原始复制的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2016-01-23
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多