Отправляет email-рассылки с помощью сервиса Sendsay

[prg] Как сразу при входе в activity озвучить talkback подсказку у editText?

Всех приветствую. Подскажите пожалуйста,как сделать,чтобы talkback читал
не только имя activity,на которую я перехожу,но и подсказку или
contentDescription editText,на который автоматически попадает
фокус,поскольку я его явно запрашиваю,используя xml тег requestFocus для
данного editText. Логика подсказывает (поскольку я не смог найти ничего
путного на эту тему не на Русском,не на английском),что я должен после
инициализации editText послать ему какой-то тип accessibilityEvent,но я
перепробовал несколько типов событий,но они не сработали. Подскажите
пожалуйста,как реализовать чтение talkback название первого editText,т.е
того editText,на который попадает фокус при открытии activity? Заранее
благодарю всех за помощь.

Ответить   Sun, 11 Mar 2018 00:47:40 +0300 (#3551911)

 

Ответы:

Приветствую всех.
Если кратко, то чтобы передать скринридеру текст для озвучивания существует
метод View.announceForAccessibility (см. класс View
https://developer.android.com/reference/android/view/View.html).
Для подробного ответа нужно смотреть ваш код, так что тут вы уж сами
как-нибудь. В крайнем случае, соберите Talkback так, чтобы он выводил в лог
подробную информацию о всех получаемых событиях.

Помимо этого, в Android "поведение" фокусных событий иногда не совпадает с
"поведением" схожих событий в MS Windows, например, когда одна активность
уходит с переднего плана, открывая вторую, accessibility-события, связанного
с изменением фокуса, не возникает, поскольку во второй активности, которая
вышла на передний план, фокус никуда не перемещался.
Если у вас этот случай, то, возможно, имеет смысл принудительно озвучить
активный View в методе onResume вашей активности.
Чисто из практических наблюдений: стабильность работы скринридера (в смысле
озвучивания экранных событий) и на Android тоже зависит от настроек экрана
(например, размера текста и пр.) и на эмуляторе заметно хуже, чем на
реальных устройствах с реальными экранами.

Исходное сообщение Тема: [prg] Как сразу при входе в activity озвучить talkback подсказку у
editText?

Ответить   "i_chay" Sun, 11 Mar 2018 12:39:25 +0300 (#3551968)

 

Здравствуйте Анатолий. Правильно ли я Вас понял,что мне нужно при
создании activity в методе oncreate явно выводить что-то типа "введите
имя окно редактирования",т.е использовать tts,уведомления,или метод view
announceForAccessibility,а явно заставить talkback читать подсказку поля
ввода,как talkback это делает когда я явно фокусируюсь на этом
поле,нельзя? Кстати можно ли,и если да,то как,отследить,когда talkback
начал говорить,когда закончил и т.д,чтобы я мог запустить tts,поскольку
talkback с ним конфликтует. Ещё можно ли отследить,когда метод
announceForAccessibility начал работу и выполнился,т.е когда talkback
начал читать текст,который я вывожу,когда закончил и т.д,как это можно
сделать в tts? Если да,то подскажите пожалуйста,как это сделать? Заранее
благодарю Вас за помощь.

Ответить   Sun, 11 Mar 2018 16:19:54 +0300 (#3552021)

 

Приветствую всех.

Только не в onCreate(), а например, в onResume().
В onCreate() окно ещё не существует на экране.
Но если предполагается использовать tts с целью подменить скринридер, когда
он активен, то это не самое хорошее решение.

Можно, если корректно сформируете и пошлёте соответствующий
AccessibilityEvent.
Когда вы принудительно помещаете фокус ввода в EditText, то соответствующий
AccessibilityEvent формирует система.
А поскольку вы не хотите трогать фокус ввода, то придется вам самому
формировать нужное событие (например, с типом
TYPE_VIEW_ACCESSIBILITY_FOCUSED).
Как я понял, это у вас не получается, поэтому предложил менее сложный
вариант с методом View.announceForAccessibility(), который тоже создает и
отсылает событие AccessibilityEvent но с типом TYPE_ANNOUNCEMENT.

Попробуйте отслеживать состояние аудио-фокуса.

Ответить   "i_chay" Mon, 12 Mar 2018 01:56:42 +0300 (#3552044)

 

Здравствуйте Анатолий. Вы писали

Обоснуйте пожалуйста почему? Я лично предпочитаю tts по следующим
причинам: 1. в одном из моих приложений мне нужно было в цикле выводить
информацию. Когда итераций было слишком много,при использовании метода
announceForAccessibility начинал подтормаживать talback,а вот при
использовании tts всё работало без тормозов. 2. Возможно я не прав,но
при использовании метода announceForAccessibility не выводится вся
информация,когда сообщений слишком много,т.е что-то
пропускается,хотя,возможно,я не прав. 3. Этот метод не корректно
работает на очень старых версиях android,к примеру у моего друга на
android 4.1.1 (по-моему api 17) вместо нужной мне информации выводился
contentDescription моего view,у которого я и использую метод
announceForAccessibility,а вот tts работает даже вроде на android
2.2,хотя я в основном ставлю в своих приложениях как минимум минимальное
api 16. 4. В tts можно явно отследить начала вывода,процесс
вывода,завершение вывода,говорит ли сейчас tts и если да,то какую
фразу,и очень много других вещей,а вот с методом
announceForAccessibility это,как я понял,гораздо сложнее сделать. Хотя
честно сказать,пока что моя карточная игра использует именно этот метод
вывода информации,но я думаю перейти на tts. Я бы давно это сделал,но не
знаю,как заблокировать talkback во время работы tts,или как
сделать,чтобы,к примеру,talkback не читал информацию об изменении
размера списка,элемент,на который попадает фокус при явном запросе
фокуса у списка,изменение контента у некоторых view и т.д. Я пробовал
поиграться с xml атрибутом accessibilityLiveRegion (название может быть
написано не точно),но это мне почти ничего не дало,хотя,возможно,если
правильно использовать этот атрибут,то можно будет чего-то
добиться,только как правильно использовать этот атрибут,чтобы talkback
не читал того,о чём я писал выше? Хотя иногда интересно узнать
информацию об изменении контента,но как тогда подружить tts и talkback?
Я,конечно,пробовал использовать метод onStop в utteranceProgressListener
(название может быть написано не точно)и проверять,не был ли прерван
tts,но во-первых,когда tts прерывался,он повторял последнюю фразу,а
во-вторых происходила разбалансировка tts,т.е когда должна была
проговариваться следующая фраза,проговаривалась прерванная
фраза,хотя,возможно,я тут намудрил во-первых потому,что присваивал id
фразы самой фразе,т.е id фразы был равен той строке,которую говорил
tts,а во-вторых,как я понял,я выводил прерванную фразу,а чтобы этого
избежать,нужно каждое сообщение сохранять в отдельную строку. Ещё Вы пишете

Т.е Вы имеете ввиду,что мне не нужно использовать метод
sendAccessibilityEvent по-моему с целочисленным типом события,а нужно
использовать метод sendAccessibilityEvent,который в качестве параметра
принимает объект типа accessibilityEvent (все названия могут быть
неточными)? Если да,то подскажите пожалуйста,как корректно сформировать
это событие? Может быть есть где-то пример кода,который это делает,ведь
задача,на мой взгляд,совершенно не новая. Ещё Вы пишете

Я Вас не совсем понял,т.е что Вы имеете ввиду под фокусом ввода? У меня
при создании activity сразу попадает фокус на editText и показывается
клавиатура для ввода. Фокус запрашивается в xml макете activity,с
использованием тега requestFocus. Ещё Вы пишете

Я вас не совсем понял. Вы имеете ввиду,что нужно отслеживать потерю
аудио фокуса у моего приложения,или потерю аудиофокуса у talkback?
Заранее благодарю Вас за помощь.

Ответить   Mon, 12 Mar 2018 03:45:42 +0300 (#3552047)