Я не могу загружать изображения с помощью протокола HTTPS из-за ошибки сертификата. Это происходит через пару недель или более, до этого у меня не было проблем.
Если я использую библиотеку Apache HttpCommons, ошибка "сертификат имени хоста не соответствует", и если я использую URL-адрес и URL-соединение, исключением является "сертификат не проверен".
Я отчаялся, потому что мне нужно выполнить это, чтобы закончить мой проект, и все, что я проверил, не работает.
Это код с библиотекой Apache:
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
try
{
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
{
HttpEntity entity = response.getEntity();
if (entity != null)
{
try
{
byte[] data = EntityUtils.toByteArray(entity);
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
//bitmap = BitmapFactory.decodeStream(entity.getContent());
} catch (IOException e)
{
e.printStackTrace();
Log.e("FACEBOOKLIBRARY", "Error fetching image from this URL: " + url
+ "because of the download is corrupted");
bitmap = null;
} finally
{
entity.consumeContent();
}
}
}
else
{
Log.e("FACEBOOKLIBRARY", "Error fetching image from this URL: " + url
+ " because of the error: " + response.getStatusLine().toString());
bitmap = null;
}
} catch (IOException e)
{
e.printStackTrace();
Log.e("FACEBOOKLIBRARY", "Error fetching image while connecting to this URL: " + url);
bitmap = null;
}
return bitmap;
И это код URL:
try {
URL u = new URL(url);
URLConnection connection = u.openConnection();
InputStream is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while((current = bis.read()) != -1) {
baf.append(current);
}
byte[] byteArray = baf.toByteArray();
bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
bitmap = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
bitmap = null;
}
Мне, наконец, пришлось деактивировать проверку имени хоста для HttpClient:
HttpClient client = new DefaultHttpClient();
SSLSocketFactory sf = (SSLSocketFactory) client.getConnectionManager().getSchemeRegistry().getScheme("https").getSocketFactory();
sf.setHostnameVerifier(new AllowAllHostnameVerifier());