Получение одного или нескольких файлов из onActivityResult Intent и их имен файлов?

#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;
    }
}
 
  1. Это правильный способ получить все соответствующие URI из результата? Если кажется, что пользователь выбирает один файл, я получаю Uri из data.getData() , и если пользователь выбрал несколько файлов, то вместо этого он переходит прямо к этой функции ClipData() .
  2. Предполагая, что (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() предложение — и все же каким-то образом он не возвращает желаемое имя файла?