Мне нужно сделать так, чтобы у меня непосредственно в приложении андроид лежали файлы по типу .json . Куда их положить — я знаю всего два места, это папка raw и assets , прочитать содержимое у меня получилось отлично, а вот заменить значения у меня не получается. Узнал только, что в папке raw хранятся ресурсы и их не получится изменять и дополнять непосредственно во время работы приложения, а про паку assets такой информации не нашел. Может я конечно не так открываю:
var JSON_STRING_OF_COMPL = assets.open(«complite»)
При попытке найти функцию write какую-нибудь, мне предлагается только .bufferedReader() , либо не так открываю под запись, либо нужно в другое место класть, только вот куда — не знаю.
Отслеживать
8,354 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков
задан 25 авг 2022 в 22:25
Миша Вдовичев Миша Вдовичев
Источник: ru.stackoverflow.com
КАК ОТПРАВИТЬ ФАЙЛ НА СМАРТ ТВ БОКС СО СМАРТФОНА И ОБРАТНО. ОДИН ИЗ САМЫХ ПРОСТЫХ МЕТОДОВ
Особенности работы с файлами в приложениях на разных мобильных платформах
При разработке кросс-платформенного мобильного приложения, имеющего в своём функционале работу с файлами, встаёт вопрос об организации процессов работы с файлами на каждой платформе. С данным вопросом мы столкнулись при разработке новой версии Edusty, позволяющей делиться файлами со своими одногруппниками. В этой статье мы расскажем как происходит импорт и экспорт файлов в приложениях, работающих на операционных системах iOS, Android, Windows Phone.
iOS
В операционной системе iOS понятие файловая система скрыта для пользователя и взаимодействие с файлами осуществляется средствами самого приложения и только с файлами, расположенными в директории приложения. Импортировать файл в директорию приложения можно несколькими путями – с помощью iTunes File Sharing или регистрацией File Types для приложения.
При использовании iTunes File Sharing приложение будет отображено в iTunes в разделе «Общие файлы», где можно добавить файлы в приложение с компьютера. Файлы, добавленные таким способом, попадают в директорию /Documents приложения.
Приложение должно само контролировать эту директорию, на предмет появления новых файлов. Так же нужно иметь ввиду, что iTunes File Sharing фактически, открывает прямой доступ пользователю к документам, а это означает что файлы в данной директории в любой момент могут быть переименованы, удалены и т. д.
Как извлечь, редактировать, системные файлы и программы на Android? Легко!
Для использования iTunes File Sharing необходимо добавить флаг UIFileSharingEnabled (Application supports iTunes file sharing) в info.plist файл приложения.
UIFileSharingEnabled
При регистрации File Types, приложение появится в списке выбора для открытия файла, при нажатии на стандартное диалоговое меню “открыть с помощью”.
При открытии файла таким способом, его копия помещается в директорию /Documents/Inbox, а в приложении вызывается метод application:openURL:sourceApplication:annotation: протокола UIApplicationDelegate, в котором передаётся url открываемого файла.
Файлы в директории /Documents/Inbox можно читать и удалять, но нельзя изменять. Для изменения файл необходимо перенести в другую директорию, например в /Documents.
Для возможности импорта файлов данным способом необходимо добавить ключ CFBundleDocumentTypes (Document types) в info.plist файл приложения. Его значением является массив, каждый элемент которого словарь, используемый для описания каждого типа документа, поддерживаемого приложением. Полное описание возможных ключений и их значений можно найти в документации: developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
Получаем разрешение MANAGE_EXTERNAL_STORAGE для приложения
Безопасность данных в операционной системе является очень важной задачей, и Android здесь не является исключением. Так, Google в Android 10 добавили новый способ обеспечения безопасности, называемый хранилищем с ограниченной областью видимости (Scoped storage).
До Android 10 всё работало достаточно просто: приложение запрашивало доступ к хранилищу, используя одно из разрешений (WRITE_EXTERNAL_STORAGE либо READ_EXTERNAL_STORAGE), и, после того как пользователь предоставлял разрешение, приложение получало возможность прочесть и изменить практически любой файл, хранящийся на устройстве, за исключением системных файлов и папок, а также папок других приложений. Иначе говоря, приложение просто получало доступ ко всей файловой системе.
Scoped storage же изменил этот подход. Теперь приложение по умолчанию имеет доступ только к некоторым участкам памяти, где хранятся общедоступные файлы, такие как медиа, загруженные файлы, некоторые документы. При этом полный доступ приложение имеет только к тем файлам, которые находятся непосредственно в папке приложения, расположенной в Android/data/ . Если приложению нужно изменить или удалить файл, находящийся вне этой папки, то приложение должно запросить у пользователя разрешение на конкретную операцию с помощью MediaStore API (для медиа-файлов) или через Storage Access Framework (для всех остальных файлов). Однако этот способ очень неудобен, если мы разрабатываем файловый менеджер или приложение, которое должно работать не с медиа-файлами.
Scoped storage был добавлен в Android 10 как опциональная функция, которую легко можно было отключить, добавив в AndroidManifest.xml приложения строчку android_requestLegacyExternalStorage=»true» внутри элемента . Таким образом, можно было вернуть работу с файлами так, как было раньше. Однако, начиная с Android 11, использование Scoped storage стало обязательным. Безусловно, это улучшило безопасность и сохранность файлов в операционной системе, но и прибавило проблем разработчикам, заставив их пересмотреть принципы работы своих приложений с файловой системой.
Поскольку часть приложений всё же требует для своей работы полный доступ к хранилищу, а не ограниченный, Google добавили новое разрешение MANAGE_EXTERNAL_STORAGE для таких случаев. Это разрешение, как и раньше, позволяет получить доступ ко всей файловой системе, однако для его использования в приложении требуется подтверждение со стороны Google. В этой статье мы разберём, как использовать разрешение в приложении, а также рассмотрим процесс заполнения заявки в консоли Google Play.
Для начала создадим новый проект с пустой активностью. Для начала нам нужно определить в манифесте, что приложению нужны следующие разрешения для работы. Добавим их в файле AndroidManifest.xml.
android_name=»android.permission.WRITE_EXTERNAL_STORAGE» android_maxSdkVersion=»29″/> .
Поскольку MANAGE_EXTERNAL_STORAGE используется в обязательном порядке только начиная с API 30, то нам всё ещё нужно обрабатывать запрос разрешений на предыдущих версиях так, как мы это делали раньше. Для этого мы добавляем также WRITE_EXTERNAL_STORAGE, но ограничиваем его использование API 29. Таким образом, мы будем каждый раз проверять уровень API устройства и, в зависимости от этого, использовать либо старое разрешение, либо новое.
Как уже упоминалось выше, в случае с Android 10 для работы с файловой системой нам также нужно в манифесте добавить следующий флаг в элемент .
В файле разметки activity_main.xml добавим несколько элементов для тестирования:
Перейдём к написанию кода. Создадим класс PermissionUtils, в котором будет находиться проверка разрешений и их запрос.
public class PermissionUtils < public static boolean hasPermissions(Context context) < if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) < return Environment.isExternalStorageManager(); >else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) < return ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; >else < return true; >> public static void requestPermissions(Activity activity, int requestCode) < if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) < try < Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.addCategory(«android.intent.category.DEFAULT»); intent.setData(Uri.parse(String.format(«package:%s», activity.getPackageName()))); activity.startActivityForResult(intent, requestCode); >catch (Exception e) < Intent intent = new Intent(); intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); activity.startActivityForResult(intent, requestCode); >> else < ActivityCompat.requestPermissions(activity, new String[] < Manifest.permission.WRITE_EXTERNAL_STORAGE >, requestCode); > > >
Затем в классе активности MainActivity.java определим элементы из разметки.
Текстовое поле будет отображать, если у приложения необходимые разрешения. Для этого после объявления переменных добавим проверку.
tvPermission = findViewById(R.id.tvPermission); btnPermission = findViewById(R.id.btnPermission); if (PermissionUtils.hasPermissions(this)) tvPermission.setText(«Разрешение получено»); > else tvPermission.setText(«Разрешение не предоставлено»); >
Если запустить приложение сейчас, то у нас всегда будет выводиться сообщение о том, что разрешений нет, поскольку мы их пока что не запрашивали.
Добавим обработчик для кнопки, который будет отправлять запрос на предоставление разрешения.
Нам также необходимо задать код запроса, чтобы мы могли после определить, что ответ пришёл именно для этого запроса.
private TextView tvPermission; private Button btnPermission, btnOpenFile; private ImageView ivOpenedFile; private static final int PERMISSION_STORAGE = 101;
Когда пользователь нажмёт на кнопку, у него откроется новая активность с настройками приложения, в которой будет предложено дать полный доступ данному приложению. Пользователь может как согласиться, так и отклонить запрос.
Поскольку это также работает и для старых версий Android, то в случае с ними пользователю вместо активности будет предложен старый диалог с запросом на предоставление разрешений.
Любой результат действий пользователя в итоге возвращается в нашу активность. Поскольку для API 30 мы запускаем отдельную активность, то результат работы мы должны отслеживать в методе onActivityResult(). Переопределим его и добавим следующий код.
Здесь мы снова проверяем, дал ли пользователь разрешение или нет, и обновляем текстовое поле в соответствии с результатом.
Аналогичным образом проверяем результат операции для старых уровней API, но здесь уже переопределяем метод onRequestPermissionResult().
Теперь у нашего приложения есть полный доступ к файловой системе, и технически этого уже достаточно. Однако если попытаться опубликовать такое приложение в Google Play, то публикацию запретят по причине отсутствия заявки на получение доступа ко всем файлам. Поэтому, после того, как в консоли будет создан выпуск и загружена туда новая версия приложения, нам нужно перейти в раздел Контент приложения и выбрать там появившийся пункт Важные разрешения и API.
В появившейся форме требуется описать подробно, зачем приложению требуется доступ ко всем файлам, относится ли это к основному функционалу приложения, а также объяснить с технической точки зрения почему невозможно использовать в приложении альтернативные способы.
Также, в случае если показать работу приложения проще, чем объяснить, можно также записать демо-ролик работы приложения, загрузить его на Youtube и прикрепить в данной форме ссылку на видео. В некоторых случаях это может ускорить получение доступа.
Итак, заполнив форму и сохранив её, можно вернуться обратно в настройку выпуска и проверить его. Предупреждение об отсутствии заявки должно пропасть и мы может отправить выпуск на публикацию. В процессе публикации Google тщательно проверит приложении, чтобы убедиться, что доступ ко всем файлам действительно необходим приложению. Как показывает практика, для приложений, представляющих собой файловые менеджеры, заявку одобрят достаточно быстро.
Когда Google одобрил доступ для приложения, новая версия успешно публикуется, а в разделе Контент приложения указано разрешение, которое было одобрено.
Однако, Google также могут и не одобрить заявку, если посчитают, что это не является обязательной функцией или если можно ограничиться MediaStoreStorage Access Framework. Здесь может помочь изменение в работе приложения либо переоформление заявки, это нужно учитывать.
Таким образом, с помощью пары строк кода можно обновить своё приложения для работы с файловой системой на новых версиях Android.
Раздел: Кодинг Метки: Android, coding, file system, lesson, permission, storage
Получаем разрешение MANAGE_EXTERNAL_STORAGE для приложения : 9 комментариев
- Bober 08.01.2022 Офигенная статья, а как добавить запрос на доступ
прилодентт например в программе all editor?
Источник: android-tools.ru