2017-01-04 3 views
0

Я выполнил инструкцию на странице «Дооснащение», чтобы загрузить изображение, однако без тега @Streaming входной поток (буфер) будет немедленно равен -1, показывая файл пустым. (изображение довольно мало, всего несколько сотен kb) Даже когда я использую тег @Streaming, приложение будет продолжать сбой, когда я использую входной поток из-за IllegalStateException.Загрузить изображения с помощью Retrofit return empty file

Я пробовал HttpConnection, и я мог загрузить изображение просто хорошо. Тем не менее, я действительно хочу, чтобы заставить его работать с Модернизированный

public static String downloadImage(String bearer, long pictureId,Context context){ 
    String path = ""; 
    NetworkAPI apiService = NetworkClient.getClient().create(NetworkAPI.class); 
    //Call<ResponseBody> downloadCall = apiService.downloadImage(bearer,pictureId); 
    Call<ResponseBody> downloadCall = apiService.downloadFileWithDynamicUrlSync("https://androidtutorialpoint.com/api/RetrofitAndroidImageResponse"); 

    try { 
     Response<ResponseBody> response = downloadCall.execute(); 
     if(response.isSuccessful()) { 

      Log.d(TAG, "success download" + response.body().string()); 

      Log.d("DownloadImage", "Reading and writing file"); 
      InputStream in = null; 
      OutputStream out = null; 

      try { 
       in = response.body().byteStream(); 


       File file = PictureUtil.createImageFile(context); 

       Uri photoURI = FileProvider.getUriForFile(context, 
         "vn.com.wk.bradleyaudit.fileprovider", 
         file); 

       out = new FileOutputStream(file); 


       long fileSize = response.body().contentLength(); 
       long downloadedSize = 0; 

       Log.d("DownloadImage", "size"+fileSize); 
       byte[] buffer = new byte[4096]; 

       while (true) { 
        int bufferLength = in.read(buffer); 
        Log.d("DownloadImage", "buffer Length"+bufferLength); 

        if (bufferLength == -1) { 
         break; 
        } 
        out.write(bufferLength); 
        out.write(buffer, 0, bufferLength); 
        downloadedSize += bufferLength; 

       } 

       out.flush(); 
       path = photoURI.toString(); 
       Log.d("DownloadImage", "path"+path); 
      } 
      catch (IOException e) { 
       Log.d("DownloadImage",e.toString()); 
      } 
      finally { 
       if (in != null) { 
        in.close(); 
       } 
       if (out != null) { 
        out.close(); 
       } 

      } 

     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return path; 

} 
+1

Почему вы используете модифицировать для изображений? Дооснащение - хороший выбор для клиентов api для отдыха, но для изображений скольжения или пикассо было бы лучше. –

+0

использовать picasso вместо retrofit – raj

+0

Я использую Glide для моего проекта. Однако я также хочу сохранить изображение во внутреннем хранилище (чтобы сделать это с помощью Glide или Picasso, мне нужно сохранить файл кеша после загрузки). Кроме того, я хочу выяснить, почему этот код не работает. Я не знаю, где я ошибся –

ответ

2

Попробуйте это,

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 

также добавить Зависимость от;

compile 'com.squareup.picasso:picasso:2.5.2' 

 Смежные вопросы

  • Нет связанных вопросов^_^