Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
#1

Вставить слово в поле ввода другого приложения. Возможно ли такое? - Android

21.06.2016, 21:38. Просмотров 369. Ответов 5
Метки нет (Все метки)

Добрый день!

Задача следующая.
Находясь в какой-либо программе X (курсор в поле EditText), пользователь вызывает мою программу Y, в ней кликает на слово.
Мое приложение Y закрывается (сворачивается) и вставляет это слово в поле ввода в программу X.

Может кто подскажет как можно организовать вставку слова.
Накрайняк подойдет какое-либо решение с использованием буфера обмена, таймера и т.д.

Добавлено через 38 минут
Увы, пока не нашел решение.

Задача думаю сводится к переключению на предыдущее Activity X (которое находится в другом приложении) из стека Activity в OS.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2016, 21:38     Вставить слово в поле ввода другого приложения. Возможно ли такое?
Посмотрите здесь:

Запуск приложения из другого приложения Android
Android Ошибка при вызове приложения из другого приложения
Открыть приложение из другого приложения Android
Запуск приложения из другого приложения Android
Android Реализация отправки данных из EditText приложения Android в поле таблицы БД под СУБД Oracle 11g и в поле БД под СУБД MSSQL
Android Получить Activity другого приложения
Клавиатура наезжает на поле ввода Android
Android Возможно ли вставить спан в edit text?
Android Не отображается игровое поле после выхода из другого активити
Вызов другого приложения из текущего Android
Запуск другого приложения Android
Посмотреть вывод другого приложения Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
22.06.2016, 08:35     Вставить слово в поле ввода другого приложения. Возможно ли такое? #2
Если нельзя вызвать метод стороннего приложения зачем нужны protected, private у андроида?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
22.06.2016, 15:17     Вставить слово в поле ввода другого приложения. Возможно ли такое? #3
Цитата Сообщение от Valakin Посмотреть сообщение
зачем нужны protected, private у андроида
Это к Яве и ООП в целом. Конечно же, они имеют значение только внутри одного приложения и даже класса.
Цитата Сообщение от AlexV1 Посмотреть сообщение
как можно организовать вставку слова
Ну можно было бы попробовать расковырять приложение, и если там вставка данных идёт не из памяти, а из BroadcastReceiver или SharedPreferences, то попробовать послать туда свои данные, но это крайне маловероятно. Думаю, что эмулировать щелчок на EditText средствами Андроида не удастся.
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
23.06.2016, 15:59  [ТС]     Вставить слово в поле ввода другого приложения. Возможно ли такое? #4
> Думаю, что эмулировать щелчок на EditText средствами Андроида не удастся.

Считаем, что курсор в приложении X уже находится в поле ввода EditText и искать EditText не нужно.
Требуется только получить ссылку на activity приложения X, найти в этом activity тот View, на котором стоит курсор (getCurrentFocus()) и
попытаться (try...catch) вставить в него текст.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public void btnPaste_Click(View view) {
 
    // Вставляем в чужое приложение, которое после моего в вершине стека Activities (1-й эл-т, т.к. мой 0-й)
 
    String top;
 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //For versions less than lollipop
 
        ActivityManager am = ((ActivityManager) getSystemService(ACTIVITY_SERVICE));
            List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(5);
            top = taskInfo.get(1).topActivity.getPackageName();
            Log.v("test", "top app = " + top);
 
            ActivityManager.RunningTaskInfo ar = taskInfo.get(1);
            String packageName = ar.topActivity.getPackageName();
            Context otherAppContext = null;
            try {
                otherAppContext = getApplicationContext().createPackageContext(
                        packageName, Context.CONTEXT_IGNORE_SECURITY);
            } catch(Exception ex) {
            }
 
            if (((Activity)otherAppContext).getCurrentFocus() != null) {
                View v = ((Activity)otherAppContext).getCurrentFocus();
                try {
                    //String st = v.getShortClassName();
                    ((EditText)v).setText("123");
        }
                catch(Exception ex) {
                    //return;
                }
            }
 
 
        }
    } else { 
    для LOLLIPOP и выше список активити из стека получать иначе ... 
    }
 }
Открыл браузер поставил курсор в поле ввода, затем мою программу и кликнул в ней по кнопке (btnPaste_Click)

Строка Log.v("test", "top app = " + top); показала "com.android.browser", что говорит о том, что все верно, добрался я до пакета предыдущего по стеку приложения.
Рушится на строке
if (((Activity)otherAppContext).getCurrentFocus() != null) {
Говоря о том, что не может преобразовать otherAppContext в Activity.

Как получить ссылку на Activity (не имя Activity, а именно ссылку на объект активити), зная его context?

Добавлено через 1 час 22 минуты
Вернее так,

Из taskInfo мы получили объект ComponentName и из него нужно получить ссылку на Activity.
Возможно ли это?
Паблито
2240 / 1813 / 564
Регистрация: 12.05.2014
Сообщений: 6,456
Завершенные тесты: 1
23.06.2016, 18:22     Вставить слово в поле ввода другого приложения. Возможно ли такое? #5
я как-то пытался для себя, но до конца не дошел
делал с помощью своего AccessibilityService

нюанс первый - нужный мне метод появился только в 21 api (ниже пример из кода)
Java
1
2
3
Bundle arguments = new Bundle();
                arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "OLOLOLO");
                source.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
нюанс второй - у меня в сервисе так и не получилось побороть
Java
1
AccessibilityNodeInfo source = event.getSource();
getSource всегда возвращал null, конфиги и манифест перепроверял сто раз, но потом просто забил

нюанс третий - эта служба первый раз должна стартануть ручками и ее будет видно в Settings - Accesibility
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 33
24.06.2016, 16:54  [ТС]     Вставить слово в поле ввода другого приложения. Возможно ли такое? #6
А нельзя ли как то сэмулировать нажатие клавиши, чтобы клавиша послалась текущему приложению, чтобы оно само вставило символ в текущее поле ввода?

Добавлено через 10 часов 43 минуты
Паблито, Спасибо, буду копать в сторону AccessibilityService.
Если я правильно понимаю, через AccessibilityService можно как то достучаться до View в другом приложении X и, соответственно, подсунуть в него в EditText свою строку?

Вот только не понял, это что необходимо мое ПО делать службой на основе AccessibilityService, чтобы выполнять performAction или просто отдельный класс создать на основе AccessibilityService, ловить в нем сообщения в onAccessibilityEvent?

А сообщения в onAccessibilityEvent в мою программу откуда придут и в какой момент?

Ну все, замучал вас вопросами. Но, копать так копать глубже ;-)
Yandex
Объявления
24.06.2016, 16:54     Вставить слово в поле ввода другого приложения. Возможно ли такое?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru