2014-05-09 6 views
9

Hallo, ich benutze die Picasso-Bibliothek, um die Bilder von der URL herunterzuladen.Unterstützt Picasso nicht das Herunterladen von Bildern, die das https-Protokoll verwenden

URL: https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/t1.0-1/s200x200/1472865_191408954385576_14109897_n.jpg

URL wird mit https-Protokoll, hier ist es nicht für mich arbeiten, um die Bilder von https-Protokoll zum Download Picasso verwenden.

Unterstützt es nicht, die Bilder herunterzuladen, die HTTPS-Protokoll verwendet, funktionierte es für mich nur, wenn ich http-Proctocol verwende?

Hier Ich versuche, Bitmap zu erhalten, welches Protokoll https wird

com.squareup.picasso.Target target = new com.squareup.picasso.Target() { 

@Override 
public void onBitmapLoaded(Bitmap bitmap, LoadedFrom loadedFrom) { 
    userProfile.setBitmap(bitmap); 
    // call the Web API to register the walker here 
    new AudioStreetAsyncTask(getActivity(), userProfile, getString(R.string.registration_processing_message), new TaskCompleteListener() { 
     @Override 
     public void onTaskCompleted(String jsonResponse) { 
      Log.d(TAG, jsonResponse); 
     } 
    }); 
} 

@Override 
public void onBitmapFailed(Drawable drawable) { 
    userProfile.setBitmap(null); 
    // call the Web API to register the walker here 
    new AudioStreetAsyncTask(getActivity(), userProfile, getString(R.string.registration_processing_message), new TaskCompleteListener() { 
     @Override 
     public void onTaskCompleted(String jsonResponse) { 
      Log.d(TAG, jsonResponse); 
     } 
    }).execute(); 
} 

@Override 
public void onPrepareLoad(Drawable drawable) {} 
}; 

Picasso.with(getActivity()).load(imgUrl.toString()).into(target); 

Jede Idee?

+0

können Sie Abstimmung bitte und meine Lösung akzeptieren So korrekt wie aktuell und die Lösung von nexus700120 ist veraltet. –

Antwort

25

Verwenden diese Abhängigkeiten in Ihrem Gradle:

compile 'com.squareup.okhttp:okhttp:2.2.0' 
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0' 
compile 'com.squareup.picasso:picasso:2.4.0' 

Und diese Klasse statt der ursprünglichen Picasso Klasse

Picasso Klasse:

public class PicassoTrustAll { 

    private static Picasso mInstance = null; 

    private PicassoTrustAll(Context context) { 
     OkHttpClient client = new OkHttpClient(); 
     client.setHostnameVerifier(new HostnameVerifier() { 
      @Override 
      public boolean verify(String s, SSLSession sslSession) { 
       return true; 
      } 
     }); 
     TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
      @Override 
      public void checkClientTrusted(
        java.security.cert.X509Certificate[] x509Certificates, 
        String s) throws java.security.cert.CertificateException { 
      } 

      @Override 
      public void checkServerTrusted(
        java.security.cert.X509Certificate[] x509Certificates, 
        String s) throws java.security.cert.CertificateException { 
      } 

      @Override 
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
       return new java.security.cert.X509Certificate[] {}; 
      } 
     } }; 
     try { 
      SSLContext sc = SSLContext.getInstance("TLS"); 
      sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
      client.setSslSocketFactory(sc.getSocketFactory()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     mInstance = new Picasso.Builder(context) 
       .downloader(new OkHttpDownloader(client)) 
       .listener(new Picasso.Listener() { 
        @Override 
        public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { 
         Log.e("PICASSO", exception); 
        } 
       }).build(); 

    } 

    public static Picasso getInstance(Context context) { 
     if (mInstance == null) { 
      new PicassoTrustAll(context); 
     } 
     return mInstance; 
    } 
} 

Anwendungsbeispiel:

PicassoTrustAll.getInstance(context) 
       .load(url) 
       .into(imageView); 
+1

onlñy Lösung, die tatsächlich funktioniert – desgraci

+0

vielen Dank !!! – stoefln

+0

Es funktioniert nur gut mit diesen Abhängigkeiten http://stackoverflow.com/a/28251889/1364896 –

2
final OkHttpClient client = new OkHttpClient.Builder() 
        .protocols(Collections.singletonList(Protocol.HTTP_1_1)) 
        .build(); 

      Picasso picasso = new Picasso.Builder(mContext) 
        .downloader(new OkHttp3Downloader(client)) 
        .build(); 
picasso .with(mContext).load(YOUR_URL).into(YOUR_IMAGEVIEW); 

hinzufügen

compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0' 
1

@ nexus700120 Lösung nicht auf dem neuesten Stand ist

@Neha Tyagi Lösung funktioniert, aber mehrere Instanzen von Picasso in jeder Instanz Aktivität erzeugt die Speicher

So leckt I gestaltete eine aktuelle und Singleton-Lösung für die Umleitung von Bild-URLs -

CustomPicasso.java

import android.content.Context; 
import android.util.Log; 

import com.jakewharton.picasso.OkHttp3Downloader; 
import com.squareup.picasso.Picasso; 

/** 
* Created by Hrishikesh Kadam on 19/12/2017 
*/ 

public class CustomPicasso { 

    private static String LOG_TAG = CustomPicasso.class.getSimpleName(); 
    private static boolean hasCustomPicassoSingletonInstanceSet; 

    public static Picasso with(Context context) { 

     if (hasCustomPicassoSingletonInstanceSet) 
      return Picasso.with(context); 

     try { 
      Picasso.setSingletonInstance(null); 
     } catch (IllegalStateException e) { 
      Log.w(LOG_TAG, "-> Default singleton instance already present" + 
        " so CustomPicasso singleton cannot be set. Use CustomPicasso.getNewInstance() now."); 
      return Picasso.with(context); 
     } 

     Picasso picasso = new Picasso.Builder(context). 
       downloader(new OkHttp3Downloader(context)) 
       .build(); 

     Picasso.setSingletonInstance(picasso); 
     Log.w(LOG_TAG, "-> CustomPicasso singleton set to Picasso singleton." + 
       " In case if you need Picasso singleton in future then use Picasso.Builder()"); 
     hasCustomPicassoSingletonInstanceSet = true; 

     return picasso; 
    } 

    public static Picasso getNewInstance(Context context) { 

     Log.w(LOG_TAG, "-> Do not forget to call customPicasso.shutdown()" + 
       " to avoid memory leak"); 

     return new Picasso.Builder(context). 
       downloader(new OkHttp3Downloader(context)) 
       .build(); 
    } 
} 

build.gradle (Modul: app)

android { 

    ... 

} 

dependencies { 

    ... 

    compile 'com.squareup.picasso:picasso:2.5.2' 
    compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0' 
} 

Verwendung -

CustomPicasso.with(context) 
    .load("http://i.imgur.com/DvpvklR.png") 
    .into(imageView); 

Für aktuelle Versionen prüfen CustomPicasso Kern - https://gist.github.com/hrishikesh-kadam/09cef31c736de088313f1a102f5ed3a3

+0

Ich habe diese Lösung in meiner App ausprobiert und es funktioniert nicht mit https-Protokoll. Denken Sie daran, dass dies die Frage ist: – crubio

+0

@crubio Können Sie mir bitte geben, welche URL Sie treffen? –

+0

Sie können dies zum Beispiel versuchen: https://www.multeestica.com/img/img_et/avatar/i-avatar-15.jpg – crubio

Verwandte Themen