Копирование данных с использованием getPrimaryClip(), давая { text/plain {NULL} }
Я получаю { 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());
}
Обновить
Проблема существует в Samsung Galaxy Tab 3.
1 ответ
Причина вашей проблемы неизвестна. поскольку он работает на устройстве, которое я тестировал (S6 5.0). Вы можете посмотреть на реализацию устарела getText()
метод:
public CharSequence getText() {
ClipData clip = getPrimaryClip();
if (clip != null && clip.getItemCount() > 0) {
return clip.getItemAt(0).coerceToText(mContext);
}
return null;
}
Для получения текста используется метод coerceToText() . в соответствии с описанием этого метода:
* Turn this item into text, regardless of the type of data it
* actually contains.
Поэтому я предполагаю, что устаревание метода getText() связано с проблемой производительности или с чем-то еще.
Тем не мение. С методом getText()
использует API, который не является устаревшим, в качестве обходного пути вы можете использовать некоторую часть источника этого метода (в частности, метод coerceToText()
) если вызов рекомендуемого API возвращает ноль:
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);
}
}
}