Как получить атрибуты файла из Uri или InputStream - PullRequest
0 голосов
/ 14 марта 2020

Я разрабатываю приложение Android, которое выдает намерение селектора файлов, чтобы пользователь мог выбрать один или несколько файлов.

Я получаю один или несколько файлов Uri и могу получить доступ к файлам через InputStream , полученный по телефону getBaseContext().getContentResolver().openInputStream(pUri). Используя этот InputStream, я могу читать файлы.

Я также хотел бы получить "Дата модификации файла". Обычно я получаю файл из Uri, затем использую

Files.getFileAttributeView(path, BasicFileAttributeView.class).readAttributes();

для получения даты модификации.

Этот метод работает, если файл находится в локальном хранилище приложения пользователя. Однако если файл находится во внешнем хранилище, например на SD-карте, вызов getAttribute ... вызывает исключение для файла, не найденного.

Есть ли способ, возможно, путем запроса преобразователя содержимого, получить дата изменения файла, если он находится во внешнем хранилище?

Просто к вашему сведению, что у меня действительно есть разрешение READ_EXTERNAL_STORAGE.

Вот как я выдаю намерение:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/jpeg");
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

        startActivityForResult(Intent.createChooser(intent, "Choose Photos"), RQS_GET_PHOTOS);

Вот как я обрабатываю результаты:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
                if (requestCode == RQS_GET_PHOTOS) {
                    //
                    // Get and process photo files
                    //         
                    ClipData clipData = data.getClipData();
                    Uri pUri = data.getData();
                    if (clipData == null && pUri == null) {  // Don't know if this can actually happen...
                        Toast.makeText(this, "No jpeg files selected", Toast.LENGTH_LONG).show();
                    } else if (clipData != null) {
                        // User selected multiple files
                        pData.clear();
                        for (int i = 0; i < clipData.getItemCount(); i++) {
                            ClipData.Item item = clipData.getItemAt(i);
                            Uri uri = item.getUri();
                            Photo photo = new Photo(getFileName(uri), uri, i);
                            pData.add(photo);
                        }
                    } else { // User only selected one file
                        Photo photo = new Photo(getFileName(pUri), pUri, 1);
                        pData.add(photo);
                    }

И здесь я пытаюсь получить дату изменения:

DocumentFile df = DocumentFile.fromSingleUri(this, iterPhoto.getUri());
                        Boolean x = df.exists();
                        Long fdate = df.lastModified();

Но, хотя "df" содержит данные, "x" является false и fdate равно 0;

...