Connecting to Supabase…
Tasker — отладка Play на BT-гарнитуре (пошагово)
Дата: 2026-06-23
Устройство: Pixel 6a, Tasker 6.6.20, Bluetooth-гарнитура
Цель: Play на гарнитуре → Tasker → (позже) AndroidChat → WpfChat 🎧 [tasker] PLAY
Проект отладки: BT Headset Debug (задача Headset Log Event, профили BT Headset Any / Play Pause / Play)
См. также: Tasker-BT-Key-Policy.md, Tasker-AI-BT-Key-Test-Prompt.md
0. Как это устроено (кратко)
Гарнитура Play
→ Android отдаёт кнопку одному «слушателю» (MediaSession)
→ Tasker (профиль Media Button + Grab) ИЛИ плеер (Spotify, YouTube…)
| Компонент | Роль |
|---|---|
| Tasker Permissions → Media Buttons | Разрешение SET_MEDIA_KEY_LISTENER — Tasker может слушать кнопки |
| Профиль State → Media Button | Реально перехватывает кнопку (с Grab) |
| Задача без профиля | Сама по себе кнопки не ловит |
| Grab On | Tasker забирает все media-кнопки → музыка/видео не получают Play |
| Grab Off | Музыка может работать, но Tasker на Pixel часто не видит нажатие |
| AndroidChat «Захват гарнитуры» | Отдельный перехват, независимо от Tasker |
Подтверждено на Pixel 6a (2026-06):
- Все профили Media Button OFF → Play в музыке работает
- Любой профиль ON (с Grab) → Play в музыке не работает
- BT Headset Any ON → задача запускается, Flash
HS:%par1, но%par1пустой - Media Buttons Revoked + reboot → музыка снова OK (Tasker не может слушать)
1. Подготовка (один раз)
1.1 Tasker Permissions — Media Buttons
Нужно для профилей State → Media Button.
Вариант A — утилита на ПК
- Скачать Tasker-Permissions →
tasker_permissions_portable.exe - Телефон: Для разработчиков → отладка по USB или беспроводная отладка
- На ПК:
adb devices→ устройство в статусеdevice - Запустить exe → вкладка Tasker → Media Buttons → Grant
Если exe пишет «The system cannot find the path specified» — adb не найден. Скопируйте в папку с exe из %LOCALAPPDATA%\Android\Sdk\platform-tools\: adb.exe, AdbWinApi.dll, AdbWinUsbApi.dll. Или используйте вариант B.
Вариант B — adb вручную (PowerShell)
adb shell pm grant net.dinglisch.android.taskerm android.permission.SET_MEDIA_KEY_LISTENER
Отозвать (вернуть музыку, если Tasker «залип»):
adb shell pm revoke net.dinglisch.android.taskerm android.permission.SET_MEDIA_KEY_LISTENER
После Grant/Revoke — перезапуск Tasker или reboot при странном поведении.
Grant All в утилите выдаёт и другие права (Secure Settings, Logs…). На Play/Pause влияет только Media Buttons.
1.2 AndroidChat (на время тестов Tasker)
| Настройка | Значение |
|---|---|
| Захват гарнитуры в AndroidChat | OFF |
| Передавать кнопки в чат | ON (когда дойдёте до Intent → WpfChat) |
1.3 Tasker — мониторинг
- Preferences → Monitor → On
- Иконка Tasker в шторке не на паузе
2. Создание отладочной схемы в Tasker
2.1 Задача Headset Log Event
Минимальный набор действий (порядок важен):
| # | Действие | Параметры |
|---|---|---|
| 1 | Flash | p1=[%par1] e1=[%evtprm1] e2=[%evtprm2] — Tasker Layout: Off |
| 2 | Variable Set | %Hs_last ← %par1 (позже заменить на %evtprm1, если сработает) |
| 3 | Variable Set | %Hs_time ← %TIME |
| 4 | Variable Set | %Hs_log ← %Hs_log\n%DATE %TIME \| %par1 |
| 5 | Flash | HS:%par1 |
Импорт готового проекта (опционально): Docs/TaskerTasks/Outcoming/BT_Headset_Debug_Project.prj.xml — Import Project, не Data → Restore.
2.2 Профиль BT Headset Any (основной для отладки)
| Поле | Значение |
|---|---|
| Тип | State → Hardware → Media Button |
| Button | Any |
| Grab | On |
| Stop Event | On |
| Held | Off |
| Задача | Headset Log Event |
2.3 Дополнительные профили (только для сравнения, по одному)
| Профиль | Button | Когда использовать |
|---|---|---|
| BT Headset Play Pause | Play Pause | если Any даёт пустой %par1, но срабатывает |
| BT Headset Play | Play | редко совпадает с реальной кнопкой гарнитуры |
Правило: в любой момент включён только ОДИН профиль Media Button.
3. Пошаговая диагностика
Шаг 1 — задача без гарнитуры (30 сек)
- TASKS → Headset Log Event → ▶ Run
- Если спросит
%par1— введитеPlay
| Результат | Вывод |
|---|---|
Flash p1=[Play] … |
Задача OK |
Буквально p1=[%par1] без ввода |
Нормально при Run без параметра |
| Ничего | Проверить действия / Flash отключён |
Шаг 2 — гарнитура, профиль Any (1 мин)
- Только BT Headset Any → ON, остальные Media Button → OFF
- Домашний экран (музыка закрыта, ничего не играет)
- Play на гарнитуре
| Результат | Вывод |
|---|---|
Flash HS:… или диагностический toast |
Профиль срабатывает |
p1=[] и e1=[] — всё пусто |
Известная проблема Pixel: %par1 пустой на State → шаг 4 |
| Ничего | Шаг 3 (восстановление) |
| Музыка в плеере не Play, но toast есть | Ожидаемо при Grab On |
Шаг 3 — если нет реакции на гарнитуре
Проверить по порядку:
- BT Headset Any = ON (State, не Event — если Event ещё не настраивали)
- Button = Any, Grab = On
- Tasker Permissions → Media Buttons = Granted
- AndroidChat → захват гарнитуры OFF
- Tasker → Run Log (☰ → More → Run Log) → Play на гарнитуре
| Run Log | Действие |
|---|---|
| Есть Headset Log Event | Профиль OK, смотреть Flash / переменные |
| Пусто | Профиль не ловит → п.1–4, reboot, переустановить Grant |
Шаг 4 — пустой %par1 (подтверждено на Pixel 6a)
Симптом: toast HS:%par1 буквально или p1=[] e1=[] при срабатывании профиля.
Причина: State → Media Button на Android 14 часто не передаёт имя кнопки в %par1. Массив %evtprm заполняется у Event, не у State.
Попробовать профиль Event:
- Создать профиль BT Headset Event Any
- Тип: Event → Hardware → Media Button → Button Any
- Задача: та же Headset Log Event
- BT Headset Any (State) → OFF
- Только Event-профиль ON → Play на гарнитуре
| Flash | Дальше |
|---|---|
e1=[Play] / Play Pause / похожее |
В задаче использовать %evtprm1 вместо %par1 |
| Всё пусто | Run Log, форум Tasker / AutoVoice Button (см. §6) |
Правка задачи после успеха Event:
Variable Set %Hs_btn ← %evtprm1
Flash HS:%Hs_btn
If %Hs_btn ~ *play* → … Intent в AndroidChat
Шаг 5 — проверка «музыка vs Tasker»
| Профили Media Button | Media Buttons | Ожидание |
|---|---|---|
| Все OFF | Granted | Музыка OK, Tasker молчит |
| Any ON, Grab On | Granted | Музыка ломается, toast от Tasker |
| Все OFF | Revoked + reboot | Музыка OK, Tasker не слушает |
Это нормальное поведение Grab, не баг Permissions.
4. Типичные ошибки
| Ошибка | Как должно быть |
|---|---|
| Несколько профилей Media Button ON | Только один |
| Button = Play | Чаще нужен Play Pause или Any |
| Play / Play Pause ON без Any | Grab блокирует музыку, задача не стартует (фильтр не совпал) — toast нет |
| Тест в Spotify при Grab Off | Кнопка уходит в плеер, Tasker молчит |
| Захват гарнитуры в AndroidChat ON | Конфликт с Tasker |
| Event вместо State без проверки | На Pixel Event может молчать — сначала State Any |
Ручной ▶ Run без %par1 |
Пустые скобки — не тест гарнитуры |
| Задача без профиля | Кнопки не перехватываются |
5. Режимы работы (практика)
Отладка гарнитуры (короткая сессия)
- Media Buttons → Granted
- Один профиль ON (лучше BT Headset Any или Event Any)
- Grab On для гарантированного перехвата
- Домашний экран или тестовый Flash
- Записать реальное имя кнопки (
%evtprm1/ Run Log)
Обычное использование телефона
- Все профили Media Button → OFF
- При необходимости: Media Buttons → Revoked (если музыка странная после тестов)
- Проверить: Play/Pause в YouTube / музыке работает
Напоминание: после сессии с Tasker выключите профили BT — иначе Play на гарнитуре не дойдёт до плееров. См. Tasker-BT-Key-Policy.md.
Целевая схема WpfChat (когда имя кнопки известно)
- Профиль → Headset Log Event или BT Key Debug
- If
%Hs_btn~*play*(или точное имя с гарнитуры) → Stop для остальных - Send Intent →
com.taskertowpf.androidchat.HEADSET_BUTTON, extrabutton=%Hs_btn - AndroidChat: захват OFF, передача кнопок ON
- Профиль OFF, когда голос/чат не нужны
6. Запасные пути
Если State и Event дают пустые параметры:
- AutoVoice → Plugin → Button → Bluetooth → Play/Pause (не требует Media Buttons так же жёстко)
- AndroidChat с захватом ON, все профили Tasker OFF — проверить, доходит ли 🎧 до WpfChat (тест железа)
- Tasker → Action Media → Media Button Events (временный regrab в задаче)
- Экспорт с телефона →
Docs/TaskerTasks/Incoming/→ сравнение сbackup2.xml
7. Чеклист перед отчётом в чат
- [ ] Какие профили ON / OFF
- [ ] State или Event
- [ ] Grab On/Off
- [ ] Media Buttons Granted/Revoked
- [ ] Результат теста ▶ Run с
Play - [ ] Текст Flash с гарнитуры (
p1=… e1=…) - [ ] Строка в Run Log при нажатии
- [ ] Захват гарнитуры в AndroidChat
8. Связанные файлы в репозитории
| Файл | Назначение |
|---|---|
Docs/TaskerTasks/Outcoming/BT_Headset_Debug_Project.prj.xml |
Проект отладки (профили + Scene + задачи) |
Docs/TaskerTasks/Outcoming/BT_Headset_Any.prf.xml |
Один профиль Any |
Docs/TaskerTasks/build_bt_headset_debug.py |
Пересборка XML |
Docs/MD_Files/Tasker-BT-Key-Policy.md |
Политика Grab и выключение профилей |
Docs/MD_Files/Tasker-AI-BT-Key-Test-Prompt.md |
Короткие промпты для Tasker AI |
Краткая шпаргалка
Permissions: Media Buttons Grant
Профиль: State → Media Button → Any → Grab On → Headset Log Event
Тест: Домашний экран → Play → смотреть Flash и Run Log
Пустой par1: Попробовать Event + %evtprm1
После теста: Профили OFF (музыка снова работает)