Проблемы с загрузкой изображений PNG в Android

У меня возникла проблема с загрузкой изображений PNG с моего сервера в приложение для Android. Проблема характерна для изображений PNG (JPG работает нормально), и проблема в том, что загруженные файлы являются поврежденными изображениями. Я объясню более подробно, ниже.

Сценарий:

Мне нужно загрузить изображения JPG и PNG с моего сервера и отобразить их пользователю приложения Android.

Проблема:

Изображения JPG загружаются без проблем. Но загруженные файлы PNG повреждены. Я дважды проверил источник изображений на моем сервере, и они правильные. Повреждены только загруженные файлы PNG. Итак, проблема, вероятно, заключается в том, как я загружаю их в Android.

Пример кода:

URL imageURL;
File imageFile = null;
InputStream is = null;
FileOutputStream fos = null;
byte[] b = new byte[1024];

try {
    // get the input stream and pass to file output stream
    imageURL = new URL(image.getServerPath());
    imageFile = new File(context.getExternalFilesDir(null), image.getLocalPath());
    fos = new FileOutputStream(imageFile);

    // get the input stream and pass to file output stream
    is = imageURL.openConnection().getInputStream();
    // also tried but gave same results :
    // is = imageURL.openStream();

    while(is.read(b) != -1)
        fos.write(b);

} catch (FileNotFoundException e) {
} catch (MalformedURLException e) {
} catch (IOException e) {
} finally {
    // close the streams
    try {
        if(fos != null)
            fos.close();
        if(is != null)
            is.close();
    } catch(IOException e){
    }
}

Любые указатели на то, как я могу работать над этим, будут очень признательны.

Примечание .

Поскольку это происходит в сервисе, внутри AsyncTask это не проблема.


person Rohitesh    schedule 04.03.2015    source источник
comment
вы должны напечатать Exceptions, чтобы идти дальше, что там случилось не так.   -  person Maveňツ    schedule 04.03.2015
comment
перепроверьте свой logcat на уровне предупреждения и опубликуйте журналы здесь   -  person RamBabu Pudari    schedule 04.03.2015
comment
Я думаю, проблема. это bcoz байта, который вы просто проверяете с ним .. надеюсь, что он работает   -  person Born To Win    schedule 04.03.2015
comment
@maven: никаких проблем с исключениями. Никаких исключений при загрузке файлов.   -  person Rohitesh    schedule 04.03.2015
comment
@Ram: предупреждений logcat тоже нет   -  person Rohitesh    schedule 04.03.2015
comment
@BornToWin: я не понял твоего предложения. Не могли бы вы указать более подробную информацию?   -  person Rohitesh    schedule 04.03.2015


Ответы (1)


Проблема здесь

 while(is.read(b) != -1)
        fos.write(b);

Это неправильно, потому что на каждой итерации он будет записывать в файл полный буфер (1024 байта). Но предыдущий read мог прочитать меньше байтов, чем чем (почти наверняка в последнем цикле, если только длина изображения не кратна 1024). Вы должны проверять, сколько байтов было прочитано каждый раз, и записывать это количество байтов.

 int bytesRead;
 while( (bytesRead = is.read(b)) != -1)
        fos.write(b,0,bytesRead );

Ваша ошибка заставляет вас писать всегда файлы с размерами, кратными 1024 - что, конечно, в общем случае не так. Теперь то, что происходит, когда изображение сохраняется с дополнительными байтами в конце, зависит от формата и от программы чтения изображений. В некоторых случаях это может сработать. Тем не менее, это неправильно.

Кстати: никогда не глотайте исключения - даже если это не проблема сегодня, это может быть завтра, и вы можете часами искать проблему.

person leonbloy    schedule 04.03.2015
comment
Благодарю вас! Это решило проблему! Извиняюсь за задержку с возвращением и проверкой здесь, так как я кое-что нагнал! - person Rohitesh; 23.04.2015