С Android AccessibilityService можно вставить в другое поле EditText приложения, но с браузером testfields (браузер по умолчанию для эмулятора или браузер по умолчанию для Samsung) он не работает, выдавая ошибку:
Невозможно выполнить это действие на незапечатанном экземпляре.
В браузере Android Chrome с некоторым текстовым полем Singnup он работает, но не для всех текстовых полей.
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source != null && ( event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED ) ) {
// || event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED ) &&
//event.getClassName().equals("android.widget.EditText")
//) {
ctx = getApplicationContext();
ClipboardManager clipboard = (ClipboardManager) ctx.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", "XYZ");
clipboard.setPrimaryClip(clip);
source.performAction(AccessibilityNodeInfo.ACTION_PASTE);
//Not Working, always return false.
//Tried with other options
Bundle argumentsTest = new Bundle();
argumentsTest.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "Bundle Test Data");
source.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT,argumentsTest )
// Not Working, throw java.lang.IllegalStateException exception
//Message: "Cannot perform this action on a not sealed instance"
}
}
Ответ 1 · рейтинг 7 · ChrisCM
Я не верю, что ты пытаешься делать то, что, как тебе кажется, ты пытаешься сделать.
Когда вы устанавливаете "текст" для accessibilityNodeInfo, вы изменяете свойство text этого объекта, поскольку оно относится к вашей службе специальных возможностей. ЭТО НЕ ОЗНАЧАЕТ, что вы изменяете текст поля EditText, на который ссылается объект accessibilityNodeInfo. К тому времени, когда ваша служба специальных возможностей получит этот объект, эти два объекта будут совершенно отделены друг от друга. Даже если ваш код запустится успешно, вы не получите ожидаемых результатов. Теперь, что касается того, почему вы не можете выполнить это действие, зная это, это должно быть очевидно. Для службы специальных возможностей не имеет смысла изменять имеющиеся у нее узлы. Таким образом, они становятся запечатанными (подумайте об этом как о принудительном выполнении константы). Узлы доступности становятся запечатанными и разгерметизированными в различные моменты их жизни. Части платформы, которые имеют доступ к информации о незапечатанных узлах, - это классы View и частные API. Любые задачи, связанные со службой специальных возможностей, будут иметь дело с запечатанными экземплярами, доступными только для чтения.
Что касается того, почему ваше оригинальное решение не работает, я считаю, что у нас недостаточно информации. Подход "ACTION_PASTE" является (приблизительно) правильным подходом, ОДНАКО при этом возникает множество проблем с веб-браузерами. Версия браузера, версия Android, версия устройства, веб-сайт и т. д. - все это играет роль. Особенно, если ваша установка достаточно старая, чтобы не использовать новый WebView (чистый веб-просмотр хрома, а не старый подход 4.+ с нечетными встроенными мобильными WebView, основанными на устаревших версиях WebKit, которые теперь никогда не будут обновляться). Я рекомендую протестировать ваш код на новейшем устройстве Nexus, используя как минимум Android 5.0, и посмотреть, работает ли ваш код. Если вы не можете этого сделать, сообщите информацию о версии для вашей установки. Если уже есть, то на каком сайте?