Обрабатывать Uri без создания нового файла - PullRequest
0 голосов
/ 01 октября 2019

Библиотека, которую я использую, требует, чтобы я передал ей путь к файлу.

В настоящее время я использую Uri для создания нового файла (в AsyncTask), как показано ниже:

@Override
protected String doInBackground(Uri... params) {
    File file = null;
    int size = -1;
    try {
        try {
            if (returnCursor != null && returnCursor.moveToFirst()){
                int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
                size = (int) returnCursor.getLong(sizeIndex);
            }
        }
        finally {
            if (returnCursor != null)
            returnCursor.close();
        }

        if (extension == null){
            pathPlusName = folder + "/" + filename;
            file = new File(folder + "/" + filename);
        }else {
            pathPlusName = folder + "/" + filename + "." + extension;
            file = new File(folder + "/" + filename + "." + extension);
        }

        BufferedInputStream bis = new BufferedInputStream(is);
        FileOutputStream fos = new FileOutputStream(file);

        byte[] data = new byte[1024];
        long total = 0;
        int count;
        while ((count = bis.read(data)) != -1) {
            if (!isCancelled()) {
                total += count;
                if (size != -1) {
                    publishProgress((int) ((total * 100) / size));
                }
                fos.write(data, 0, count);
            }
        }
        fos.flush();
        fos.close();

    } catch (IOException e) {
        errorReason = e.getMessage();
    }
    return file.getAbsolutePath();
}

Как вы можете себе представить, это может занять некоторое время в зависимости от размера файла.

Вопрос

Есть ли способ получить доступ к файлу без необходимостичтобы создать / скопировать его?

* Я прочитал, что могу использовать ContentResolver и такие методы, как openInputStream() и openOutputStream(). Но это только даст мне поток и не решит проблему с необходимостью написать новый файл?


Дополнительная информация:

Я получаю Uri, передаваяпосле намерения:

intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);

Затем в onActivityResult я получаю Uri по телефону data.getData().


Пожалуйста, не предоставляйте мне такие решения, как this один. Я не хочу получать файл Uri из содержимого Uri, поскольку он ненадежен и некорректен.

1 Ответ

0 голосов
/ 01 октября 2019

Выглядит довольно ясно, что библиотека, которая не может обрабатывать схему контента, бесполезна, если у вас есть только схема контента.

Вы должны сделать копию контента в файле. Как и сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...