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
中看到原始复制的字符串。