Не удается получить URL-адрес изображения с помощью jsoup
Я пытаюсь получить URL диапазона изображений, подобных этому:
for(Element img : document.select(".left-column .strillo-content .lazy img[src]")) {
InputStream input = new java.net.URL(imageMainUrl).openStream();
Bitmap bitmap = BitmapFactory.decodeStream(input);
images.add(bitmap);
}
но каждый раз, когда я пытаюсь запустить свое приложение, я получаю это предупреждение:
java.net.MalformedURLException: Unknown protocol: data
at java.net.URL.<init>(URL.java:184)
at java.net.URL.<init>(URL.java:127)
поэтому я попытался напечатать URL-адрес, и я получил это:
data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
и я могу понять почему, потому что я на 100% уверен, что выбранный мной элемент является corrent, а также я делаю тот же процесс с другим разделом сайта, и он работает..
ОБНОВЛЕНИЕ 1: я попробовал этот метод для декодирования изображения "base64":
byte[] decodedString = Base64.decode(imageMainUrl, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
но результат тот же..
1 ответ
Решение
Это схема URI данных
http://en.wikipedia.org/wiki/Data_URI_scheme
Это позволяет добавлять встроенные данные в ваш URI.
- Извлеките часть URI base64 и получите массив байтов с
parseBase64Binary
Более подробная информация здесь: http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/DatatypeConverter.html - Используйте этот массив для построения
ByteArrayInputStream
- Используй свой
BitmapFactory
расшифровать его вBitmap
редактировать
Этот код работает, он дает изображение размером 1px*1px gif. я использовал org.apache.commons.codec.binary.Base64
от commons-codec
String uri = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
byte[] decodedString = Base64.decodeBase64(uri.substring(uri.indexOf("data:image/gif;base64,") + "data:image/gif;base64,".length()));
ByteArrayInputStream is = new ByteArrayInputStream(decodedString);
FileOutputStream os = new FileOutputStream(new File("/tmp/test.gif"));
byte[] buffer = new byte[1024];
int length;
// copy the file content in bytes
while ((length = is.read(buffer)) > 0)
{
os.write(buffer, 0, length);
}
is.close();
os.close();