2016-02-20 4 views
4

je dois télécharger l'image du serveur et l'enregistrer dans le dossier, donc je me sers Retrofit 2.Rénovation 2 image télécharger et enregistrer dans le dossier

Le problème est que les images enregistrées est vide quand je cherche dans le dossier et J'ai essayé de déboguer et j'ai vu que Bitmap est nul.

Je ne comprends pas pourquoi, voici mon code:

@GET("images/{userId}/{imageName}") 
@Streaming 
Call<ResponseBody> downloadImage(@Path("userId") String userId, @Path("imageName") String imageName); 

Télécharger le code d'image:

private void downloadImage(final int position) { 
    String url = "htttp://myserver.com/"; 
     retrofitImage = new Retrofit.Builder() 
       .baseUrl(url) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

    imageApi = retrofitImage.create(BlastApiService.class); 

    String userId = feedList.get(position).getUserId(); 
    String fileName = feedList.get(position).getFile(); 

    Call<ResponseBody> imageCall = imageApi.downloadImage(userId, fileName); 
    imageCall.enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
      if(response.isSuccess()){ 
       String fileName = feedList.get(position).getFile(); 
       InputStream is = response.body().byteStream(); 
       Bitmap bitmap = BitmapFactory.decodeStream(is); 
       saveImage1(bitmap, fileName); 
      } else{ 
       try { 
        Log.d("TAG", "response error: "+response.errorBody().string().toString()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     @Override 
     public void onFailure(Call<ResponseBody> call, Throwable t) { 
      Log.d("TAG", "Image download error: " + t.getLocalizedMessage()); 
     } 
    }); 

} 

est ici méthode pour enregistrer l'image .

private void saveImage1(Bitmap imageToSave, String fileName) { 
    // get the path to sdcard 
    File sdcard = Environment.getExternalStorageDirectory(); 
    // to this path add a new directory path 
    File dir = new File(sdcard.getAbsolutePath() + "/FOLDER_NAME/"); 
    // create this directory if not already created 
    dir.mkdir(); 
    // create the file in which we will write the contents 
    File file = new File(dir, fileName); 
    try { 
     FileOutputStream out = new FileOutputStream(file); 
     imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out); 
     out.flush(); 
     out.close(); 
     counter++; 
     // if (counter < feedList.size()) { 
      //downloadImage(counter); 
     //} else { 
      setImage(); 
     //} 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

Pourquoi vous n'utilisez pas un ImageLoader dédié, dire Glide ou UIL? Juste curieux et essayant de comprendre le contexte. –

+0

String url = "htttp: //myserver.com/"; est faux! 3 t dans htttp. –

+0

@ElvisChweya Client veut que je télécharge des images dans un dossier, puis d'afficher à partir du dossier local au lieu d'utiliser le chargement d'image directement à partir du serveur. Étant donné que l'application ne dispose que d'une seule vue d'image et que l'API me renvoie 10 images, le client ne souhaite pas que l'utilisateur attende quelques secondes pour afficher l'image du serveur (images de 1 à 2 Mo). – Zookey

Répondre

1

Cela a fonctionné pour moi:

public static boolean writeResponseBody(ResponseBody body, String path) { 
    try { 

     File file = new File(path); 

     InputStream inputStream = null; 
     OutputStream outputStream = null; 

     try { 
      byte[] fileReader = new byte[4096]; 
      //long fileSize = body.contentLength(); 
      //long fileSizeDownloaded = 0; 

      inputStream = body.byteStream(); 
      outputStream = new FileOutputStream(file); 

      while (true) { 
       int read = inputStream.read(fileReader); 

       if (read == -1) { 
        break; 
       } 
       outputStream.write(fileReader, 0, read); 
       //fileSizeDownloaded += read; 
      } 

      outputStream.flush(); 

      return true; 
     } catch (IOException e) { 
      return false; 
     } finally { 
      if (inputStream != null) { 
       inputStream.close(); 
      } 

      if (outputStream != null) { 
       outputStream.close(); 
      } 
     } 
    } catch (IOException e) { 
     return false; 
    } 
} 

après appel cette méthode, vous pouvez obtenir une image de chemin:

boolean result = writeResponseBody(body, path); 
if(result) { 
    Bitmap bitmap = BitmapFactory.decodeFile(path) 
}