Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
AlexV1
-2 / 0 / 0
Регистрация: 05.04.2016
Сообщений: 36
#1

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

21.06.2016, 21:38. Просмотров 489. Ответов 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
Ответы с готовыми решениями:

Ошибка при вызове приложения из другого приложения
Сделано два простеньких приложения и я хочу чтобы одно приложение запускало...

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

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

вставить в текстовое поле значение из другого окна
Всем привет. Надеюсь на вашу помощь. Задача такая. есть input type=text...

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

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

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

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

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


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

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

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