2017-01-24 8 views
0

Метод getStartOffset() не работает корректно после обновления условий сборки.
getStartOffset возвращает неправильное значение файла в папке с активами после обновления условий сборки

После фрагмента кода работал прекрасно, чтобы построить приложение с апи 19 (Android Plugin 1.5.0 + Gradle версия 2.2.1 ), но когда я пытаюсь сделать то же самое с апи 25 и другие строительные условия (Android Plugin 2.2.0 + Gradle версия 2.14.1), getStartOffset() возвращает значение большей длины файла. Возвращаемая длина верна. Фактически, чтение «png» -файла не является изображением, я дал ему расширение PNG в соответствии с требованиями aapt.

AssetFileDescriptor in = null; 
FileInputStream fin = null; 
FileChannel channel = null; 
try { 
     in = context.getAssets().openFd(file); // .png 
     fin = in.createInputStream(); 
     channel = fin.getChannel(); 
     int length = (int) in.getLength(); // channel.size(); 
     int offSet = (int) in.getStartOffset(); 
     MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 
     0, length + offSet); 
     ... 
     ... 
    } 

В чем проблема? Thnks

ответ

1

Это normal Поведение. Мне пришлось посмотреть содержимое APK file на хэш-редактор. К моему удивлению, мой PNG-файл появился дважды в APK-file: его первое смещение записи с начала было 52 байта, во втором случае startOffset был более 2 МБ. То есть StartOffset - это сдвиг в apk-package.

Волнение было напрасно. Все работает:

MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, offSet, length); 
int spos = 0; 
while(spos < length) { 
...... 
}