2017-01-09 1 views
1

Ich verwende Picasso 2.5.2 in meiner Anwendung. Es funktioniert gut, kann aber keine Bilder von einem der Drittanbieterserver laden. Wenn ich versuche, Bilder von dieser Seite zu laden, bekomme ich diesen Fehler:Picasso: UnknownServiceException: CLEARTEXT-Kommunikation nicht für Client aktiviert

java.net.UnknownServiceException: CLEARTEXT communication not enabled for client 
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:98) 
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:196) 
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:132) 
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:101) 
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179) 
at okhttp3.RealCall.execute(RealCall.java:63) 
at com.jakewharton.picasso.OkHttp3Downloader.load(OkHttp3Downloader.java:136) 
at com.squareup.picasso.NetworkRequestHandler.load(NetworkRequestHandler.java:47) 
at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:206) 
at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818) 
at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411) 

Wenn ich dieses Bild im Browser öffnen, wird es erfolgreich geladen. URL sieht wie http://somesite.com/path/to/file/123456.jpg aus. Ist es Picasso-Käfer? Wie man es repariert?

Antwort

3

Is it Picasso bug?

Ich denke nicht. OkHttp scheint die Nicht-SSL-Kommunikation standardmäßig zu blockieren. Ich habe seit Jahren keine Klartext-HTTP-Anfrage mit OKHttp gemacht, aber das ist, was ich von meiner Untersuchung des Codes sehe, der sich auf diese Fehlermeldung bezieht.

How to fix it?

Verwenden Sie eine https URL.

Wenn einige teuflischen Verrückten eine kleine Stadt zu sprengen droht, es sei denn, Sie schlicht http verwenden, konfigurieren Sie die OkHttpClient über seine Builder, darunter ein Aufruf an connectionSpecs(), um anzuzeigen, welche Art von HTTP-Verbindungen, die Sie bereit sind, zu unterstützen. Zum Beispiel:

.connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

erlauben würde, "moderne TLS" (nicht genau sicher, was qualifiziert) und Plain-HTTP.

Dann verwenden Sie das OkHttpClient für Picasso, sowie für alles, was Sie tun, direkt OkHttp verwenden.

1

Ich habe Ihre Probleme gesucht. Und ich denke, Sie haben ein Problem mit okhttp3 wie das Problem bei https://github.com/fabric8io/kubernetes-client/issues/498 - Problem mit der Authentifizierung Verbindung. Sie können versuchen, durch Gewohnheit Ihre Downloader von Picasso zu umgehen, indem:

// create Picasso.Builder object 
Picasso.Builder picassoBuilder = new Picasso.Builder(context); 

// let's change the standard behavior before we create the Picasso instance 
// for example, let's switch out the standard downloader for the OkHttpClient 
picassoBuilder.downloader(new OkHttpDownloader(new OkHttpClient())); 
// or you can try 

(picassoBuilder.downloader( 
    new OkHttpDownloader(
     UnsafeOkHttpClient.getUnsafeOkHttpClient() 
    ) 
);) 

// Picasso.Builder creates the Picasso object to do the actual requests 
Picasso picasso = picassoBuilder.build(); 

Jetzt können Sie Ihren picasso verwenden, um das Bild zu laden.

picasso 
    .load(linktoimage) 
    .into(imageView3); 
+1

Bedenken Sie, dass die 'UnsafeOkHttpClient'-Implementierung, die sich im Internet befindet, ein Sicherheits-Desaster ist und Sie aus dem Play Store verbannt. Verwenden Sie keinen Code, der blind alle SSL-Zertifikate akzeptiert. – CommonsWare

+1

Ich entdecke nur dein Problem. Ich denke, Problem mit Verbindung okhttp. Wenn Sie das Problem herausfinden, teilen Sie Ihre Lösung (Sie können versuchen mit Lösung für @CommonsWare). Vielen Dank. –