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

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

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

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

21.06.2016, 21:38. Просмотров 382. Ответов 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     Вставить слово в поле ввода другого приложения. Возможно ли такое?
Посмотрите здесь:

Возможно ли вставить спан в edit text? - Программирование Android
Делал я делал и вот новый вопрос. Возможно ли запихать спан в edit text не прибегая к EditText.setTex();?(доставляет уйму неприятностей)

Реализация отправки данных из EditText приложения Android в поле таблицы БД под СУБД Oracle 11g и в поле БД под СУБД MSSQL - Программирование Android
всем доброго времени суток! Читаю и изучаю мануалы и уроки по разработке ПО под Андройд. вообщем постоянно крутиться мысль в голове,...

Запуск другого приложения - Программирование Android
Есть приложение. Мне нужно сначала проверить установлено ли оно и только потом запускать. Если не установлено то открыть ссылку. Как это...

Запуск другого приложения по названию - Программирование Android
Нужно сделать запуск другого приложения по названию. Например если написать "Subawy Surf" или "Поварёнок" то оно его запустит. Как это...

Посмотреть вывод другого приложения - Программирование Android
Есть желание сделать такую вот "фишку". Есть стороннее приложение. Строго определенное, прописано в настройках нашего приложения. ...

Вызов другого приложения из текущего - Программирование Android
Как вызвать другое приложение при нажатии той же кнопки? Читал, что нужна уникальная ссылка, а вот какая и где её взять.... Буду благодарен...

Открыть приложение из другого приложения - Программирование Android
Добрый вечер. Мне нужно открыть pdf по ссылке. Объясню. Есть путь к файлу, например sdCard/qq/aa.pdf. На телефоне установлена программа,...

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

Не отображается игровое поле после выхода из другого активити - Программирование Android
Когда я выхожу из другого активити и пытаюсь зайти в игру,котороe у меня в главном активити,игровое поле не отображается. вот мой код.в...

Клавиатура наезжает на поле ввода - Программирование Android
Вот какая проблема, у меня в приложении, при необходимости ввода данных, клавиатура закрывает поле EditText. При чем, при первом вхождении...

Событие установки ДРУГОГО Android приложения - Программирование Android
Здравствуйте, возможно ли сделать следующее? Допустим есть простое приложение Hello World (стандартное которое создается в Eclipse) ...

Программно нажать кнопку другого приложения - Программирование Android
Приветствую. Есть ли возможность под android программно: 1. Нажать кнопку другого приложения? 2. Минимизировать\закрыть чужое...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
22.06.2016, 08:35     Вставить слово в поле ввода другого приложения. Возможно ли такое? #2
Если нельзя вызвать метод стороннего приложения зачем нужны protected, private у андроида?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
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.
Возможно ли это?
Pablito
2452 / 1897 / 590
Регистрация: 12.05.2014
Сообщений: 6,698
Завершенные тесты: 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