- Передаем файлы между android-устройствами: Files Go, SHAREit и AirDroid
- Оглавление
- Вступление
- реклама
- Files Go
- Знакомство
- реклама
- Начало работы
- реклама
- Настройки
- реклама
- Тестирование
- реклама
- Выводы
- Правильная работа с файлами в Android
- Обновляемся на новую версию API Android по наставлению Google
- Что происходит
- Переход на новую версию
Передаем файлы между android-устройствами: Files Go, SHAREit и AirDroid
Оглавление
Вступление
У любого пользователя смартфона или планшета с определенной периодичностью возникает нужда в передаче или обмене файлами между устройствами. Причем ситуации бывают разные, иногда нужно получить файл от коллеги по работе, обменяться фотографиями с расписанием дежурств, быстро переслать ролик с видеорегистратора и так далее.
реклама
На первый взгляд можно отправить файл по Bluetooth или через интернет, но если вспомнить о низкой скорости передачи данных и цене мобильного трафика, то теряется вся «мобильность» сего деяния. Как же быть в таком случае? Быстро передать файл между аппаратами на базе OC Android можно с помощью специальных приложений, рассмотрением которых мы и займемся.
Можно сказать, что виновником данной статьи стало новое приложение Google – Files Go, призванное упростить всевозможную работу с файлами. А дополнительно мы обновим свое мнение по поводу таких известных утилит, как SHAREit и AirDroid.
В качестве тестового оборудования использовались следующие устройства:
- Смартфон Xiaomi Redmi Note 3 Pro (OC Android 8.0.0, Nitrogen OS, процессор Snapdragon 650 64 бит, 6 х 1800 МГц, видеосопроцессор Adreno 510, 2 Гбайт ОЗУ);
- Смартфон Jinga Basco M500 3G (OC Android 5.1.1, процессор MediaTek MT6580, 4 х 1300 МГц, видеосопроцессор Mali-400 MP2, 1 Гбайт ОЗУ).
Files Go
Знакомство
Компания Google делает толковые приложения, которые зачастую становятся востребованными пользователями. И, судя по всему, сейчас она решила, что нам не хватает встроенной функциональности по работе с библиотекой файлов, их обслуживанием и передачей, и постаралась воплотить это в крохотной утилите Files Go.
Главные функции Files Go:
- Очистка памяти телефона. Освобождать место на телефоне стало еще проще. Удаляйте старые фото и картинки из чатов, дублирующиеся файлы, неиспользуемые приложения, кэш, спам и другие ненужные данные.
- Проверка объема хранилища. Узнавайте, сколько свободного пространства осталось на телефоне и SD-карте. Без труда переносите файлы из внутренней памяти на SD-карту прямо в приложении.
- Рекомендации. Files Go подсказывает, какие файлы удалить, чтобы не забивать память телефона. Чем чаще вы пользуетесь приложением, тем точнее становятся рекомендации.
- Быстрый поиск файлов. Для организации файлов Files Go использует фильтры, а не папки, поэтому искать фотографии, видео и документы на телефоне будет проще.
- Отправка файлов офлайн. Если ваш друг тоже использует Files Go и находится с вами в одном помещении, вы можете отправлять ему файлы и даже приложения, не подключаясь к Интернету. Скорость передачи данных: до 125 Мбит/с.
- Шифрование данных. Благодаря технологии шифрования WPA2 файлы, передаваемые в офлайн-режиме через Files Go, надежно защищены.
- Эффективное управление пространством. Files Go занимает всего 6 Мбайт, и в приложении нет лишних функций или фоновых процессов, которые могли бы снизить производительность устройства.
реклама
Начало работы
Files Go является эдаким упрощенным файловым менеджером и позволяет пользователям, в особенности начинающим, комфортно работать с файлами и выполнять с ними различные манипуляции.
Интерфейс утилиты разделен на два раздела: «Хранилище» и «Файлы». Первый раздел полностью посвящен файлам и «высвобождению» памяти. В нем отображаются графики по свободной/занятой памяти во встроенном хранилище и на карте памяти.
Отдельными подпунктами вынесены следующие функции приложения: «Дубликаты файлов», «Поиск неиспользуемых приложений», «Временные файлы», «Скачанные файлы», «Большие файлы» и «Перенос файлов на SD-карту».
Соответственно, каждая из вышеуказанных опций нацелена на очистку памяти устройства, поиск и ликвидацию больших файлов и перенос файлов на съемный носитель. Примечательно, что при запуске Files Go максимально быстро сканирует память устройства и у каждой функции сразу указывает, сколько памяти можно освободить после выполнения данных манипуляций. В том же файловом менеджере «ES Проводник» на эту операцию потребуется затратить лишнее время.
По ходу работы с функциями мы видим абсолютно прозрачный процесс: программа показывает, какие файлы лишние, что у нас уже установлено на смартфоне и что она хочет удалить.
Следующая вкладка «Файлы» представляет все наши файлы в аккуратной библиотеке, рассортированной по типам. Именно там можно попробовать найти искомый файл, если мы знаем его тип, причем для каждого накопителя есть различные разделы. Дополнительно предусмотрены параметры по сортировке, отображению и перемещению.
Из явных недостатков Files Go можно отметить лишь отсутствие поиска файлов по названию. Такая элементарная функция, которая должна быть в любом приличном файловом менеджере, и здесь ее нет. Как можно было о ней забыть? Возможно, с обновлениями Google исправит данное недоразумение.
реклама
Один пользователь утилиты Files Go выбирает пункт «Отправить», находит другого пользователя и выбирает файлы, нужные для передачи. В это время второй пользователь выбирает параметр «Принять» и ожидает.
Передавать можно все типы файлов, даже уже установленные приложения без предварительного создания установочного файла. Скорость передачи составляет 125 Мбит/с, да и проблем с передачей нет никаких. Все передаваемые файлы защищены по стандарту WPA2. Устройства находятся буквально после первого клика, для этого используется Bluetooth-соединение.
Настройки
реклама
В Files Go присутствуют следующие параметры, касающиеся уведомлений:
- Мало места;
- Неиспользуемые приложения;
- Скачанные файлы;
- Большие папки;
- Дубликаты файлов.
Тестирование
Версия приложения | 1.0.178175053 |
Размер дистрибутива | 5.87 Мбайт |
Размер приложения в установленном виде | 22.75 Мбайт |
Потребление ОЗУ | 20-60 Мбайт |
С одной стороны, Files Go максимально прост, претензий к его работе у меня нет. С другой – понятно, что Google необходимо продвигать свежие версии ОС Android, но требовать для такого приложения как минимум Android 5.0+ глупо.
реклама
Выводы
Files Go – это маленькая и полезная программа для работы с файлами, которая позволяет максимально быстро и удобно передавать их между android-устройствами (естественно, с установленной программой). Дополнительно она умеет высвобождать место в памяти аппарата. Все вышеуказанное делается бесплатно и при полном отсутствии рекламы.
Источник
Правильная работа с файлами в Android
Сегодня я бы хотел рассказать вам о правильной работе с файлами в ОС Android. Итак, чаще всего у новичков возникают ситуации, когда обычные Java функции не могут корректно создать тот или иной файл в системе Android.
Во-первых, вам нужно обратить внимание на интересную особенность ОС:
когда вы устанавливаете apk приложение в эмулятор или телефон, система Linux (на которой базируется ядро Android) выделяет ему специальный User-ID, который является неким ключом доступа к (sandbox). То есть другие приложения в телефоне не смогут получить доступ к чтению файлов вашего приложения просто так. Кончено, всё это сделано в целях безопасности.
В общем, если вы запустите следующий код:
FileWriter f = new FileWriter(«impossible.txt»);
То этот код вызовет исключение: ‘java.io.FileNotFoundException: /impossible.txt ‘
Тогда как должен в случае отсутствия файла создать его.
Далее стоит отметить, что данное ограничение не распространяется на файлы, записываемые на SDCard. Туда можно писать любые файлы без всяких проблем, правда предварительно нужно добавить в AndroidManifest разрешение на запись:
Код файла на карту:
File fileName = null;
String sdState = android.os.Environment.getExternalStorageState();
if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) <
File sdDir = android.os.Environment.getExternalStorageDirectory();
fileName = new File(sdDir, «cache/primer.txt»);
> else <
fileName = context.getCacheDir();
>
if (!fileName.exists())
fileName.mkdirs();
try <
FileWriter f = new FileWriter(fileName);
f.write(«hello world»);
f.flush();
f.close();
> catch (Exception e) <
>
Как уже ранее было сказано мною, android приложение находится в некой песочнице, изолированной от воздействия со стороны других приложений по умолчанию. Для того, чтобы создать файл внутри этой песочницы, следует использовать функцию openFileOutput(). Хочу отметить 2 аргумента:
1. имя файла
2. режим доступа к нему со стороны чужих приложений
С первым аргументом все ясно, что касается второго, то режимов существует два: MODE_WORLD_READABLE и/или MODE_WORLD_WRITEABLE.
И ещё, чтобы записать файл можно использовать следующий код:
final String TESTSTRING = new String(«Hello Android»);
FileOutputStream fOut = openFileOutput(«samplefile.txt», MODE_WORLD_READABLE);
OutputStreamWriter osw = new OutputStreamWriter(fOut);
// записываем строку в файл
osw.write(TESTSTRING);
/* проверяем, что все действительно записалось и закрываем файл */
osw.flush();
osw.close();
Для чтения файлов используется метод openFileInput():
FileInputStream fIn = openFileInput(«samplefile.txt»);
InputStreamReader isr = new InputStreamReader(fIn);
char[] inputBuffer = new char[TESTSTRING.length()];
isr.read(inputBuffer);
String readString = new String(inputBuffer);
Для удаления используется метод deleteFile() в контексте приложения/активити. На этом я бы хотел закончить полезный пост, спасибо за внимание!
Источник
Обновляемся на новую версию API Android по наставлению Google
Скоро выходит Android 12, но в этом августе уже с 11-й версии разработчикам придётся использовать новые стандарты доступа приложений к внешним файлам. Если раньше можно было просто поставить флаг, что ваше приложение не поддерживает нововведения, то скоро они станут обязательными для всех. Главный фокус — повышение безопасности.
Переход на новую версию API — довольно трудоёмкая операция, требующая больших затрат на её поддержку при введении крупных апдейтов. Далее расскажу немного про наш переход и возникшие при этом трудности.
Что происходит
Если вы уже знакомы с теорией, то этот раздел можно пропустить — тут я хочу поверхностно сравнить подходы к предмету в разных версиях операционной системы.
В Android есть внутреннее Internal Storage (IS) и внешнее хранилище External Storage (ES). Исторически это были встроенная память в телефоне и внешняя SD-карта, поэтому ES был больше, но медленнее и дешевле. Отсюда и разделение — настройки и критически важное записывали в IS, а в ES хранили данные и большие файлы, например, медиа. Потом ES тоже стал встраиваться в телефон, но разделение, по крайней мере логическое, осталось.
У приложения всегда есть доступ к IS, и там оно может делать что угодно. Но эта папка только для конкретного приложения и она ограничена в памяти. К ES нужно было получать доступ и, кроме манипуляции со своими данными, можно было получить доступ к данным других приложений и производить с ними любые действия (редактировать, удалять или украсть).
Но после разделения на внутреннее и внешнее хранилища все равно оставались проблемы. Многие приложения могли хранить чувствительную информацию не только в IS, но и в ES — то есть ответственность лежала целиком на разработчиках и на том, кто хочет завладеть файлами.
В Android решили всё это переделать ещё в 10-й версии, а в 11-й это стало обязательным.
Чтобы минимизировать риски для пользователя в Google решили внедрить Scoped Storage (SS) в ES. Возможность проникнуть в папки других приложений убрали, а доступ есть только к своим данным — теперь это сугубо личная папка. А IS с 10-й версии ещё и зашифрована по умолчанию.
В Android 11 Google зафорсировала использование SS — когда таргет-версия SDK повышается до 30-й версии API, то нужно использовать SS, иначе будут ошибки, связанные с доступом к файлам. Фишка Android в том, что можно заявить совместимость с определённой версией ОС. Те, кто не переходили на 11, просто говорили, что пока не совместимы с этой версий, но теперь нужно начать поддерживать нововведения всем. С осени не получится заливать апдейты, если не поддерживаешь Android 11, а с августа нельзя будет заливать новые приложения.
Если SS не поддерживается (для девайсов ниже 10-й версии), то для доступа к данным других приложений требуется получить доступ к чтению и записи в память. Иначе придётся получать доступ к файлам через Media Content, Storage Access Framework или новый, появившийся в 11-м Android, фреймворк Datasets в зависимости от типа данных. Здесь тоже придётся получать разрешение доступа к файлу, но по более интересной схеме. Когда расшариваемый файл создаёшь сам, то доступ к нему не нужен. Но если переустановить приложение — доступ к нему опять потребуется. К каждому файлу система привязывает приложение, поэтому когда запрашиваешь доступ, его может не оказаться. Особо беспокоиться не нужно, это сложно отследить, поэтому лучше просто сразу запрашивать пермишен.
Media Content, SAF и Datasets относятся к Shared Storage (ShS). При удалении приложения расшаренные данные не удаляются. Это полезно, если не хочется потерять нужный контент.
Хотя даже при наличии SS можно дать доступ к своим файлам по определённой технологии — через FileProvider можно указать возможность получения доступа к своим файлам из другого приложения. Это нормально, потому что файлы расшаривает сам разработчик.
Также добавилась фича — если приложение не использовалось несколько месяцев, то снимаются все пермишены и доступы к системным элементам. По best practice разрешение запрашивается по необходимости (то есть непосредственно перед использованием того, на что спрашиваем разрешение), поэтому мы просто перед выполнением какого-либо действия проверяем, есть ли у нас пермишены. Если нет, то запрашиваем.
В то же время перекрыли доступы к приложениям внутри девайса. Если раньше можно было отследить, что установлены определённые приложения и отправлять к ним соответствующие интенты, то сейчас мы должны прямо в манифесте прописать, что работаем именно с этими приложениями, и только после этого получить доступ.
В качестве примера можем взять шаринг — мы шарим множество приложений, и их всех нужно указывать в манифесте, иначе они не обнаружатся. Начнём перебирать пакет установленных приложений — будет информация, что не указанного в манифесте приложения нет и при шаринге всё отвалится.
Перейдём к практике.
Переход на новую версию
Основная функциональность по работе с файлами в приложении iFunny представлена в виде сохранения мемов в память и расшаривания их между приложениями. Это было первое, что требовалось починить.
Для этого выделили в общий интерфейс работу с файлами, реализация которого зависела от версии API.
FilesManipulator представляет собой интерфейс, который знает, как работать с файлами и предоставляет разработчику API для записи информации в файл. Copier — это интерфейс, который разработчик должен реализовать, и в который передаётся поток вывода. Грубо говоря, мы не заботимся о том, как создаются файлы, мы работаем только с потоком вывода. Под капотом до 10-й версии Android в FilesManipulator происходит работа с File API, после 10-й (и включая её) — MediaStore API.
Рассмотрим на примере сохранения картинки.
Так как операция сохранения медиафайлов достаточно длительная, то целесообразно использовать MediaStore.Images.Media.IS_PENDING , которая при установлении значения 0 не дает видеть файл приложениям, отличного от текущего.
По сути, вся работа с файлами реализована через эти классы. Шаринг в другие приложения автоматически сохраняют медиа в память устройства и последующая работа с URI уже происходит по новому пути. Но есть такие SDK, которые ещё не успели перестроиться под новые реалии и до сих пор используют File API для проверки медиа. В этом случае используем кеш из External Storage и при необходимости провайдим доступ к файлу через FileProvider API.
Помимо ограничений с памятью в приложениях, таргетированных на 30-ю версию API, появилось ограничение на видимость приложения. Так как iFunny использует шаринг во множество приложений, то данная функциональность была сломана полностью. К счастью, достаточно добавить в манифест query, открывающую область видимости к приложению, и можно будет также полноценно использовать SDK.
Для неявных интентов тоже приходится добавлять код в манифест, чтобы задекларировать то, с чем будет работать приложение. В качестве примера выложу часть кода, добавленного в манифест.
После проверок запуска UI-тестов на девайсах с версиями API 29-30 было выявлено, что они также перестали корректно отрабатываться.
Первоначально в LogCat обнаружил, что приложение не может приконнектиться к процессу Orchestrator и выдает ошибку java.lang.RuntimeException: Cannot connect to androidx.test.orchestrator.OrchestratorService.
Эта проблема из разряда видимости других приложений, поэтому достаточно было добавить строку
Тест удачно запустился, но возникла другая ошибка — Allure не может сохранить отчёт в память устройства, падает с ошибкой.
Очевидно из-за Scoped Storage стало невозможно сохранять файлы в другие папки, поэтому снова почитав документацию по управлению файлами в памяти на девайсе, обнаружил интересный раздел. Там рассказано, как для нужд тестов открыть доступ к папкам девайса, но с существенными ограничениями, которые можно почитать тут.
Так как нам нужно использовать этот пермишен только для тестов, то нам условия подходят. Поэтому я быстренько написал свой ShellCommandExecutor, который выполняет команду adb shell appops set —uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow на создании раннера тестов.
На Android 11 тесты удачно запустились и стали проходить без ошибок.
После попытки запуска на 10-й версии Android обнаружил, что отчет Allure также перестал сохраняться в память девайса. Посмотрев issue Allure, обнаружил, что проблема известная, как и с 11-й версией. Достаточно выполнить команду adb shell appops set —uid PACKAGE_NAME LEGACY_STORAGE allow . Сказано, сделано.
Запустил тесты — всё еще не происходит сохранения в память отчёта. Тогда я обнаружил, что в манифесте WRITE_EXTERNAL_STORAGE ограничен верхней планкой до 28 версии API, то есть запрашивая работу памятью мы не предоставили все разрешения. После изменения верхней планки (конечно, для варианта debug) и запроса пермишена на запись тесты удачно запустились и отчёт Allure сохранился в память устройства.
Добавлены следующие определения пермишенов для debug-сборки.
После всех вышеописанных манипуляций с приложением, можно спокойно устанавливать targetSdkVersion 30, загружать в Google Play и не беспокоиться про дедлайн, после которого загружать приложения версией ниже станет невозможно.
Источник