В моем приложении есть несколько вещей, которые используют обычные файлы (аудио, изображения, видео и т. д.).
Но поскольку я упаковываю эти файлы в коллекции, я не могу просто передать их подпрограммам, использующим файлы. (На самом деле я передаю пути или строки путей, поэтому мне придется это изменить, но некоторые вещи, использующие файлы, являются кодом библиотеки)
Что мне нужно сделать, это передать им файл, который на самом деле только просмотр файла внутри «файла коллекции». (поэтому чтение должно быть ограничено только интервалом внутри файла)
Есть ли что-нибудь в котлине или Java, что могло бы расставить точки для меня? в основном я передаю начало и конец или длину и файл, и он возвращает файл, который для всех практических целей выглядит так, как будто этот фрагмент файла является реальным файлом? Это все только для чтения.
Чего я не хочу, так это записывать файл во временный файл и загружать его. Это бессмысленно и является пустой тратой времени и долговечности.
Я думаю, что мне, возможно, придется расширить File, но надеюсь, что это уже сделано. Однако я ничего не могу найти.
Чтобы внести ясность:
mFileDescriptor = MemoryFileUtil.getParcelFileDescriptor(file!!)
выдает java.lang.ExceptionInInitializerError
Вызвано: java.lang.RuntimeException: java.lang.NoSuchMethodException: android.os.MemoryFile.getParcelFileDescriptor []
Если я записываю файл в файл tmp, все работает нормально. Я пробовал
mFileDescriptor = ParcelFileDescriptor.fromFd(file!!.fd.toInt())
mFileDescriptor = ParcelFileDescriptor.dup(file!!.fd)
использует getFileDescriptor в MemoryFile, но это тоже не удается.
и другие, которые пытаются получить файл MemoryFile. дескриптор, использующий отражение. Ошибка бесполезна для объяснения того, что на самом деле происходит, но, похоже, она связана с тем, что дескриптор либо недействителен, либо ParcelFileDescriptor не работает с MemoryFile.
Даже если я получу то, что кажется быть действительным файловым дескриптором, тогда
PdfRenderer(mFileDescriptor!!)
выдает исключение java.io.IOException: файл не в формате PDF или поврежден
Я не знаю, почему он выдает эту ошибку, поскольку, если я сохраню файл напрямую, я смогу его открыть.
Либо дескриптор неверно, или файл памяти не является достаточно реальным файлом, чтобы пройти тест PDF.
Код: Выделить всё
final long size;
try {
Os.lseek(input.getFileDescriptor(), 0, OsConstants.SEEK_SET);
size = Os.fstat(input.getFileDescriptor()).st_size;
} catch (ErrnoException ee) {
throw new IllegalArgumentException("file descriptor not seekable");
}
mInput = input;
synchronized (sPdfiumLock) {
mNativeDocument = nativeCreate(mInput.getFd(), size);
Похоже, проблема в том, что PdfRenderer просто не работает с MemoryFile.
Подробнее здесь: https://stackoverflow.com/questions/792 ... mappedfile
Мобильная версия