Я не нашел, как я могу получить файл из 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
.
Чтение с управляющего терминального устройства:
read input </dev/tty
дополнительная информация: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected- петли [/ д2]
Попробуйте изменить петлю следующим образом:
for line in $(cat filename); do
read input
echo $input;
done
Единичный тест:
for line in $(cat /etc/passwd); do
read input
echo $input;
echo "[$line]"
done
Вы можете перенаправить стандартный stdin через модуль 3, чтобы сохранить его внутри конвейера:
{ cat notify-finished | while read line; do
read -u 3 input
echo "$input"
done; } 3<&0
Кстати, если вы действительно используете cat
таким образом, замените его перенаправлением и все становится еще проще:
while read line; do
read -u 3 input
echo "$input"
done 3<&0 <notify-finished
Или вы можете поменять stdin и unit 3 в этой версии - прочитать файл с блоком 3 и просто оставить stdin в покое:
while read line <&3; do
# read & use stdin normally inside the loop
read input
echo "$input"
done 3<notify-finished
Похоже, вы читаете дважды, чтение внутри цикла while не требуется. Кроме того, вам не нужно вызывать команду cat:
while read input
do
echo $input
done < filename
echo "Enter the Programs you want to run:"
> ${PROGRAM_LIST}
while read PROGRAM_ENTRY
do
if [ ! -s ${PROGRAM_ENTRY} ]
then
echo ${PROGRAM_ENTRY} >> ${PROGRAM_LIST}
else
break
fi
done