Как я могу использовать openRawResourcesFd ()?

1

У меня есть файлы в res/raw, которые я хотел бы открыть следующим образом:

AssetFileDescriptor afd = getResources().openRawResourcesFd();

Это позволяет, например, получить окончательный размер файла с помощью afd.getLength(), который InputStream.available() не обещает, даже если он, как правило, работает.

Однако, когда я пытаюсь это сделать, это терпит неудачу:

java.io.FileNotFoundException: этот файл нельзя открыть как файл дескриптор; он, вероятно, сжат

Это лишь небольшие текстовые файлы. В чем проблема?

Теги:
aapt

1 ответ

3
Лучший ответ

aapt сжимать большинство ресурсов как часть процесса сборки. Согласно этой статье, которая цитирует источник aapt, исключения следующие:

/* these formats are already compressed, or don't compress well */
static const char* kNoCompressExt[] = {
    ".jpg", ".jpeg", ".png", ".gif",
    ".wav", ".mp2", ".mp3", ".ogg", ".aac",
    ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
    ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
    ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
    ".amr", ".awb", ".wma", ".wmv"
};

Таким образом, один из способов обойти эту проблему - обмануть aapt, переименовав ваши файлы одним из этих расширений.

Это может показаться не очень удовлетворительным. Если вместо этого вы хотите добавить расширение в список исключений, вы можете отредактировать [sdk]/tools/ant/build.xml. Найдите файл для nocompress:

        <aapt executable="${aapt}"
                command="package"
                versioncode="${version.code}"
                versionname="${version.name}"
                debug="${build.is.packaging.debug}"
                manifest="${out.manifest.abs.file}"
                assets="${asset.absolute.dir}"
                androidjar="${project.target.android.jar}"
                apkfolder="${out.absolute.dir}"
                nocrunch="${build.packaging.nocrunch}"
                resourcefilename="${resource.package.file.name}"
                resourcefilter="${aapt.resource.filter}"
                libraryResFolderPathRefid="project.library.res.folder.path"
                libraryPackagesRefid="project.library.packages"
                libraryRFileRefid="project.library.bin.r.file.path"
                previousBuildType="${build.last.target}"
                buildType="${build.target}"
                ignoreAssets="${aapt.ignore.assets}">
            <res path="${out.res.absolute.dir}" />
            <res path="${resource.absolute.dir}" />
            <nocompress extension="txt"/>
            <!-- <nocompress /> forces no compression on any files in assets or res/raw -->
            <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
        </aapt>   

Комментарии внизу поясняются сами по себе. Я добавил исключение для txt. Обратите внимание, что вы также можете отключить сжатие.

В качестве альтернативы создайте специальное расширение:

<nocompress extension="nocomp"> 

И переименуйте свои файлы, например, whatever.txt.nocomp. Таким образом, вы можете оставить сжатие для всего, кроме отдельных файлов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню