- Работа с файловой системой
- Чтение и сохранение файлов
- Как я могу получить путь к файлу на сырых ресурсах в Android Studio?
- 3 ответа
- Полный список
- Внутренняя память
- SD карта
- как получить путь к файлу с SD карты в Android
- 7 ответов
- Хранение и доступ к файлам с помощью Xamarin.Android
- Внутреннее и внешнее хранилище
- Работа с внутренним хранилищем
- Чтение или запись в файлы во внутреннем хранилище
- Использование Xamarin. Essentials — вспомогательные средства файловой системы
- Скрытие файлов из MediaStore
Работа с файловой системой
Чтение и сохранение файлов
Работа с настройками уровня activity и приложения позволяет сохранить небольшие данные отдельных типов (string, int), но для работы с большими массивами данных, такими как графически файлы, файлы мультимедиа и т.д., нам придется обращаться к файловой системе.
ОС Android построена на основе Linux. Этот факт находит свое отражение в работе с файлами. Так, в путях к файлам в качестве разграничителя в Linux использует слеш «/», а не обратный слеш «\» (как в Windows). А все названия файлов и каталогов являются регистрозависимыми, то есть «data» это не то же самое, что и «Data».
Приложение Android сохраняет свои данные в каталоге /data/data/ / и, как правило, относительно этого каталога будет идти работа.
Для работы с файлами абстрактный класс android.content.Context определяет ряд методов:
boolean deleteFile (String name) : удаляет определенный файл
String[] fileList () : получает все файлы, которые содержатся в подкаталоге /files в каталоге приложения
File getCacheDir() : получает ссылку на подкаталог cache в каталоге приложения
File getDir(String dirName, int mode) : получает ссылку на подкаталог в каталоге приложения, если такого подкаталога нет, то он создается
File getExternalCacheDir() : получает ссылку на папку /cache внешней файловой системы устройства
File getExternalFilesDir(String type) : получает ссылку на каталог /files внешней файловой системы устройства
File getFileStreamPath(String filename) : возвращает абсолютный путь к файлу в файловой системе
FileInputStream openFileInput(String filename) : открывает файл для чтения
FileOutputStream openFileOutput (String name, int mode) : открывает файл для записи
Все файлы, которые создаются и редактируются в приложении, как правило, хранятся в подкаталоге /files в каталоге приложения.
Для непосредственного чтения и записи файлов применяются также стандартные классы Java из пакета java.io.
Итак, применим функционал чтения-записи файлов в приложении. Пусть у нас будет следующая примитивная разметка layout:
Поле EditText предназначено для ввода текста, а TextView — для вывода ранее сохраненного текста. Для сохранения и восстановления текста добавлены две кнопки.
Теперь в коде Activity пропишем обработчики кнопок с сохранением и чтением файла:
При нажатии на кнопку сохранения будет создаваться поток вывода FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE)
В данном случае введенный текст будет сохраняться в файл «content.txt». При этом будет использоваться режим MODE_PRIVATE
Система позволяет создавать файлы с двумя разными режимами:
MODE_PRIVATE : файлы могут быть доступны только владельцу приложения (режим по умолчанию)
MODE_APPEND : данные могут быть добавлены в конец файла
Поэтому в данном случае если файл «content.txt» уже существует, то он будет перезаписан. Если же нам надо было дописать файл, тогда надо было бы использовать режим MODE_APPEND:
Для чтения файла применяется поток ввода FileInputStream :
Подробнее про использование потоков ввода-вывода можно прочитать в руководстве по Java: https://metanit.com/java/tutorial/6.3.php
В итоге после нажатия кнопки сохранения весь текст будет сохранен в файле /data/data/название_пакета/files/content.txt
Где физически находится созданный файл? Чтобы увидеть его на подключенном устройстве перейдем в Android Stud в меню к пункту View -> Tool Windows -> Device File Explorer
После этого откроектся окно Device File Explorer для просмотра файловой системы устройства. И в папке data/data/[название_пакета_приложения]/files мы сможем найти сохраненный файл.
Источник
Как я могу получить путь к файлу на сырых ресурсах в Android Studio?
Я использовал этот учебник, чтобы сделать некоторые обнаружения лиц на изображении. Проблема в том, когда я получаю путь к файлу, который используется на Java
Как я могу перевести на андроид студии. Я пытаюсь поместить мой lbpcascade_frontalface.xml на сырые ресурсы. CascadeClassifier — это класс, предоставляемый библиотекой opencv. Единственная проблема заключается в том, что они загружают только строку пути (в xmlfile). это мой код
Я перевел на такой метод, как этот.
Я получаю ошибку подтверждения от opencv, которая говорит мне, что файл пуст. Это означает, что я ошибся при использовании пути к файлу в моем методе. Как я могу получить путь к файлу на сырых ресурсах? помогите мне, пожалуйста, я застрял в течение нескольких дней
3 ответа
Как я могу получить путь к файлу на сырых ресурсах?
Ты не можешь Там нет пути. Это файл на вашей машине для разработки. Это не файл на устройстве. Вместо этого это запись в файле APK, которая является вашим приложением на устройстве.
Если ваша библиотека поддерживает InputStream вместо пути к файловой системе, getResources().openRawResource() в Context , чтобы получить InputStream для вашего необработанного ресурса.
Так я решил проблему с @CommonWare.
Я использую входной поток, чтобы получить файл
Так что файл будет открыт, и я сделаю точку в классе File
А затем я делаю поиск в файле пути, используя getAbsolutePath, как это
Взгляните на мой полный код
Используя это, вы можете получить доступ к файлу в необработанной папке, если вы хотите получить доступ к файлу в папке ресурсов, используйте этот URL .
Источник
Полный список
— работаем с файлами
Работа с файлами в Android не сильно отличается от таковой в Java. В этом уроке рассмотрим, как записать/прочесть файл во внутреннюю память и на SD-карту.
Project name: P0751_Files
Build Target: Android 2.3.3
Application name: Files
Package name: ru.startandroid.develop.p0751files
Create Activity: MainActivity
Рисуем экран main.xml:
4 кнопки, смысл которых понятен по тексту на них.
В onclick обрабатываем нажатия 4-х кнопок и вызываем соответствующие методы.
writeFile – запись файла во внутреннюю память. Используется метод openFileOutput, который на вход берет имя файла и режим записи: MODE_PRIVATE – файл доступен только этому приложению, MODE_WORLD_READABLE – файл доступен для чтения всем, MODE_WORLD_WRITEABLE — файл доступен для записи всем, MODE_APPEND – файл будет дописан, а не начат заново.
readFile – чтение файла из внутренней памяти. Используем метод openFileInput, принимающий на вход имя файла. Здесь и в методе записи внутреннего файла вы можете задать только имя файла, а каталог для ваших файлов вам уже выделен.
writeFileSD – запись файла на SD. Используем метод getExternalStorageState для получения состояния SD-карты. Здесь можно посмотреть какие бывают состояния. Нам нужно MEDIA_MOUNTED – когда SD-карта вставлена и готова к работе. Далее мы получаем путь к SD-карте (метод getExternalStorageDirectory), добавляем свой каталог и имя файла, создаем каталог и пишем данные в файл.
readFileSD – чтение файла с SD. Все аналогично предыдущему методу, только файл не пишем, а читаем.
Осталось в манифест добавить разрешение на работу с файлами на SD — android.permission.WRITE_EXTERNAL_STORAGE.
Все сохраним и запустим. Видим экран с 4-мя кнопками:
Внутренняя память
Жмем кнопку Записать файл. Видим в логе:
Проверим. Идем в File Explorer (Window > Show View > Other > Android > File Explorer) и открываем там папку data/data/ru.startandroid.develop.p0751files/files и видим там наш файл file.
Возвращаемся в эмулятор. Жмем Прочесть файл и в логе видим:
Это тот текст, который мы записывали в файл.
SD карта
Теперь жмем Записать файл на SD.
Файл записан на SD: /mnt/sdcard/MyFiles/fileSD
Проверяем. Идем в FileExplorer и открываем там папку mnt/sdcard/MyFiles/ а в ней файл fileSD.
Возвращаемся в эмулятор и жмем кнопку Прочесть файл с SD. В логе видим:
Содержимое файла на SD
Этот текст мы и записывали.
mnt/sdcard — обычно этот путь ведет к содержимому SD-карты. Возможно у вас он будет другой.
В общем, при работе с файлами на SD вы используете стандартные java механизмы. А при работе с внутренним хранилищем для удобства можно использовать методы-оболочки от Activity:
openFileOutput – открыть файл на запись
openFileInput – открыть файл на чтение
И есть метод getFilesDir – возвращает объект File, соответствующий каталогу для файлов вашей программы. Используйте его, чтобы работать напрямую, без методов-оболочек.
Подробности работы в java с файловой системой я здесь описывать не буду. На нашем форуме пользователь SKR сделал отличную памятку по работе с файлами. Скорее всего, вы найдете там все что нужно.
Если у вас проверка SD-карты показывает, что карта недоступна (см. лог), то убедитесь в свойствах AVD, что у вас для SDCard указан Size или File. Если указаны, то попробуйте перезапустить AVD.
На следующем уроке:
— создаем экран с вкладками
— используем иконку в названии вкладки
— используем обработчик перехода между вкладками
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
как получить путь к файлу с SD карты в Android
привет всем, у меня есть mp3-файлы на sd-карте. как получить путь к файлу mp3 песни с sd-карты.
пожалуйста, помогите мне.
7 ответов
Вы можете получить путь sdcard из этого кода:
затем укажите имя папки и имя файла
этот код помогает сделать это легко.
на самом деле в некоторых устройствах внешнее имя sdcard по умолчанию отображается как extSdCard, а для других-sdcard1. Этот фрагмент кода помогает узнать этот точный путь и помогает повторить путь внешнего устройства..
Environment.getExternalStorageDirectory() будет не обратный путь к микро SD карты памяти.
как получить путь к файлу с sd-карты в android
By sd-карта, я предполагаю, что вы имели в виду съемная карта micro SD.
на уровне API 19, т. е. В Android версии 4.4 Kitkat, они добавили File[] getExternalFilesDirs (String type) на Context класс, который позволяет приложениям хранить данные / файлы на картах micro SD.
Android 4.4 является первым выпуском платформы, которая фактически позволила приложениям использовать SD-карты для хранения. Любой доступ к SD-картам до уровень API 19 был через частные, неподдерживаемые API.
Environment.getExternalStorageDirectory() был с API уровень 1
getExternalFilesDirs(тип String) возвращает абсолютные пути к каталогам приложений на всех общих / внешних устройствах хранения данных. Это означает, что он вернет пути к как внутренняя, так и внешняя память. В общем,второй возвращается путь будет путь хранения для карты microSD (если есть).
но обратите внимание, что
общее хранилище не всегда может быть доступно, так как съемные носители могут быть выброшенным пользователем. Состояние носителя можно проверить с помощью getExternalStorageState(File) .
С этими файлами не обеспечивается безопасность. Например, любой приложения WRITE_EXTERNAL_STORAGE смогите написать к этим файлы.
внутренняя и внешняя память терминология согласно Google / официальные документы Android является совсем другое от того, что мы думаем.
Источник
Хранение и доступ к файлам с помощью Xamarin.Android
Распространенным требованием для приложений Android является работа с файлами — сохранение изображений, скачивание документов или экспорт данных для совместного использования с другими программами. Android (на основе Linux) поддерживает эти операции, предоставляя пространство для хранения файлов. Android группирует файловую систему в два разных типа хранилища.
- внутренняя служба хранилища — это часть файловой системы, доступ к которой может получить только приложение или операционная система.
- внешние служба хранилища — это раздел для хранения файлов, доступных для всех приложений, пользователя и, возможно, других устройств. На некоторых устройствах внешнее хранилище может быть съемным (например, SD-карта).
Эти группы существуют на понятийном уровне и не обязательно ссылаются на отдельный раздел или каталог на устройстве. Устройство Android всегда будет предоставлять раздел для внутреннего и внешнего хранилища. Некоторые устройства могут иметь несколько разделов, которые считаются внешним хранилищем. Независимо от раздела API для чтения, записи или создания файлов одинаковы. Существует два набора API, которые приложение Xamarin.Android может использовать для доступа к файлам.
- API-интерфейсы .NET (предоставленные Mono и Упакованные Xamarin. Android) — включают вспомогательные функции файловой системы , предоставляемые Xamarin. Essentials. API .NET обеспечивают лучшую совместимость с различными платформами, поэтому в данной статье мы сосредоточимся на этих API.
- Собственные API-интерфейсы доступа к файлам Java (предоставляемые Java и Упакованные Xamarin. Android) — Java предоставляет собственные API для чтения и записи файлов. Это полностью приемлемая альтернатива API .NET, но они относятся только к Android и не подходят для кросс-платформенных приложений.
В Xamarin.Android чтение и запись в файлы практически идентична этим процессам в любых других приложениях .NET. Приложение Xamarin.Android определяет путь к файлу, который будет обработан, а затем использует стандартные идиомы .NET для доступа к файлам. Так как фактические пути к внутреннему и внешнему хранилищу могут отличаться в зависимости от устройства или от версии Android, не рекомендуется жестко задавать путь к файлам. Вместо этого используйте API Xamarin.Android, чтобы определить путь к файлам. Таким образом, API .NET для чтения и записи файлов предоставляют собственные API Android, которые помогут определить путь к файлам во внутреннем и внешнем хранилище.
Прежде чем обсуждать API, участвующие в доступе к файлам, важно понять некоторые сведения о внутреннем и внешнем хранилище. О них мы поговорим в следующем разделе.
Внутреннее и внешнее хранилище
По сути, внутреннее хранилище и внешнее хранилище очень похожи — они являются местами, в которых приложение Xamarin. Android может сохранять файлы. Такое сходство может запутывать разработчиков, не знакомых с Android, так как неясно, когда приложение должно использовать внутреннее хранилище, а когда — внешнее.
Внутреннее хранилище относится к энергонезависимой памяти, которую Android выделяет операционной системе, APK и отдельным приложениям. Это пространство доступно только операционной системе или приложениям. Android выделит каталог в разделе внутреннего хранилища для каждого приложения. При удалении приложения все файлы, хранящиеся во внутреннем хранилище в этом каталоге, также будут удалены. Внутреннее хранилище лучше всего подходит для файлов, доступных только для приложения, которые не будут использоваться совместно с другими приложениями или будут почти бесполезными после удаления приложения. В Android 6.0 или более поздней версии для файлов во внутреннем хранилище может автоматически создаваться резервная копия с помощью Google с использованием функции автоматического резервного копирования в Android 6.0. Внутреннее хранилище имеет следующие недостатки.
- Невозможно предоставить общий доступ к файлам.
- Файлы будут удалены при удалении приложения.
- Пространство, доступное во внутренней памяти, может быть ограничено.
Внешнее хранилище относится к хранилищу файлов, которое не является внутренним хранилищем и доступно не только для приложения. Основное предназначение внешнего хранилища — предоставление места для размещения файлов для совместного использования приложениями или файлов слишком большого размера для внутреннего хранилища. Преимущество внешнего хранилища состоит в том, что оно предоставляет для файлов гораздо больше места, чем внутреннее хранилище. Однако внешнее хранилище не всегда присутствует на устройстве и может потребовать от пользователя специального разрешения для доступа к нему.
Для устройств, поддерживающих несколько пользователей, Android предоставит каждому пользователю собственный каталог как во внутреннем, так и во внешнем хранилище. Этот каталог недоступен для других пользователей на устройстве. Это разделение невидимо для приложений, если они не используют жестко запрограммированные пути к файлам во внутреннем или внешнем хранилище.
Как правило, приложения Xamarin.Android должны сохранять свои файлы во внутреннем хранилище, когда это разумно, и использовать внешнее хранилище, если файлы должны быть доступны другим приложениям, имеют большой размер или должны сохраняться даже при удалении приложения. Например, файл конфигурации лучше всего подходит для внутреннего хранилища, так как он важен только для приложения, которое его создает. Фотографии, напротив, лучше хранить во внешнем хранилище. Они могут быть очень большими, и часто пользователю может потребоваться предоставить или получить доступ к ним, даже если приложение удалено.
В этом руководстве основное внимание уделяется внутреннему хранилищу. Дополнительные сведения об использовании внешнего хранилища в приложении Xamarin.Android см. в разделе Внешнее хранилище.
Работа с внутренним хранилищем
Каталог внутреннего хранилища для приложения определяется операционной системой и предоставляется приложениям Android с помощью свойства Android.Content.Context.FilesDir . Будет возвращен объект Java.IO.File , представляющий каталог, выделенный Android исключительно для приложения. Например, для приложения с именем пакета com.companyname каталогом внутреннего хранилища может быть:
Этот документ будет ссылаться на внутренний каталог хранилища как на INTERNAL_STORAGE.
Точный путь к каталогу внутреннего хранилища может отличаться на разных устройствах и в разных версиях Android. По этой причине приложения не должны жестко кодировать путь к каталогу внутреннего хранилища файлов и вместо этого должны использовать интерфейсы API Xamarin.Android, например System.Environment.GetFolderPath() .
Чтобы максимально увеличить общий доступ к коду, приложения Xamarin.Android (или приложения Xamarin.Forms для Xamarin.Android) должны использовать метод System.Environment.GetFolderPath() . В Xamarin.Android этот метод возвращает строку для каталога, который находится в том же расположении, что и Android.Content.Context.FilesDir . Этот метод принимает перечисление, System.Environment.SpecialFolder , которое используется для определения набора перечислимых констант, представляющих пути специальных папок, используемых операционной системой. Не все значения System.Environment.SpecialFolder будут сопоставляться с допустимым каталогом в Xamarin.Android. В следующей таблице описано, каким может быть путь для заданного значения System.Environment.SpecialFolder :
System.Environment.SpecialFolder | путь |
---|---|
ApplicationData | INTERNAL_STORAGEи .config |
Desktop | INTERNAL_STORAGE/Desktop |
LocalApplicationData | INTERNAL_STORAGE/.local/share |
MyDocuments | INTERNAL_STORAGE |
MyMusic | INTERNAL_STORAGE/Мусик |
MyPictures | INTERNAL_STORAGE/пиктурес |
MyVideos | INTERNAL_STORAGE/видеос |
Personal | INTERNAL_STORAGE |
Fonts | INTERNAL_STORAGE/.Фонтс |
Templates | INTERNAL_STORAGE/темплатес |
CommonApplicationData | /usr/share |
CommonApplicationData | /usr/share |
Чтение или запись в файлы во внутреннем хранилище
Можно использовать любой API C# для записи в файл. Достаточно просто получить путь к файлу, который находится в каталоге, выделенном для приложения. Настоятельно рекомендуется использовать асинхронные версии API .NET, чтобы возникало меньше проблем с блокировкой основного потока в связи с доступом к файлу.
Этот фрагмент кода представляет один из примеров записи целого числа в текстовый файл в кодировке UTF-8 в каталоге внутреннего хранилища приложения:
Следующий фрагмент кода предоставляет один из способов чтения целочисленного значения, хранящегося в текстовом файле:
Использование Xamarin. Essentials — вспомогательные средства файловой системы
Xamarin.Essentials — это набор API для написания кода, совместимого с разными платформами. Вспомогательные функции файловой системы — это класс, который содержит ряд вспомогательных функций для упрощения поиска каталогов кэша и данных приложения. В этом фрагменте кода приведен пример того, как найти каталог внутреннего хранилища и каталог кэша для приложения:
Скрытие файлов из MediaStore
MediaStore — это компонент Android, который собирает метаданные о файлах мультимедиа (видео, музыка, изображения) на устройстве Android. Его цель — упростить совместное использование этих файлов во всех приложениях Android на устройстве.
Закрытые файлы не будут отображаться как общие мультимедиа. Например, если приложение сохраняет изображение в закрытом внешнем хранилище, сканер мультимедиа ( MediaStore ) не получит этот файл.
Общедоступные файлы будут доступны для MediaStore . Каталоги, имеющие нулевое имя файла в байтах . НОСИТЕЛЬ не будет проверяться .
Источник