改造API以检索png图像

嗨,我是Android的Retrofit框架的新手。 我可以使用它从REST服务获得JSON响应,但我不知道如何使用改造下载png。 我想从这个url下载png: http : //wwwns.akamai.com/media_resources/globe_emea.png 。 什么应该响应在Callback 中指定Object来实现这一点。

  • 如何在从站点下载和解析XML文件时一起使用Retrofit和SimpleXML?
  • 如何抓取JSON数组并使用gson解析每个json对象? (改型)
  • HTTP GET请求正文RETROFIT
  • 改造路径替换:替换整个路径(包括/)
  • 使用改造使用参数发送发布请求
  • Retrofit - Okhttp客户端如何缓存响应
  • 在主线程上进行回调
  • 启用ProGuard时,改装2不发送数据
  • 如上所述,您不应该使用Retrofit实际下载图像本身。 如果您的目标是简单地下载内容而不显示内容,那么您可以简单地使用像OkHttp这样的Http客户端,这是Square的另一个库。

    这里有几行代码可以下载这个图像。 然后,您可以从InputStream中读取数据。

    OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://img.androidcookie.com/android/globe_emea.png") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { System.out.println("request failed: " + e.getMessage()); } @Override public void onResponse(Response response) throws IOException { response.body().byteStream(); // Read the data from the stream } }); 

    即使Retrofit不是回答您问题的工作人员,您的接口定义的签名也会如此。 但是再次不要这样做。

     public interface Api { @GET("/media_resources/{imageName}") void getImage(@Path("imageName") String imageName, Callback callback); } 

    当然我们通常使用Picasso来加载图像,但有时我们确实需要使用Retrofit来加载特殊图像(比如获取validation码图像),你需要为请求添加一些标题,从响应的标题中获取一些值(当然你可以也使用Picasso + OkHttp,但在一个项目中你已经使用Retrofit来处理大多数网络请求),所以这里介绍如何通过Retrofit 2.0.0实现(我已经在我的项目中实现)。

    关键是你需要使用okhttp3.ResponseBody来接收响应,否则Retrofit会将响应数据解析为JSON,而不是二进制数据。

    代码:

     public interface Api { // don't need add 'Content-Type' header, it's useless // @Headers({"Content-Type: image/png"}) @GET Call fetchCaptcha(@Url String url); } Call call = api.fetchCaptcha(url); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { if (response.body() != null) { // display the image data in a ImageView or save it Bitmpa bm = BitmapFactory.decodeStream(response.body().byteStream()); ivCaptcha.setImageBitmap(bm); } else { // TODO } } else { // TODO } } @Override public void onFailure(Call call, Throwable t) { // TODO } }); 

    Retrofit是一个REST库,你只能使用Retrofit来获取图像URL但是为了显示Image你应该使用Picasso: http : //square.github.io/picasso/

    声明它返回Call for instance:

     @GET("/api/{api}/bla/image.png") Call retrieveImageData(); 

    然后自己将其转换为Bitmap:

     ResponseBody body = retrofitService.retrieveImageData().execute().body(); byte[] bytes = body.bytes(); Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

    您还可以使用Retrofit执行@GET并返回Response 。 然后在代码中,您可以执行isr = new BufferedInputStream(response.getBody().in())来获取图像的输入流并将其写入Bitmap,例如,通过执行BitmapFactory.decodeStream(isr)

    我希望以下代码可以帮助您:

    MainActivity.java包含以下函数:

     void getRetrofitImage() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build(); RetrofitImageAPI service = retrofit.create(RetrofitImageAPI.class); Call call = service.getImageDetails(); call.enqueue(new Callback() { @Override public void onResponse(Response response, Retrofit retrofit) { try { Log.d("onResponse", "Response came from server"); boolean FileDownloaded = DownloadImage(response.body()); Log.d("onResponse", "Image is downloaded and saved ? " + FileDownloaded); } catch (Exception e) { Log.d("onResponse", "There is an error"); e.printStackTrace(); } } @Override public void onFailure(Throwable t) { Log.d("onFailure", t.toString()); } }); } 

    以下是图像的文件处理代码:

     private boolean DownloadImage(ResponseBody body) { try { Log.d("DownloadImage", "Reading and writing file"); InputStream in = null; FileOutputStream out = null; try { in = body.byteStream(); out = new FileOutputStream(getExternalFilesDir(null) + File.separator + "AndroidTutorialPoint.jpg"); int c; while ((c = in.read()) != -1) { out.write(c); } } catch (IOException e) { Log.d("DownloadImage",e.toString()); return false; } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } int width, height; ImageView image = (ImageView) findViewById(R.id.imageViewId); Bitmap bMap = BitmapFactory.decodeFile(getExternalFilesDir(null) + File.separator + "AndroidTutorialPoint.jpg"); width = 2*bMap.getWidth(); height = 6*bMap.getHeight(); Bitmap bMap2 = Bitmap.createScaledBitmap(bMap, width, height, false); image.setImageBitmap(bMap2); return true; } catch (IOException e) { Log.d("DownloadImage",e.toString()); return false; } } 

    这是使用Android Retrofit 2.0完成的。 我希望它对你有帮助。

    来源: 使用Retrofit 2.0下载图像