
Предыстория
Год назад я обнаружил, что нормального решения для доступа к файлам на часах 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 – неплохое решение. Позволяет передавать PDF файлы со смартфона на часы. На часах же приложение выступает в роли PDF-читалки и позволяет открывать полученные PDF файлы. Решение это платное, после пробного периода приложение превращается в тыкву.
Подопытный 2 – своего рода противоположность. Позволяет передать любой файл, но имеет сомнительный устаревший дизайн. Плюс ко всему, на наших устройствах оно почему-то вылетает. И, судя по его оценке в две звезды, не только у нас.
Поэтому я решил доработать своё приложение, добавив в него полезный функционал:
-
Передачу файлов со смартфона на часы
-
Открытие PDF файлов, а также изображений на часах
Делаем своё

Я решил не перегружать дизайн лишним. Всё, что можно сделать в мобильном приложении — это отправить файлы на смарт-часы.
Вверху отображается статус подключения к часам. Чтобы передавать файлы, необходимо соблюдение условий:
-
Часы WearOS подключены к смартфону
-
Часы «находятся поблизости»
-
Приложение установлено на смартфон и на часы
Говоря проще, просто установите приложение и убедитесь в том, что часы подключены к телефону.
Передача файлов реализована с помощью GoogleApi. Кратко: InputStream от локального файла разбивается на кусочки размером 32 КБ, которые отправляются на часы с помощью ChannelClient. На приёмной стороне реализован сервис на основе WearableListenerService. Приложение получает InputStream из канала и записывает данные в локальный FileOutputStream, собирая файл из этих кусочков.
На этом — всё. Такой простой алгоритм позволяет передавать файлы на часы. Скорость передачи не очень высокая. Так, например, на передачу картинки размером 7 Мб у меня ушло около десяти секунд. Однако передавать огромные файлы на часы никто не собирается, а небольшие файлы размером не более мегабайта передаются достаточно быстро.
Покажу, как это выглядит в действии:
Файлы, полученные часами, можно посмотреть в разделе «Получено». Каждый файл можно открыть (при наличии необходимого ПО на устройстве). В силу того, что PDF на часах обычно просматривать нечем, я добавил небольшую читалку PDF. В текущей реализации страницы можно листать и приближать. Даже можно попытаться что-то прочесть, несмотря на мелковатый для часов шрифт документов. Также я добавил небольшой просмотрщик картинок и простых текстовых файлов.
Смена направления
Теперь основной функционал приложения, а именно работа с файлами на устройстве, уходит на второй план. На главном экране — простое меню: фото, видео, аудио и просмотр полученных с телефона файлов.
Для продвинутых пользователей и особо желающих доступ к файловой системе остаётся. Чтобы полноценно пользоваться приложением как файловым менеджером всё ещё необходима выдача разрешения MANAGE_EXTERNAL_STORAGE через ADB.
Однако, если вы просто хотите просмотреть полученные файлы – это делать необязательно. А для просмотра списка медиафайлов на устройстве используется MediaStore. Это означает, что для доступа к списку фото вам понадобится разрешение READ_MEDIA_IMAGES, которое спокойно можно выдать без использования ADB.
Иными словами, пользователю больше не нужно разбираться с консолью и ADB. Открыл приложение на телефоне, выбрал файлы и отправил их на часы. А на часах просто открыл полученный файл. Всё.
Вместо заключения
Создавая этот небольшой проект я и не думал, что он обретёт хоть какую-то популярность. Однако, даже в такой сомнительной реализации, со всеми трудностями получения разрешений, количество скачиваний приложения в Google Play достигло 10 тысяч и это рекорд среди моих поделок.
Совсем скоро обновление будет доступно всем, и я надеюсь, что оно кто-нибудь найдёт моё решение полезным. Исходный код приложения доступен на GitHub, а скачать приложение можно с Google Play.
ссылка на оригинал статьи https://habr.com/ru/articles/1046343/