Verwenden Sie die Nachrüstung, um die Bilddatei herunterzuladen

Ich benutze Retrofit 1.6.0 auf meinem Android-Projekt,

Die anfrage url:

  • Legen Sie Margin in Stil und wenden Sie diesen Stil auf TextView programmgesteuert an
  • Verbergen Sie die Zeit in der Android-Benachrichtigung, ohne benutzerdefiniertes Layout zu verwenden
  • Android Bluetooth-Socket-Tutorial für nicht blockierende Kommunikation
  • Aufruf von DeleteLocalRef in Java native Schnittstelle
  • Android-Dialogbreite
  • CoordinatorLayout und AppBarLayout Höhe
  • Https://example.com/image/thumbs/filename/sample.png

    Meine Schnittstelle wie folgt:

    public interface ImageService { @GET("/image/thumbs/filename/{filename}") @Streaming void getThumbs( @Path("filename") String filename, Callback<Response> callback ); } 

    HTTP-Anforderung war Erfolg, aber da ist ein Fehler aufgetreten

     D/Retrofit(27613): ---> HTTP GET https://example.com/image/thumbs/filename/sample.png D/Retrofit(27613): ---> END HTTP (no body) D/Retrofit(27613): <--- HTTP 200 https://example.com/image/thumbs/filename/sample.png (451ms) D/Retrofit(27613): : HTTP/1.1 200 OK D/Retrofit(27613): Connection: Keep-Alive D/Retrofit(27613): Content-Disposition: inline; filename="sample.png" D/Retrofit(27613): Content-Type: image/png; charset=binary D/Retrofit(27613): Date: Wed, 11 Jun 2014 06:02:31 GMT D/Retrofit(27613): Keep-Alive: timeout=5, max=100 D/Retrofit(27613): OkHttp-Received-Millis: 1402466577134 D/Retrofit(27613): OkHttp-Response-Source: NETWORK 200 D/Retrofit(27613): OkHttp-Sent-Millis: 1402466577027 D/Retrofit(27613): Server: Apache/2.2.22 (Ubuntu) D/Retrofit(27613): Transfer-Encoding: chunked D/Retrofit(27613): X-Powered-By: PHP/5.4.28-1+deb.sury.org~precise+1 D/Retrofit(27613): ---- ERROR https://example.com/image/thumbs/filename/sample.png D/Retrofit(27613): java.io.UnsupportedEncodingException: binary D/Retrofit(27613): at java.nio.charset.Charset.forNameUEE(Charset.java:322) D/Retrofit(27613): at java.lang.String.<init>(String.java:228) D/Retrofit(27613): at retrofit.RestAdapter.logAndReplaceResponse(RestAdapter.java:478) D/Retrofit(27613): at retrofit.RestAdapter.access$500(RestAdapter.java:109) D/Retrofit(27613): at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:333) D/Retrofit(27613): at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220) D/Retrofit(27613): at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278) D/Retrofit(27613): at retrofit.CallbackRunnable.run(CallbackRunnable.java:42) D/Retrofit(27613): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) D/Retrofit(27613): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) D/Retrofit(27613): at retrofit.Platform$Android$2$1.run(Platform.java:142) D/Retrofit(27613): at java.lang.Thread.run(Thread.java:841) D/Retrofit(27613): Caused by: java.nio.charset.UnsupportedCharsetException: binary D/Retrofit(27613): at java.nio.charset.Charset.forName(Charset.java:309) D/Retrofit(27613): at java.nio.charset.Charset.forNameUEE(Charset.java:320) D/Retrofit(27613): ... 11 more D/Retrofit(27613): ---- END ERROR 

    Wie kann ich dieses Problem lösen?

  • Wie gebe ich einen Kontext an eine AsyncTask?
  • Gibt es Glide, um jede Bildanforderung aufzurufen? Recyclerview Lasten sind sehr langsam beim Scrollen
  • Wie kann ich wissen, ob der Benutzer den Status der Toggle-Taste geändert hat?
  • Wie kann ich den Google Play Store direkt aus meiner Android Applikation öffnen?
  • Laden von Telefonkontakten in aufsteigender Reihenfolge
  • Ein billiger / schneller Weg zu Hash-Bitmaps?
  • 4 Solutions collect form web for “Verwenden Sie die Nachrüstung, um die Bilddatei herunterzuladen”

    Das Problem ist der Inhalt-Typ-Header auf die Antwort enthält einen gefälschten Zeichensatz:

     Content-Type: image/png; charset=binary 

    Retrofit sieht dies und sorgt dafür, dass die Antwort Text ist, den es melden kann. Sie sollten das Problem dem Server-Administrator melden.

    Wenn Sie das Problem an Retrofits Issue Tracker auf GitHub melden, können wir uns wahrscheinlich von diesem Problem erholen, anstatt zu stürzen.

    Ich spiele mit rxjava und nachträglich in diesen Tagen, ich habe eine kurze Demo hier. Talk ist billig, zeig dir meinen Code direkt, hoffe es hilft.

     public interface ImageService { String ENDPOINT = "HTTP://REPLACE.ME"; @GET @Streaming Observable<Bitmap> getThumbs(@Url String filepath); /******** * Helper class that sets up a new services *******/ class Instance { static ImageService instance; public static ImageService get() { if (instance == null) instance = newImageService(); return instance; } public static ImageService newImageService() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(ImageService.ENDPOINT) .addConverterFactory(BitmapConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); return retrofit.create(ImageService.class); } } } 

    Und ich habe meine eigene BitmapConverterFactory geschrieben, um Byte Stream in Bitmap zu konvertieren:

     public final class BitmapConverterFactory extends Converter.Factory { public static BitmapConverterFactory create() { return new BitmapConverterFactory(); } private BitmapConverterFactory() { } @Override public Converter<ResponseBody, Bitmap> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { if (type == Bitmap.class) { return new Converter<ResponseBody, Bitmap>(){ @Override public Bitmap convert(ResponseBody value) throws IOException { return BitmapFactory.decodeStream(value.byteStream()); } }; } else { return null; } } @Override public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { return null; } } 

    Gradle Abhängigkeiten hier:

     final RETROFIT_VERSION = '2.0.0-beta3' compile "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION" compile "com.squareup.retrofit2:adapter-rxjava:$RETROFIT_VERSION" 

    Cheers, vanvency

    Natürlich verwenden wir gewöhnlich Picasso, um das Bild zu laden, aber manchmal brauchen wir wirklich Gebrauch Retrofit, um ein spezielles Bild zu laden (wie ein Captcha-Bild zu holen), du musst einen Header für die Anfrage hinzufügen, bekommst einen Wert von Header der Antwort (natürlich kannst du Nutzen Sie auch Picasso + OkHttp, aber in einem Projekt haben Sie bereits Retrofit benutzt, um die meisten Netzanforderungen zu verarbeiten), also hier bei der Implementierung von Retrofit 2.0.0 (habe ich bereits in meinem Projekt implementiert).

    Der entscheidende Punkt ist, dass Sie Gebrauch brauchen okhttp3.ResponseBody , um Antwort zu empfangen, sonst Retrofit analysiert die Antwortdaten als JSON, nicht binäre Daten.

    Codes:

     public interface Api { // don't need add 'Content-Type' header, it not works for Retrofit 2.0.0 // @Headers({"Content-Type: image/png"}) @GET Call<ResponseBody> fetchCaptcha(@Url String url); } Call<ResponseBody> call = api.fetchCaptcha(url); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> 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<ResponseBody> call, Throwable t) { // TODO } }); 

    Ein anderer Weg ist, um die vollständige Protokollierung auszuschalten, so dass die Retrofit.RestAdapter.logAndReplaceResponse nicht versuchen, die Antwort Körper zu konsumieren

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.