#android #file #csv #android-intent #filesystems
#Android #файл #csv #android-намерение #файловые системы
Вопрос:
Я использую этот код, чтобы позволить пользователю выбирать несколько файлов .csv из своего хранилища:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("text/comma-separated-values");
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(Intent.createChooser(intent, "Get CSV Files"), REQUEST_IMPORT_CSV);
После выбора файлов он переходит к onActivityResult() и до сих пор я делал:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_IMPORT_CSV:
if (data != null) {
ClipData clipData = data.getClipData();
ArrayList<Uri> csvUris = new ArrayList<>();
if (clipData != null) {
for (int i = 0; i < clipData.getItemCount(); i ) {
clipData.getItemAt(i).getText()
csvUris.add(clipData.getItemAt(i).getUri());
}
}
else {
csvUris.add(data.getData());
}
}
break;
}
}
- Это правильный способ получить все соответствующие URI из результата? Если кажется, что пользователь выбирает один файл, я получаю Uri из data.getData() , и если пользователь выбрал несколько файлов, то вместо этого он переходит прямо к этой функции ClipData() .
- Предполагая, что (1) верно, как мне получить имена файлов соответствующих файлов, которые выбрал пользователь? Например, «chosen_file.csv» (я не прошу указать путь).
Комментарии:
1. Имя файла является последним элементом в пути, если оно выбрано из основного или дополнительного хранилища.
Ответ №1:
Это правильный способ получить все соответствующие URI из результата?
АФАИК, да. По крайней мере, у меня это сработало.
как мне получить имена файлов соответствующих файлов, которые выбрал пользователь?
Строго говоря, вы этого не делаете. Uri
Указывать на файл не требуется, так же как URL-адрес этой веб-страницы не должен указывать на файл.
Что вы можете сделать, это обернуть Uri
в DocumentFile
, через fromSingleUri()
. Затем вызовите getName()
DocumentFile
, чтобы получить «отображаемое имя» для содержимого. В зависимости от того, откуда пользователь получил содержимое, это может быть значение, подобное имени файла. Предполагается, что это должно быть что-то узнаваемое пользователем. Однако не думайте, что это имя файла, так как это может быть что-то другое.
Комментарии:
1. Цель состоит в том, чтобы взять файл, выбранный пользователем, и посмотреть, действителен ли он (т. Е. Я требую, чтобы пользователь назвал файл определенным образом — например, он должен иметь форму «input_data.csv»)
2. @user7028276: Хм, ну, тогда вы не можете использовать платформу доступа к хранилищу. Добавьте библиотеку средств выбора файлов в свой проект и используйте ее. Это не позволит пользователю получить файл из произвольных мест на съемном носителе (поскольку у вас нет прямого доступа к файловой системе к нему) или от любых других поставщиков документов. Вашей альтернативой было бы исключить требование обязательного имени файла и сделать что-то еще, чтобы подтвердить, что файл является тем, что вы хотите.
3. «тогда вы не можете использовать платформу доступа к хранилищу» Почему бы и нет?
4. @user7028276: Потому что вы не можете получить имя файла из платформы доступа к хранилищу (
ACTION_OPEN_DOCUMENT
и kin), и вам нужно имя файла. Вы можете либо перестать запрашивать имя файла , либо прекратить его использованиеACTION_OPEN_DOCUMENT
.5. Есть ли какая-то ситуация, когда пользователь выбирает файл из своего собственного хранилища, используя
ACTION_OPEN_DOCUMENT
и код, который я написал выше вашеfromSingleUri()
предложение — и все же каким-то образом он не возвращает желаемое имя файла?