3

Я пытаюсь реализовать функции автоматического входа в сторонние приложения.Устройства Samsung и службы доступности (ACTION_PASTE, буфер обмена)

Я пытаюсь скопировать и вставить имя пользователя/пароль на странице входа. Для этого я пользуюсь услугами доступности Android.

Я могу вставлять текст на разные устройства. Но на устройствах Samsung имя пользователя/пароль вставляется в неправильные входные поля.

В журнале показано, что имя пользователя/пароль копируется, как ожидалось. Но при вставке он вставляет неправильный текст.

Это то, что я делаю:

private ClipboardManager mClipboardManager; 
mClipboardManager = (ClipboardManager) getApplication().getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); 

ClipData clip = ClipData.newPlainText("", textToPaste); 
mClipboardManager.setPrimaryClip(clip); 
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE); 
clip = ClipData.newPlainText("", ""); 
mClipboardManager.setPrimaryClip(clip); 

clip = ClipData.newPlainText("", textToPaste2); 
mClipboardManager.setPrimaryClip(clip); 
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE); 
clip = ClipData.newPlainText("", ""); 
mClipboardManager.setPrimaryClip(clip); 

Не могли бы вы помочь мне найти решение? Как вставить правильный текст?

ответ

1

У меня также был этот вопрос, и я заметил, что это открытый вопрос here, и он не был должным образом рассмотрен. Проблема, похоже, связана с состоянием гонки с собственным буфером обмена Samsung и тем, как они реализовали доступность для работы с ним. У меня есть функциональная, но не очень симпатичная работа решения:

if (Build.MANUFACTURER.toString().equals("samsung")) { 
    Handler handler = new Handler(); 
    final Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      getCurrentNode().performAction(AccessibilityNodeInfo.ACTION_PASTE); 
     } 
    }; 
    handler.postDelayed(runnable, 100); 
} else { 
    getCurrentNode().performAction(AccessibilityNodeInfo.ACTION_PASTE); 
} 

Поэтому в основном мы буду ждать немного (100мс, YMMV) для буфера обмена оседать, прежде чем делать нашу пасту. Я признаю, что это не идеально, но это будет работать для API 18+.

Другим вариантом для API 21+ является использование AccessibilityNodeInfo.ACTION_SET_TEXT в отличие от вставки (только для текста) и вставки правильного фрагмента текста таким образом. Вот пример того, как это работает:

Bundle arguments = new Bundle(); 
arguments.putString(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "node text plus pasted text"); 
getCurrentNode().performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments); 

Примечание: выше, не управлять курсором и поэтому всегда будет поместить его в конце текстового поля. Вы можете управлять курсором с помощью AccessibilityNodeInfo.ACTION_SET_CURSOR и пучка (аналогично вышеописанному для установки текста)

 Смежные вопросы

  • Нет связанных вопросов^_^