先看效果:

  • 获取富文本中的图片

  • 抓取腾讯新闻中的图片

  • 首先引入要使用的jar包
 compile 'jp.wasabeef:glide-transformations:2.0.2'compile 'org.jsoup:jsoup:1.9.2'

一、加载富文本图片自适应

  • 关键代码如下:
package tsou.cn.webviewtext;import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import tsou.cn.webviewtext.util.StringBrowserUtils;
import tsou.cn.webviewtext.util.data.Data;
import tsou.cn.webviewtext.webview.MJavascriptInterface;
import tsou.cn.webviewtext.webview.MyWebViewClient;public class WebViewDataOneActivity extends AppCompatActivity {private WebView webview;private String[] imageUrls;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_web_view_data_one);webview = (WebView) findViewById(R.id.webview);imageUrls = StringBrowserUtils.returnImageUrlsFromHtml(Data.getData());//设置加载进来的页面自适应手机屏幕//第一个方法设置webview推荐使用的窗口,设置为true。webview.getSettings().setUseWideViewPort(true);// 第二个方法是设置webview加载的页面的模式,也设置为true。webview.getSettings().setLoadWithOverviewMode(true);//webview.getSettings().setDefaultFontSize(20);webview.getSettings().setTextZoom(260);webview.getSettings().setJavaScriptEnabled(true);webview.getSettings().setSupportZoom(false);webview.getSettings().setBuiltInZoomControls(false);webview.getSettings().setDisplayZoomControls(false);webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); //取消滚动条白边效果webview.setWebChromeClient(new WebChromeClient());webview.addJavascriptInterface(new MJavascriptInterface(this, imageUrls), "imagelistener");webview.setWebViewClient(new MyWebViewClient());webview.getSettings().setDefaultTextEncodingName("UTF-8");webview.getSettings().setBlockNetworkImage(false);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {webview.getSettings().setMixedContentMode(webview.getSettings().MIXED_CONTENT_ALWAYS_ALLOW);  //注意安卓5.0以上的权限}webview.loadDataWithBaseURL(null, Data.getData(), "text/html", "UTF-8", null);}}

MJavascriptInterface类和MyWebViewClient类下面提供。

二、加载富文本图片按宽度适配

  • 关键代码:
package tsou.cn.webviewtext;import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import tsou.cn.webviewtext.util.StringBrowserUtils;
import tsou.cn.webviewtext.util.data.Data;
import tsou.cn.webviewtext.webview.MJavascriptInterface;
import tsou.cn.webviewtext.webview.MyWebViewClient;public class WebViewDatatwoActivity extends AppCompatActivity {private WebView webview;private String[] imageUrls;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_web_view_data_one);webview = (WebView) findViewById(R.id.webview);imageUrls = StringBrowserUtils.returnImageUrlsFromHtml(Data.getData());webview.getSettings().setJavaScriptEnabled(true);webview.getSettings().setUseWideViewPort(true);webview.getSettings().setLoadWithOverviewMode(true);webview.getSettings().setDefaultFontSize(40);webview.getSettings().setBuiltInZoomControls(true);webview.getSettings().setDisplayZoomControls(false);webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); //取消滚动条白边效果webview.setWebChromeClient(new WebChromeClient());webview.addJavascriptInterface(new MJavascriptInterface(this, imageUrls), "imagelistener");webview.setWebViewClient(new MyWebViewClient());webview.getSettings().setDefaultTextEncodingName("UTF-8");webview.getSettings().setBlockNetworkImage(false);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {webview.getSettings().setMixedContentMode(webview.getSettings().MIXED_CONTENT_ALWAYS_ALLOW);  //注意安卓5.0以上的权限}webview.loadDataWithBaseURL(null, getNewContent(Data.getData()), "text/html", "UTF-8", null);}private String getNewContent(String htmltext) {Document doc = Jsoup.parse(htmltext);Elements elements = doc.getElementsByTag("img");for (Element element : elements) {element.attr("width", "100%").attr("height", "auto");}return doc.toString();}
}

使用Jsoup让图片宽度充满全屏

三、加载HTML使用Jsoup爬取数据

  • 关键代码:
package tsou.cn.webviewtext;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.webkit.WebView;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;import java.util.ArrayList;
import java.util.List;import tsou.cn.webviewtext.util.data.Data;
import tsou.cn.webviewtext.webview.MJavascriptInterface;
import tsou.cn.webviewtext.webview.MyWebViewClient;public class WebViewUrlTwoActivity extends AppCompatActivity {private WebView webview;private List<String> imageSrcList;@Overrideprotected void onDestroy() {webview.clearHistory();super.onDestroy();System.gc();}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_web_view_data_one);webview = (WebView) findViewById(R.id.webview);webview.loadUrl(Data.getUrl());new Thread(new Runnable() {@Overridepublic void run() {getHtmlData();}}).start();}private void getHtmlData() {try {//从一个URL加载一个Document对象。Document doc = Jsoup.connect(Data.getUrl()).userAgent("Mozilla").timeout(50000).get();Elements elements = doc.select("div.main").select("img");imageSrcList = new ArrayList<>();imageSrcList.clear();for (int i = 0; i < elements.size(); i++) {Log.e("huangxiaoguo", "elements" + elements.get(i).attr("src"));imageSrcList.add(elements.get(i).attr("src"));}runOnUiThread(new Runnable() {@Overridepublic void run() {setWebView(imageSrcList.toArray(new String[imageSrcList.size()]));}});} catch (Exception e) {e.printStackTrace();}}private void setWebView(String[] imageUrls) {webview.addJavascriptInterface(new MJavascriptInterface(this, imageUrls), "imagelistener");webview.setWebViewClient(new MyWebViewClient());}}

四、其他相关代码

  • 数据类Data
public class Data {public static String getUrl() {return "https://view.inews.qq.com/a/20171101A07WQO00";}public static String getData() {return "富文本"}
}

富文本太长,请到https://gitee.com/huangxiaoguo/WebViewText/blob/master/app/src/main/java/tsou/cn/webviewtext/util/data/Data.java查看。

  • MJavascriptInterface类
package tsou.cn.webviewtext.webview;import android.content.Context;
import android.content.Intent;
import android.util.Log;import tsou.cn.webviewtext.LookBigPhotoActivity;/*** Created by Administrator on 2017/2/10.*/public class MJavascriptInterface {private Context context;private String[] imageUrls;public MJavascriptInterface(Context context, String[] imageUrls) {this.context = context;this.imageUrls = imageUrls;}@android.webkit.JavascriptInterfacepublic void openImage(String img) {Intent intent = new Intent();intent.putExtra("imageUrls", imageUrls);for (int i = 0; i < imageUrls.length; i++) {if (imageUrls[i].equals(img))intent.putExtra("position", i);}intent.setClass(context, LookBigPhotoActivity.class);context.startActivity(intent);}
}
  • MyWebViewClient类
package tsou.cn.webviewtext.webview;import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;public class MyWebViewClient extends WebViewClient {@Overridepublic void onPageFinished(WebView view, String url) {view.getSettings().setJavaScriptEnabled(true);super.onPageFinished(view, url);//待网页加载完全后设置图片点击的监听方法addImageClickListener(view);}@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// 调用系统默认浏览器处理urlview.stopLoading();view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));return true;}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {view.getSettings().setJavaScriptEnabled(true);super.onPageStarted(view, url, favicon);}private void addImageClickListener(WebView webView) {webView.loadUrl("javascript:(function(){" +"var objs = document.getElementsByTagName(\"img\"); " +"for(var i=0;i<objs.length;i++) " +"{"+ " objs[i].onclick=function() " +" { "//通过js代码找到标签为img的代码块,设置点击的监听方法与本地的openImage方法进行连接+ "  window.imagelistener.openImage(this.src); " +" } " +"}" +"})()");}
}
  • ImageLoadUtil类
package tsou.cn.webviewtext.util;import android.content.Context;
import android.support.annotation.DrawableRes;
import android.widget.ImageView;import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;import java.io.File;import jp.wasabeef.glide.transformations.CropCircleTransformation;
import jp.wasabeef.glide.transformations.CropTransformation;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import tsou.cn.webviewtext.R;/*** 图片加载类封装** @author RS*/
public class ImageLoadUtil {public static ImageView display(Context context, ImageView img, String url) {Glide.with(context).load(url).placeholder(R.drawable.app_loading_pic) //加载中的图片.error(R.drawable.app_loading_pic) //加载失败的图片.into(img);return img;}public static ImageView display(Context context, ImageView img, File file) {Glide.with(context).load(file).placeholder(R.drawable.app_loading_pic) //加载中的图片.error(R.drawable.app_loading_pic) //加载失败的图片.into(img);return img;}public static ImageView displayCircle(Context context, ImageView img, String url) {Glide.with(context).load(url).placeholder(R.drawable.app_loading_pic_round) //加载中的图片.error(R.drawable.app_loading_pic_round) //加载失败的图片.override(150, 150).bitmapTransform(new CropCircleTransformation(context)).into(img);return img;}public static ImageView displayCircle(Context context, ImageView img, File file) {Glide.with(context).load(file).override(150, 150).placeholder(R.drawable.app_loading_pic_round) //加载中的图片.error(R.drawable.app_loading_pic_round) //加载失败的图片.bitmapTransform(new CropCircleTransformation(context)).into(img);return img;}public static ImageView displayCircle(Context context, ImageView img, String url, @DrawableRes int defaultPic) {Glide.with(context).load(url).override(150, 150).placeholder(defaultPic) //加载中的图片.error(defaultPic) //加载失败的图片.bitmapTransform(new CropCircleTransformation(context)).into(img);return img;}public static ImageView displayRound(Context context, ImageView img, String url, int round, int width, int height) {Glide.with(context).load(url).placeholder(R.drawable.app_loading_pic) //加载中的图片.error(R.drawable.app_loading_pic) //加载失败的图片.bitmapTransform(new CropTransformation(context, width, height),new RoundedCornersTransformation(context, UIUtils.dip2px(context, round), 0)).into(img);return img;}public static ImageView displaySquareRound(Context context, ImageView img, String url, int round, int length) {displayRound(context, img, url, round, length, length);return img;}public static ImageView displaySquareRound(Context context, ImageView img, String url, int length) {displaySquareRound(context, img, url, 4, length);return img;}/****************************/public static void display(Context context, String imgPath, ImageView imageView) {display(context, imgPath, imageView, R.drawable.app_loading_pic);}public static void display(Context context, String imgPath, ImageView imageView, @DrawableRes int resId) {Glide.with(context).load(imgPath).error(resId).placeholder(resId) //加载中的图片.diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);}public static void display(Context context, @DrawableRes int imgPath, ImageView imageView) {display(context, imgPath, imageView, R.drawable.app_loading_pic);}public static void display(Context context, @DrawableRes int imgPath, ImageView imageView, @DrawableRes int resId) {Glide.with(context).load(imgPath).error(resId).placeholder(resId) //加载中的图片.diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);}public static void display(Context context, String imgPath, ImageView imageView, int width, int height) {display(context, imgPath, imageView, R.drawable.app_loading_pic, width, height);}public static void display(Context context, String imgPath, ImageView imageView, @DrawableRes int resId, int width,int height) {Glide.with(context).load(imgPath).error(resId).diskCacheStrategy(DiskCacheStrategy.ALL).override(width, height).placeholder(resId) //加载中的图片.into(imageView);}public static void clearMemory(final Context mContext) {new Thread(new Runnable() {@Overridepublic void run() {Glide.get(mContext).clearDiskCache();//清理磁盘缓存需要在子线程中执行}}).start();Glide.get(mContext).clearMemory();//清理内存缓存可以在UI主线程中进行}}
  • StringBrowserUtils类
package tsou.cn.webviewtext.util;import android.util.Log;import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** Created by Administrator on 2017/2/9.*/public class StringBrowserUtils {public static String[] returnImageUrlsFromHtml(String content) {List<String> imageSrcList = new ArrayList<String>();String htmlCode = content;Pattern p = Pattern.compile("<img\\b[^>]*\\bsrc\\b\\s*=\\s*('|\")?([^'\"\n\r\f>]+(\\.jpg|\\.bmp|\\.eps|\\.gif|\\.mif|\\.miff|\\.png|\\.tif|\\.tiff|\\.svg|\\.wmf|\\.jpe|\\.jpeg|\\.dib|\\.ico|\\.tga|\\.cut|\\.pic|\\b)\\b)[^>]*>", Pattern.CASE_INSENSITIVE);Matcher m = p.matcher(htmlCode);String quote = null;String src = null;while (m.find()) {quote = m.group(1);src = (quote == null || quote.trim().length() == 0) ? m.group(2).split("//s+")[0] : m.group(2);imageSrcList.add(src);}if (imageSrcList == null || imageSrcList.size() == 0) {Log.e("huangxiaoguo", "资讯中未匹配到图片链接");return null;}return imageSrcList.toArray(new String[imageSrcList.size()]);}}
  • UIUtils类
package tsou.cn.webviewtext.util;import android.content.Context;public class UIUtils {/*** dip转换px*/public static int dip2px(Context context, int dip) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dip * scale + 0.5f);}}
  • LookBigPhotoActivity类
package tsou.cn.webviewtext;import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import tsou.cn.webviewtext.util.ImageLoadUtil;public class LookBigPhotoActivity extends AppCompatActivity {ViewPager viewpager;TextView mCircleindicator;private int position;private String[] imageUrlses;@Overrideprotected void onDestroy() {ImageLoadUtil.clearMemory(this);super.onDestroy();}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_look_big_photo);initView();initData();initListener();}protected void initView() {viewpager = (ViewPager) findViewById(R.id.viewpager);mCircleindicator= (TextView) findViewById(R.id.circleindicator);}protected void initData() {position = getIntent().getIntExtra("position", 0);imageUrlses = getIntent().getStringArrayExtra("imageUrls");}protected void initListener() {viewpager.setAdapter(new PagerAdapter() {@Overridepublic int getCount() {return imageUrlses.length;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {ImageView imageView = new ImageView(LookBigPhotoActivity.this);ImageLoadUtil.display(LookBigPhotoActivity.this, imageView, imageUrlses[position]);container.addView(imageView);imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});return imageView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}});viewpager.setCurrentItem(position);mCircleindicator.setText(position+1+"/"+imageUrlses.length);viewpager.addOnPageChangeListener(onMyPageChangeListener);}private ViewPager.OnPageChangeListener onMyPageChangeListener = new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {mCircleindicator.setText(position+1+"/"+imageUrlses.length);}@Overridepublic void onPageScrollStateChanged(int state) {}};}
  • LookBigPhotoActivity布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/black"><TextView
        android:id="@+id/circleindicator"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:textSize="20sp"android:textColor="@color/white"android:text="0/0"android:layout_marginBottom="50px"android:layout_marginLeft="30dp" /><android.support.v4.view.ViewPager
        android:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@id/circleindicator"android:layout_marginBottom="150px"android:layout_marginTop="150px" />
</RelativeLayout>

DEMO地址:https://gitee.com/huangxiaoguo/WebViewText

这里有个问题,在Jsoup怎么获取网页中JS动态解析出来的标签呢?
有知道的,烦请赐教,谢谢哈…………….

android:获取富文本图片和使用Jsoup抓取腾讯新闻网页数据相关推荐

  1. c 中html抓取页面图片,【教程】抓取网并提取网页中所需要的信息 之 C#版

    在通过: 了解了抓取网页的一般流程之后,加上之前介绍的: 应该就很清楚如何利用工具去抓取网页,并分析源码,获得所需内容了. 下面,就来通过实际的例子来介绍,如何通过Python语言,实现这个抓取网页并 ...

  2. vue+php使用七牛云存储解决富文本图片冗余问题

    解决服务器中图片冗余的方法很多,本篇介绍利用七牛云自带的api解决图片冗余问题 问题: 在前端编辑富文本上传图片时,一般有两种方式,一种是将图片在本地预览,文件则在本地缓存,一种是直接上传服务器,然后 ...

  3. 从富文本中截取图片_JS 获取富文本中的第一张图片 (正则表达式)

    JS 获取富文本中的第一张图片 (正则表达式) JS 获取富文本中的第一张图片 url 正则公式及去除字符串里面的 html 标签 后台发来一个富文本字符串里面可能包含了 0,1,2,3... 个图片 ...

  4. 从富文本(html字符串)中获取图片,js获取富文本中的第一张图片(正则表达式)

    js获取富文本中的第一张图片url正则公式及去除字符串里面的html标签 后台发来一个富文本字符串里面可能包含了0.1.2.3-个图片标签(img),我们的任务是获取这个字符串里面第一张图片的url, ...

  5. 从富文本中截取图片_js获取富文本中的第一张图片(正则表达式)

    js获取富文本中的第一张图片url正则公式及去除字符串里面的html标签 后台发来一个富文本字符串里面可能包含了0.1.2.3-个图片标签(img),我们的任务是获取这个字符串里面第一张图片的url, ...

  6. java freemarker 图片_java通过freemarker导出包含富文本图片的word文档

    废话不多说,进入正题! 本文重点在于:对富文本图片的导出(基础的freemarker+word模板导出这里不做详细解说哈) (ps:大神的东西太深奥~~懵逼了 一周才搞定,为了方便后来在更加简单,清晰 ...

  7. vue-quill-editor + element-ui upload实现富文本图片上传

    代码贴上 <template><divclass="quill-editor-example"><divclass="box"&g ...

  8. elementui图片上传php,vue+element-ui+富文本————图片上传

    最近用vue+element-ui开发一套后台管理系统,其中项目中需要用到富文本编辑器,这里总结下开发过程中遇到的坑和使用方法. 刚开始用的是vue-quill-editor结合element-ui上 ...

  9. html加载富文本_富文本图片懒加载解决方案

    图片懒加载,作为性能优化的一部分,想必我们并不陌生. 在React.Vue项目中,我们都可以引入对应的NPM包处理图片懒加载,如 lazyload.react-lazyload.vue-lazyloa ...

最新文章

  1. ubuntu14.04行更新软件包
  2. 作为网站管理,你的性能监测工作如何开展?
  3. linux快速切换目录命令,Linux在命令行快速切换目录 - 米扑博客
  4. android中的add方法,Android入门之addWindow
  5. sap 供应商表_SAP系统玩阴的?
  6. 虚拟机centos7 桥接模式
  7. mysql安装显示3534_MySQL安装成功之后启动错误 3534、28000和简单使用
  8. Spring Cloud整合Nacos实现动态配置
  9. unity天空盒渐变,Unity 3D从一个天空盒淡入另一个天空盒
  10. 计算机不打印怎么回事,打印机无法打印怎么办解决方案
  11. 仿真Windows_XP画图板的java实现
  12. 销售额总和的分类汇总计算机操作,excel分类汇总-EXCEL函数公式大全之利用MONTH函数和分类汇总汇总每个月的销售额...
  13. 预装Win8系统的电脑安装Win7的方法(EFI安装Win7)
  14. win10投影无法正常使用:我们正在确认此功能 解决方法
  15. 如何制作自己的网站?
  16. 关于assert函数的调用警告:implicit declaration of function 'ASSERT' is invalid in C99
  17. SQL Server 2016软件安装教程
  18. 汇编语言题库总结及题目分析
  19. MATLAB在线编辑器online
  20. 万物互联的IoT时代,柔性电子会大行其道吗?

热门文章

  1. AIGC的未来展望和发展方向
  2. xshell上方的标准按钮(工具栏等)消失了怎么办,已解决
  3. python-基础-文件
  4. mongodb官方客户端可视化工具Compass,免费,官方值得信赖
  5. 算法:Raft算法。
  6. 连接数据库的方法总结
  7. 升达经贸管理学院计算机专业英语四级,关于2018年12月全国大学英语四六级考试郑州升达经贸管理学院考点工作安排的通知...
  8. 触摸屏的一些资料,touchscreen ,x+,x-,y+,y-,tsxp,tsxm,tsyp,tspm
  9. 库函数strcpy函数的实现
  10. vscode插件及快捷键