android - 使用 https 的 Volley NetworkImageView

标签 android image https android-volley

我在我的应用程序中使用 Facebook 照片。 Facebook 照片存储在 https 网址后面。

谁能给我一个使用 https 使用 networkimageview 加载图像的示例?

最佳答案

我有类似的问题,不是 facebook,而是 https 下的图片。

除了有一个自签名证书外,还有很多重定向、cookie 管理等。所以我将 HttpClient Stack 与 Volley 结合使用,现在一切正常。

也许这对您的问题有帮助。 您可以跳过所有您不感兴趣的部分。

以下代码部分复制,包括代码注释,并改编自this answer通过 kuester2000this one通过 Jens .

初始化HttpClient(不需要的可以跳过)

// Create and initialize HTTP parameters
HttpParams params = new BasicHttpParams();
HttpClientParams.setRedirecting(params, true );
        
// Set the timeout in milliseconds until a connection is established.
HttpConnectionParams.setConnectionTimeout( params, 5000 );
        
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
HttpConnectionParams.setSoTimeout( params, 10000 );
     
// The params are read in the ctor of the pool constructed by
// ThreadSafeClientConnManager, and need to be set before constructing it.
ConnManagerParams.setMaxTotalConnections(params, 15);
ConnPerRoute cpr = new ConnPerRoute() {
   @Override
   public int getMaxForRoute(HttpRoute httpRoute) { return 5; }
};
        
ConnManagerParams.setMaxConnectionsPerRoute(params, cpr);
        
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        
// Create and initialize scheme registry
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register( new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

/* Since I'm in a development environment I need to trust self-signed certs */
SSLSocketFactory sslSocketFactory = null;
try {
   X509TrustManager tm = new X509TrustManager() {
      public void checkClientTrusted(X509Certificate[] xcs, String string)
         throws CertificateException { }

      public void checkServerTrusted(X509Certificate[] xcs, String string)
         throws CertificateException { }

      public X509Certificate[] getAcceptedIssuers() { return null; }
   };
            
   SSLContext ctx = SSLContext.getInstance("TLS");
   ctx.init(null, new TrustManager[]{tm}, null);
   
   sslSocketFactory = new TrustAllSSLSocketFactory(ctx);
   if (sslSocketFactory != null)
      sslSocketFactory.setHostnameVerifier(
          SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

} catch (Exception ex) {
   Log.e(TAG, ex.getMessage(), ex);
   sslSocketFactory = null;
}
        
if (sslSocketFactory == null) {
   sslSocketFactory = SSLSocketFactory.getSocketFactory();
   sslSocketFactory.setHostnameVerifier(
      SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
}
        
schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
        
// Create an HttpClient with the ThreadSafeClientConnManager.
// This connection manager must be used if more than one thread will
// be using the HttpClient.
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
        
DefaultHttpClient client = new DefaultHttpClient(cm, params);
        
HttpProtocolParams.setUseExpectContinue(client.getParams(), false);

HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
   public boolean retryRequest(IOException exception, int executionCount,
      HttpContext context) {
      // retry a max of 5 times
      if(executionCount >= 5) { return false; }
      if(exception instanceof NoHttpResponseException){
         return true;
      } else if (exception instanceof ClientProtocolException){
         return true;
      }
      return false;
   }
};
        
client.setHttpRequestRetryHandler(retryHandler);
        
/* Cookie Management */
CookiesStore cookieStore = new BasicCookieStore();
client.setCookieStore(cookieStore);

在 Volley 中使用 HttpClient

/* Use HttpClientStack with Volley */
mRequestQueue = Volley.newRequestQueue(
    context.getApplicationContext(), new HttpClientStack(client));

TrustAllSSLSocketFactory.java

static final
private class TrustAllSSLSocketFactory extends SSLSocketFactory {
   
   private SSLContext sslContext = SSLContext.getInstance("TLS");

   public TrustAllSSLSocketFactory(KeyStore truststore) 
       throws NoSuchAlgorithmException,
          KeyManagementException,
              KeyStoreException, UnrecoverableKeyException {
      super(truststore);

  TrustManager tm = new X509TrustManager() {
          @Override
          public X509Certificate[] getAcceptedIssuers() { return null; }

          @Override
          public void checkServerTrusted(X509Certificate[] chain, String authType)
             throws CertificateException { }

          @Override
          public void checkClientTrusted(X509Certificate[] chain, String authType)
             throws CertificateException { }
      };

      sslContext.init(null, new TrustManager[] { tm }, null);
  }

  public TrustAllSSLSocketFactory(SSLContext context)
      throws KeyManagementException, 
             NoSuchAlgorithmException, KeyStoreException, 
             UnrecoverableKeyException {
    super(null);
    sslContext = context;
  }

  @Override
  public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
     throws IOException, UnknownHostException {
      return sslContext.getSocketFactory()
         .createSocket(socket, host, port, autoClose);  
  }

  @Override
  public Socket createSocket() throws IOException {
     return sslContext.getSocketFactory().createSocket();
  }
};

关于android - 使用 https 的 Volley NetworkImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23133465/

相关文章:

android - 指向android中的一个XML文件

android - 打包可穿戴应用

html - 图像未显示在 Rails 应用程序中

java - 如何获取 *.cer 文件以将自签名 HTTPS 证书添加为受 Java 信任

android - 谷歌在 Android 中通过 HTTPS 映射反向地理编码

java - 错误 : picked up java_options: -Djava.net.preferIPv4Stack=true

android - Android XML 编辑器和 Eclipse 的问题...难以手动编辑 XML

python - 尝试使用 kairos 上传文件时出错

javascript - 从远程服务器获取时的图像压缩

ssl - 在本地主机上使用 Symfony2 和 HTTPS