改造API以检索png图像

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

Solutions Collecting From Web of "改造API以检索png图像"

如上所述,您不应该使用Retrofit实际下载图像本身。 如果您的目标是简单地下载内容而不显示内容,那么您可以简单地使用像OkHttp这样的Http客户端,这是Square的另一个库。

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

OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://sofzh.miximages.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下载图像