Почему курица может продолжать бегать и прыгать, несмотря на то, что ее голову отрубают? Обратите внимание, что это не всегда всегда ; некоторые цыплята могут перестать двигаться немедленно, а другие могут продолжать работать в течение нескольких месяцев . Когда это происходит, это происходит, потому что это происходит. Означает ли это, что мы должны вырезать наши домашние животные?
Как разрезание наших питомцев с головой, использование освобожденной памяти - это плохая идея. Это не означает, что это приведет к отрицательным результатам; ваша программа может продолжать работать как ожидалось на вашем компьютере, в то время как if (fubar)
(где fubar является вашим недопустимым указателем) может быть достаточно, чтобы вызвать сбой вашей программы в других реализациях .
Эта идея свободы реализации для определения (или не) поведения формально известна как неопределенное поведение ; поведение не определено, поскольку стандарт C, набор документов, определяющий поведение C-реализации, не определяет поведение . Поэтому, как и резка наших домашних животных, мы должны избегать всех неопределенного поведения.
Я не нашел, как я могу получить файл из Uri.
blockquote>Нет файла.
ACTION_OPEN_DOCUMENT
иACTION_GET_CONTENT
не открывают файл. Они открывают документ. Этот документ может быть файлом. Возможно, это не так. ЭтоUri
может указывать на:
- Локальный файл на внешнем хранилище
- Локальный файл на внутренней памяти для другого приложения
- Локальный файл на съемном носителе
- Локальный файл, который зашифрован и нуждается в расшифровке на лету
- Поток байтов, хранящихся в столбце
BLOB
в базе данных- Часть содержимого, которое нужно загрузить другим приложением сначала
- ... и т. д.
Как я могу получить реальную путь к файлу?
blockquote>У вас нет.
Если вы хотите только принимать файлы, интегрируйте библиотеку выбора файлов вместо используя
ACTION_OPEN_DOCUMENT
илиACTION_GET_CONTENT
.Если вы используете
ACTION_GET_CONTENT
, а схемаUri
, которую вы получаете, этоfile
, тогдаgetPath()
будет файловым путем.В противном случае вам нужно понять, что вы не знаете, откуда документ выходит из , и перестать думать с точки зрения «реального пути к файлу». Используйте
ContentResolver
иopenInputStream()
илиDocumentFile.fromSingleUri()
или аналогичные методы для работы сUri
.