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

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

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

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

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

Добрый день!

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

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

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

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

Ошибка при вызове приложения из другого приложения - Программирование Android
Сделано два простеньких приложения и я хочу чтобы одно приложение запускало другое. В приложении, которое будет запущено установлен фильтр...

Вставка в поле ввода другого приложения - Delphi
Мне нужно чтобы в программе при нажатии на кнопку вставлялись указанные мною, цифры и буквы, в другю программу(она уже будет запущена) в...

как вставить данные из переменной в форму ввода (поле ввода логина) на злементе webBrowser1 - C++/CLI
вставил элемент webBrowser1, он прекрасно робит, но требуется следующее, если это конечно возможно допустим в webBrowser1 мы открыли...

вставить в текстовое поле значение из другого окна - JavaScript
Всем привет. Надеюсь на вашу помощь. Задача такая. есть input type=text рядом ссылка "найти?", жмем на ссылку, открывается...

Скриншот экрана(именно самого приложения) возможно такое ? - C++ Qt
Доброго времени суток, господа! Интересно, был ли у кого опыт проворачивания такой затеи? Нет проблемы в создании скриншота экрана, а как...

Вставить текст в фокус другого приложения? - Delphi
Здравствуйте комрады! 1. При запуске приложения, оно должно находиться в режиме ожидания нажатия горячей клавиши. 2. Я нажимаю...

5
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 731
22.06.2016, 08:35 #2
Если нельзя вызвать метод стороннего приложения зачем нужны protected, private у андроида?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
22.06.2016, 15:17 #3
Цитата Сообщение от Valakin Посмотреть сообщение
зачем нужны protected, private у андроида
Это к Яве и ООП в целом. Конечно же, они имеют значение только внутри одного приложения и даже класса.
Цитата Сообщение от AlexV1 Посмотреть сообщение
как можно организовать вставку слова
Ну можно было бы попробовать расковырять приложение, и если там вставка данных идёт не из памяти, а из BroadcastReceiver или SharedPreferences, то попробовать послать туда свои данные, но это крайне маловероятно. Думаю, что эмулировать щелчок на EditText средствами Андроида не удастся.
0
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.
Возможно ли это?
0
Pablito
2499 / 1983 / 618
Регистрация: 12.05.2014
Сообщений: 6,925
Завершенные тесты: 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
0
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 в мою программу откуда придут и в какой момент?

Ну все, замучал вас вопросами. Но, копать так копать глубже ;-)
0
24.06.2016, 16:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2016, 16:54
Привет! Вот еще темы с ответами:

Как вставить текст в Edit'ы другого приложения? - Delphi
Не подскажите, как можно в Edit'ы другого приложения (не Delphi'ского) вставить текст?

Заменить слово в поле ввода - Windows 7
На экране приветствия есть поле ввода, где уже написано слово &quot;password&quot;, в русской версии похоже тоже будет просто &quot;пароль&quot;. Так вот,...

Возможно ли составить одно слово из букв другого (без учета кратности)? - Pascal
Определить возможность составления одного данного слова из букв другого данного слова без учета кратности

Возможно ли с помощью регулярных выражений проверить текствое поле на правильность ввода? - JavaScript
Есть поле для ввода текста(например для e-mail адреса). Возможно ли с помощью регулярных выражений в JavaScript проверить на его...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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