Как я писал проводник для Wear OS. Часть 2

от автора

Часть первая тут

Предыстория

Год назад я обнаружил, что нормального решения для доступа к файлам на часах Wear OS просто не существует. Все они не были адаптированы под дизайн круглых экранов и имели сомнительный функционал. Второе, к слову, объясняется ограничениями со стороны Wear OS. compileSdk выше 29-ой версии не позволит вам получить разрешение MANAGE_EXTERNAL_STORAGE. Вернее, сделать это можно, подключившись к часам через ADB и введя простую команду:

adb shell appops set --uid <имя_пакета> MANAGE_EXTERNAL_STORAGE allow

Однако при попытке запросить разрешение стандартными средствами вы получите ошибку. Примерно такую:

No Activity found to handle Intent { act=android.settings.MANAGE_ALL_FILES_ACCESS_PERMISSION }

Пример этой проблемы висит на IssueTracker годами и никак не решается.

Забавно, что если собрать приложение с compileSdk 29-ой версии, разрешение можно получить без проблем. Радоваться тут нечему: политика Google Play не позволит вам загрузить такое приложение в магазин приложений.

Приняв во внимание поставленные ограничения я всё-таки решил написать своё небольшое приложение для доступа к файлам. Проблема разрешений никак не была решена. Пользователям любезно предлагается выдать разрешение на доступ к файлам через ADB. Взамен они получают симпатичный файловый менеджер с возможностью просмотра, открытия, переименования и удаления файлов.

Немного скриншотов :)

Немного скриншотов 🙂

А зачем?

Этот вопрос нужно было задать раньше. Да, мы можем управлять какими-то файлами на часах. Совершать над ними какие-то действия. Но главный вопрос, который мною не был задан: для чего это нужно?

Второй вопрос, который я проигнорировал: откуда же взяться этим файлам на часах?

Я могу загрузить фотки конспектов на часы через ADB (и благополучно списать экзамен, ха). Но вот наступает сессия, подруга спрашивает меня, как быстро и без заморочек перебросить что-то на часы. Очевидно, что способ с ADB – это не наш случай. То, что я могу сделать что-то в консоли, не означает, что это могут делать все. Нужно более удобное решение… приложение для передачи файлов со смартфона на часы.

Конечно же сначала мы открыли Google Play и стали искать решение там.

Подопытный 1: https://play.google.com/store/apps/details?id=com.onnex.weardocspdf&hl=ru

Подопытный 2: https://play.google.com/store/apps/details?id=com.somyac.watch.filetransfer&hl=ru

Подопытный 1 – неплохое решение. Позволяет передавать PDF файлы со смартфона на часы. На часах же приложение выступает в роли PDF-читалки и позволяет открывать полученные PDF файлы. Решение это платное, после пробного периода приложение превращается в тыкву.

Подопытный 2 – своего рода противоположность. Позволяет передать любой файл, но имеет сомнительный устаревший дизайн. Плюс ко всему, на наших устройствах оно почему-то вылетает. И, судя по его оценке в две звезды, не только у нас.

Поэтому я решил доработать своё приложение, добавив в него полезный функционал:

  • Передачу файлов со смартфона на часы

  • Открытие PDF файлов, а также изображений на часах

Делаем своё

Я решил не перегружать дизайн лишним. Всё, что можно сделать в мобильном приложении — это отправить файлы на смарт-часы.

Вверху отображается статус подключения к часам. Чтобы передавать файлы, необходимо соблюдение условий:

  • Часы WearOS подключены к смартфону

  • Часы «находятся поблизости»

  • Приложение установлено на смартфон и на часы

Говоря проще, просто установите приложение и убедитесь в том, что часы подключены к телефону.

Статус подключения

Статус подключения

Передача файлов реализована с помощью GoogleApi. Кратко: InputStream от локального файла разбивается на кусочки размером 32 КБ, которые отправляются на часы с помощью ChannelClient. На приёмной стороне реализован сервис на основе WearableListenerService. Приложение получает InputStream из канала и записывает данные в локальный FileOutputStream, собирая файл из этих кусочков.

На этом — всё. Такой простой алгоритм позволяет передавать файлы на часы. Скорость передачи не очень высокая. Так, например, на передачу картинки размером 7 Мб у меня ушло около десяти секунд. Однако передавать огромные файлы на часы никто не собирается, а небольшие файлы размером не более мегабайта передаются достаточно быстро.

Покажу, как это выглядит в действии:

Пример передачи файлов со смартфона на часы

Пример передачи файлов со смартфона на часы

Файлы, полученные часами, можно посмотреть в разделе «Получено». Каждый файл можно открыть (при наличии необходимого ПО на устройстве). В силу того, что PDF на часах обычно просматривать нечем, я добавил небольшую читалку PDF. В текущей реализации страницы можно листать и приближать. Даже можно попытаться что-то прочесть, несмотря на мелковатый для часов шрифт документов. Также я добавил небольшой просмотрщик картинок и простых текстовых файлов.

Просмотр файла формата Markdown

Просмотр файла формата Markdown

Смена направления

Теперь основной функционал приложения, а именно работа с файлами на устройстве, уходит на второй план. На главном экране — простое меню: фото, видео, аудио и просмотр полученных с телефона файлов.

Редизайн приложения

Редизайн приложения

Для продвинутых пользователей и особо желающих доступ к файловой системе остаётся. Чтобы полноценно пользоваться приложением как файловым менеджером всё ещё необходима выдача разрешения MANAGE_EXTERNAL_STORAGE через ADB.

Однако, если вы просто хотите просмотреть полученные файлы – это делать необязательно. А для просмотра списка медиафайлов на устройстве используется MediaStore. Это означает, что для доступа к списку фото вам понадобится разрешение READ_MEDIA_IMAGES, которое спокойно можно выдать без использования ADB.

Иными словами, пользователю больше не нужно разбираться с консолью и ADB. Открыл приложение на телефоне, выбрал файлы и отправил их на часы. А на часах просто открыл полученный файл. Всё.

Вместо заключения

Создавая этот небольшой проект я и не думал, что он обретёт хоть какую-то популярность. Однако, даже в такой сомнительной реализации, со всеми трудностями получения разрешений, количество скачиваний приложения в Google Play достигло 10 тысяч и это рекорд среди моих поделок.

Совсем скоро обновление будет доступно всем, и я надеюсь, что оно кто-нибудь найдёт моё решение полезным. Исходный код приложения доступен на GitHub, а скачать приложение можно с Google Play.

ссылка на оригинал статьи https://habr.com/ru/articles/1046343/