文章目录

  • 无网络或加载错误时显示本地HTML
  • 修改网站logo图
  • 长按可以下载图片
  • 支持视频全屏播放
  • 禁止页面下载App
  • 过滤掉烦人的广告
  • 支持网页版微信支付
  • 支持网页版支付宝付款
  • 支持第三方QQ一键登录
  • 通过jsoup修改页面内容
  • 通过注入JS代码 修改网页内容
  • WebView在Fragment中返回键的处理
  • 。。。

无网络或加载错误时显示本地HTML

WebView加载网页,那么,自然是有加载错误的时候,或者手机无网络连接,这时总不能显示空白吧!显示本地html5提示用户无网络或是无数据界面。

     @Overridepublic void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {videowebview.loadUrl("file:///android_asset/error.html");}

修改网站logo图

        @Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {url = url.toLowerCase();if(url.contains("images/wap/manhua/v1/logo.png")){try {return new WebResourceResponse("image/png", "utf-8", getAssets().open("ic_launcher.png"));} catch (IOException pE) {pE.printStackTrace();}}}

长按可以下载图片

mWebView .setOnLongClickListener(this);
 @Overridepublic boolean onLongClick(View v) {WebView webView = (WebView) v;HitTestResult hr = webView.getHitTestResult();//int type = hr.getType();if (type == HitTestResult.IMAGE_TYPE || type == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {//final String imageUrl = hr.getExtra();if (!imageUrl.startsWith("http")) {return false;}final View dialogView = getLayoutInflater().inflate(R.layout.dialog_layout, null);final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).setView(dialogView).create();dialogView.findViewById(R.id.save_tv).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {downLoad(imageUrl, false);alertDialog.dismiss();}});dialogView.findViewById(R.id.wall_tv).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {downLoad(imageUrl, true);alertDialog.dismiss();}});alertDialog.show();return true;}return false;}private void downLoad(String imageUrl, boolean wall) {int desiredMinimumWidth = getWindowManager().getDefaultDisplay().getWidth();int desiredMinimumHeight = getWindowManager().getDefaultDisplay().getHeight();FileDownLoad fileDownLoad = new FileDownLoad(MainActivity.this,imageUrl, "png", desiredMinimumWidth, desiredMinimumHeight,wall);fileDownLoad.enqueue(this, imageUrl, "图片下载");}

FileDownLoad

package XXX;import java.io.File;
import java.io.IOException;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.app.WallpaperManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore.MediaColumns;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.MimeTypeMap;
import android.widget.Toast;public class FileDownLoad {private long id;private DownloadManager manager;private Request request;private RequestCompleteReceiver completeReceiver;private String type, pathStr;private Context mcontext;private int desiredMinimumWidth, desiredMinimumHeight;private boolean wall;public FileDownLoad(Context context, String url, String type, int width, int height,boolean wall) {this.mcontext = context;this.wall = wall;this.desiredMinimumWidth = width;this.desiredMinimumHeight = height;completeReceiver = new RequestCompleteReceiver();context.registerReceiver(completeReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));this.type = type;manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);request = new Request(Uri.parse(url));request.setAllowedNetworkTypes(Request.NETWORK_MOBILE | Request.NETWORK_WIFI);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);//request.setVisibleInDownloadsUi(true);//if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);if (!file.exists()) {file.mkdirs();}Log.e("TAG", file.getAbsolutePath());String suffix = url.substring(url.lastIndexOf("/"));pathStr = file.getAbsolutePath() + "/" + suffix;Log.e("图片下载路径", pathStr);request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, suffix);}//MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url));request.setMimeType(mimeString);}private void setWallay(String pathStrT) {try {if(TextUtils.isEmpty(pathStr)){pathStr=pathStrT;}Bitmap bitmap = BitmapFactory.decodeFile(pathStr);WallpaperManager instance = WallpaperManager.getInstance(mcontext);instance.suggestDesiredDimensions(desiredMinimumWidth, desiredMinimumHeight);instance.setBitmap(bitmap);Toast.makeText(mcontext, "壁纸设置成功", Toast.LENGTH_SHORT).show();} catch (IOException e) {e.printStackTrace();}}public void enqueue(Context context, String title, String description) {if (id != 0) {manager.remove(id);id = 0;}//request.setTitle(title);//request.setDescription(description);id = manager.enqueue(request);}class RequestCompleteReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())) {long downloadCompleteId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);if (downloadCompleteId == id) {context.unregisterReceiver(completeReceiver);completeReceiver = null;DownloadManager.Query query = new DownloadManager.Query();query.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL);Cursor c = manager.query(query);String uriStr = "";if (c.moveToFirst()) {uriStr = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));}if(wall){if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {//file:///storage/emulated/0/Download/ybs-28.apkif (!TextUtils.isEmpty(uriStr)) {setWallay(uriStr);}} else {File file = new File(getFilePathFromUri(context, Uri.parse(uriStr)));setWallay(file.getAbsolutePath());}}else{Toast.makeText(mcontext,"图片已保存",Toast.LENGTH_SHORT).show();}}}}}/*** @param c* @param uri* @return*/public String getFilePathFromUri(Context c, Uri uri) {String filePath = null;if ("content".equals(uri.getScheme())) {String[] filePathColumn = {MediaColumns.DATA};ContentResolver contentResolver = c.getContentResolver();Cursor cursor = contentResolver.query(uri, filePathColumn, null,null, null);cursor.moveToFirst();int columnIndex = cursor.getColumnIndex(filePathColumn[0]);filePath = cursor.getString(columnIndex);cursor.close();} else if ("file".equals(uri.getScheme())) {filePath = new File(uri.getPath()).getAbsolutePath();}return filePath;}
}

dialog_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="10dp"><TextViewandroid:id="@+id/save_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="保存图片"android:padding="10dp"android:gravity="center"android:textSize="18sp"/><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@android:color/black"/><TextViewandroid:id="@+id/wall_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="设置壁纸"android:padding="10dp"android:gravity="center"android:textSize="18sp"/></LinearLayout>

支持视频全屏播放

activity_details.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/video_view"android:layout_width="fill_parent"android:layout_height="fill_parent"android:visibility="gone" ></FrameLayout><WebViewandroid:id="@+id/web_details"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginEnd="0dp"android:layout_marginStart="0dp"android:layout_marginTop="55dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"></WebView></android.support.constraint.ConstraintLayout>

java

@BindView(R.id.web_details)
WebView mWebDetails;
@BindView(R.id.video_view)
FrameLayout videoview;  // 全屏时视频加载view
private View xCustomView;
private xWebChromeClient xwebchromeclient;
private WebChromeClient.CustomViewCallback xCustomViewCallback;
xwebchromeclient = new xWebChromeClient();
mWebDetails.setWebChromeClient(xwebchromeclient);
    /*** 处理Javascript的对话框、网站图标、网站标题以及网页加载进度等* @author*/public class xWebChromeClient extends WebChromeClient {private Bitmap xdefaltvideo;private View xprogressvideo;@Override// 播放网络视频时全屏会被调用的方法public void onShowCustomView(View view, CustomViewCallback callback) {//Only fullscreen activities can request orientationsetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);mWebDetails.setVisibility(View.GONE);// 如果一个视图已经存在,那么立刻终止并新建一个if (xCustomView != null) {callback.onCustomViewHidden();return;}videoview.addView(view);xCustomView = view;xCustomViewCallback = callback;videoview.setVisibility(View.VISIBLE);}@Override// 视频播放退出全屏会被调用的public void onHideCustomView() {// 不是全屏播放状态if (xCustomView == null) {return;}setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);xCustomView.setVisibility(View.GONE);videoview.removeView(xCustomView);xCustomView = null;videoview.setVisibility(View.GONE);xCustomViewCallback.onCustomViewHidden();mWebDetails.setVisibility(View.VISIBLE);}// 视频加载添加默认图标@Overridepublic Bitmap getDefaultVideoPoster() {if (xdefaltvideo == null) {xdefaltvideo = BitmapFactory.decodeResource(getResources(), R.drawable.videoicon);}return xdefaltvideo;}// 视频加载时进程loading@Overridepublic View getVideoLoadingProgressView() {if (xprogressvideo == null) {LayoutInflater inflater = LayoutInflater.from(DetailsActivity.this);xprogressvideo = inflater.inflate(R.layout.video_loading_progress, null);}return xprogressvideo;}}

禁止页面下载App

//禁止页面下载第三方App
videowebview.setDownloadListener(new DownloadListener() {  @Overridepublic void onDownloadStart(String arg0, String arg1, String arg2, String arg3, long arg4) {try {Uri uri=Uri.parse(arg0);Intent intent=new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(uri);intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");startActivity(intent);} catch (Exception e) {Uri uri=Uri.parse(arg0);Intent intent=new Intent(Intent.ACTION_VIEW,uri);startActivity(intent);}}});

过滤掉烦人的广告

        @Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {url = url.toLowerCase();if(!url.contains(homeurl)){if (!ADFilterTool.hasAd(context, url)) {return super.shouldInterceptRequest(view, url);}else{return new WebResourceResponse(null,null,null);}}else{return super.shouldInterceptRequest(view, url);}}

2.在项目工具包中新建ADFilterTool类

public class ADFilterTool {public static boolean hasAd(Context context, String url) {Resources res = context.getResources();String[] adUrls = res.getStringArray(R.array.adBlockUrl);for (String adUrl : adUrls) {if (url.contains(adUrl)) {return true;}}return false;}
}

3.在values新建name="adBlockUrl"的AdUrlString.xml ,里面写的是你要屏蔽广告的域名,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="adBlockUrl"><item>ubmcmm.baidustatic.com</item><item>cpro2.baidustatic.com</item><item>cpro.baidustatic.com</item><item>s.lianmeng.360.cn</item><item>nsclick.baidu.com</item><item>pos.baidu.com</item><item>cbjs.baidu.com</item><item>cpro.baidu.com</item><item>images.sohu.com/cs/jsfile/js/c.js</item><item>union.sogou.com/</item><item>sogou.com/</item><item>a.baidu.com</item><item>c.baidu.com</item><item>baid2.okooo.com</item><item>baidu.mobads</item><item>yiqiso.com</item><item>googleads.g.doubleclick.net</item><item>www.2345.com</item><item>y.5125129.com</item><item>s.051352.com</item><item>s.6travel.com</item><item>www.duote.com</item><item>vps.gcx3.cn</item><item>50bang.org</item></string-array>
</resources>

支持网页版微信支付

        @Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Log.i("webviewtest", "shouldOverrideUrlLoading: " + url);// 如下方案可在非微信内部WebView的H5页面中调出微信支付if (url.startsWith("weixin://wap/pay?")) {Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse(url));startActivity(intent);return true;} else {Map<String, String> extraHeaders = new HashMap<String, String>();extraHeaders.put("Referer", "http://wxpay.wxutil.com");view.loadUrl(url, extraHeaders);}return true;}

支持第三方QQ一键登录

第一步:在activity的onCreate方法中写入下面代码,activity建议继承AppCompatActivity。这里还有很多关于webview的设置没发出来,自己知道补上就行。

        //当需要从一个网页跳转到另一个网页时,我们希望目标//网页仍然在当前WebView中显示,而不是打开浏览器mWebView.setWebViewClient(new NoAdWebViewClient());//4.4版本以上无法保存cookie,要是用代码去判断,开启第三方的cookie支持// Allow third party cookies for Android Lollipopif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {CookieManager cookieManager = CookieManager.getInstance();cookieManager.setAcceptThirdPartyCookies(mWebView,true);}mWebView.loadUrl(mUrl);

第二步:在WebView的WebViewClient中shouldOverrideUrlLoading方法处理QQ登录跳转问题,主要拦截QQ相关的URL,自己打log看日志,好像有三个相关的链接,文中出现两个。QQ登录完成后有两个跳转选择,一个是浏览器,另一个是APP,一定要选择APP。

    /*** Created by Administrator on 2019/9/18.* 处理各种通知、请求等事件*/public class NoAdWebViewClient extends WebViewClient {@Override//设置不用系统浏览器打开,直接显示在当前Webviewpublic boolean shouldOverrideUrlLoading(WebView view, String url) {Log.e("webviewtest", "shouldOverrideUrlLoading: " + url);//支持QQ一键登录//https://m.manhuatai.com/thirdlogin/?type=qq&referrer=if (url.startsWith("wtloginmqq://ptlogin/qlogin")) {mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));startActivity(mIntent);}mWebView.loadUrl(url);return true;}}

第三步:重写onNewIntent方法,拿到登录成功后的URL。这行mUrl = intent.getData().toString();代码是重点,

    @Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);mUrl = intent.getData().toString();Log.e("onNewIntent", "onNewIntent: ----->" +mUrl);mWebView.loadUrl(mUrl);}

第四步:也是最重要的一步,在AndroidManifest.xml中注册activity。

      <activity android:name="beid.wexd.tuoe.fragment.AiActivity"android:configChanges="orientation|keyboardHidden|navigation|screenSize"android:hardwareAccelerated="true"android:launchMode="singleTask"android:label="@string/app_name"><intent-filter><category android:name="android.intent.category.DEFAULT"/><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.BROWSABLE"/><data android:scheme="https" android:host="ssl.ptlogin2.qq.com" android:path="/jump"/></intent-filter></activity>

通过注入JS代码 修改网页内容

    //获取页面元素private String fun = "javascript:function getClass(parent,sClass){ " +"var aEle=parent.getElementsByTagName('footer'); " +"var aEle=parent.getElementsByTagName('div'); " +"var aResult=[]; " +"var i=0; " +"for(i<0;i<aEle.length;i++){ " +"if(aEle[i].className==sClass){ " +"aResult.push(aEle[i]); " +"} " +"}; " +"return aResult; " +"}";//隐藏元素 注意:xuan = 你要修改内容所在的div的class名private String fun1 = "javascript:function changeContent() { " +"getClass(document,'xuan')[0].style.display='none';" +"getClass(document,'fnav')[0].style.display='none';" +"getClass(document,'xuan')[0].style.visibility='hidden';" +"getClass(document,'fnav')[0].style.visibility='hidden';" +"var item = document.getElementById('air-footer');" +"item.style.display='none';" +"item.style.visibility='hidden';" +"}";/*** 页面加载结束时调用* @param view* @param url*/@Overridepublic void onPageFinished(WebView view, String url) {if(url! = null && url.contains("此处是你要修改网站的域名(比如是baidu.com)")) {view.loadUrl(fun);view.loadUrl(fun1);view.loadUrl("javascript:changeContent();");super.onPageFinished(view, url);}}

通过jsoup修改页面内容

通过jsoup修改页面内容这个就比较高端了,学这个的前提是你要会jsoup且懂一点前端知识;这里只放代码,感兴趣的自己先看看,不懂的地方评论区留言,在此之前可以也看下我的另一篇文章 Android 使用jsoup快速爬虫抓包

/*** Created by Administrator on 2018/9/29.* 思路是获取网页HTML,通过jsoup修改HTML代码,然后,使用WebView .loadDataWithBaseURL加载HTML出来。* 我这里的话是获取网页HTML中某个div的内容,然后,给这个片段HTML添加自己的网页头部代码,* 组合成一个完整简单的HTML。注释代码是我获取网页HTML内容,隐藏掉一些不想显示的内容。* @author 小红妹*/public class DetailsActivity extends BaseActivity {private static final int MESSAGE_ID = 0x1;@BindView(R.id.web_view_details)WebView mWebViewDetails;private String mUrl, mHtml;@Overrideprotected int getLayoutId() {return R.layout.activity_details;}@Overrideprotected void initView() {ButterKnife.bind(this);}@Overrideprotected void initData() {mUrl = getIntent().getStringExtra("linkUrl");Log.e("mUrl", "initData: "+ mUrl);getData(mUrl);}@Overrideprotected void initData() {mUrl = getIntent().getStringExtra("linkUrl");Log.e("mUrl", "initView: " + mUrl);new Thread(new Runnable() {@Overridepublic void run() {try {Document dm = Jsoup.connect(mUrl).get();Elements dmMain = dm.select("div#list");Log.e("dmmain", "dmmain: " + dmMain);Elements li = dmMain.select("li");for (int i = 0; i < li.size(); i++) {mListEntity = new ListEntity();Element mLi = li.get(i);Log.e("mLi", "mLi: " + mLi);Elements links = mLi.select("a[href]");Log.e("links", "links: " + links);String text = links.text();if (links != null) {screenData(i,links);
//                            mListEntity.setImg(links.attr("href"));
//                            mListEntity.setTitle(links.text());
//                            mList.add(mListEntity);}}Elements dmPdjs = dm.select("div#pdjs");Log.e("dmPdjs", "dmPdjs: " + dmPdjs);dmPdjs.select("div#bdshare").attr("hidden", "hidden");dmPdjs.select("p a").attr("style", "color:black;text-decoration:none;");mHtml = dmPdjs.html();//dmMain.html() +
//                    if (mUrl.contains("http://m.zhiboo.net/")) {//                        dmRow.select("div.video-box video").attr("preload", "auto");
//                        dmRow.select("div.video-box video").attr("data-setup", "{}");
//                        dmRow.select("div.video-box video").attr("tabindex", "-1");
//                        //后面加的,还有先前的代码,才出现全部按钮
                        dmRow.select("div.video-box video").attr("x-webkit-airplay", "true");
                        dmRow.select("div.video-box video").attr("x5-playsinline", "");
                        dmRow.select("div.video-box video").attr("playsinline", "");
                        dmRow.select("div.video-box video").attr("webkit-playsinline", "");
                        dmRow.select("div.video-box video").attr("x5-video-player-type", "h5");
                        dmRow.select("div.video-box video").attr("x5-video-player-fullscreen", "true");
//                        Elements dmRowA = dmRow.select("div.video-box");
//                        mHtml = dmRowA.html();
//                        //Log.e("dmRowA", "dmRowA: " + dmRowA.html());
//                        Log.e("mHtml", "mHtml: " + mHtml);
                        mHtml = dm.outerHtml();
//                    } else {//                        dmRow.select("div.wexin").attr("hidden", "hidden");
//                        dmRow.select("div.box-title").attr("hidden", "hidden");
//                        dmRow.select("div.pic_index_list").attr("hidden", "hidden");
//                        dmRow.select("div.player-list").attr("hidden", "hidden");
//                        dmRow.select("div.player-info").attr("hidden", "hidden");
//
//                        mHtml = dmRow.html();
//                        Log.e("dmRow", "dmRow: " + mHtml);
//                    }//Elements dmUl = dm.select("div.column_wrapper_1000_xw_160113");//dm.select("div.column_wrapper_160119").attr("hidden", "hidden");//mHtml = dm.outerHtml();//Elements dmP = dmUl.select("p.subinfo");//dmUl.select("p.subinfo a").attr("onclick", "return false;");//dmUl.select("p.subinfo a").attr("style", "color:black;text-decoration:none;");//Elements signtext = dmRow.select("div.player-obj");//带有href属性的a元素//Elements links = dmUl.select("a[href]");//umls = links.attr("href");//Log.e("umls", "run: " + umls);//title = dmRowA.text();//mSigntext = signtext.text();//mHtml = dmUl.outerHtml() + signtext.outerHtml();} catch (IOException pE) {pE.printStackTrace();}//通过mHandler对象的obtainMessage()//方法得到一个消息msg对象实例Message msg = mHandler.obtainMessage();//封装消息IDmsg.what = MESSAGE_ID;//通过mHandler对象将消息发送出去mHandler.sendMessage(msg);}}).start();}//创建一个Handler局部类对象Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {//得到封装的消息ID进行匹配if (MESSAGE_ID == msg.what) {setWebView();}}};private void setWebView() {WebSettings webSettings = mWebViewDetails.getSettings();// 支持javascriptwebSettings.setJavaScriptEnabled(true);// 支持使用localStorage(H5页面的支持)webSettings.setDomStorageEnabled(true);// 支持数据库webSettings.setDatabaseEnabled(true);// 支持缓webSettings.setAppCacheEnabled(true);String appCaceDir = this.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();webSettings.setAppCachePath(appCaceDir);// 设置可以支持缩放webSettings.setUseWideViewPort(true);// 扩大比例的缩放webSettings.setSupportZoom(true);webSettings.setBuiltInZoomControls(true);// 隐藏缩放按钮webSettings.setDisplayZoomControls(false);// 自适应屏幕webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);webSettings.setLoadWithOverviewMode(true);// 隐藏滚动条mWebViewDetails.setHorizontalScrollBarEnabled(false);mWebViewDetails.setVerticalScrollBarEnabled(false);mWebViewDetails.loadDataWithBaseURL(null, getHtmlData(mHtml), "text/html;charset=utf-8", "utf-8", null);mWebViewDetails.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {if (url.contains("http://m.tingshouyinji.cn/play.php?id=")) {getData(url);} else {mWebViewDetails.loadUrl(url);}return true;}@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {url = url.toLowerCase();Log.e("view-url", "shouldOverrideUrlLoading: " + url);return super.shouldInterceptRequest(view, url);}});// 使用返回键的方式防止网页重定向mWebViewDetails.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {if (event.getAction() == KeyEvent.ACTION_DOWN) {if (keyCode == KeyEvent.KEYCODE_BACK && mWebViewDetails.canGoBack()) {mWebViewDetails.goBack();//WebView返回键退出还在播放mWebViewDetails.loadUrl("about:blank");return true;}}return false;}});}private String getHtmlData(String bodyHTML) {String head = "<head>" +"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\"> " +"<style>html{padding:15px;} body{word-wrap:break-word;font-size:13px;padding:0px;margin:0px}" +" p{padding:0px;margin:0px;font-size:13px;color:#222222;line-height:1.3;} " +"img{padding:0px,margin:0px;max-width:100%; width:auto; height:auto;}</style>" +"</head>";return "<html>" + head + "<body>" + bodyHTML + "</body></html>";}

WebView在Fragment中返回键的处理

在build.gradle添加

dependencies {implementation 'com.github.ikidou:FragmentBackHandler:2.1'
}

Fragment extends FragmentBackHandler

    /*** 处理返回键* @return*/@Overridepublic boolean onBackPressed() {if (videowebview.canGoBack()) {videowebview.goBack();// 让WebView回退到上一个网页return true;} else {videowebview.loadUrl("about:blank");// mTestWebView.loadData("", "text/html; charset=UTF-8", null);getActivity().finish();}return BackHandlerHelper.handleBackPress(this);}

获取当前页面的HTML

页面加载结束后获取当前页面HTML。

    yourWebView.evaluateJavascript("(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();",new ValueCallback<String>() {@Overridepublic void onReceiveValue(String html) {Log.d("HTML", html);// Here you work with the content of the page which is stored in the 'html' variable}});

参考链接(排名不分先后):

  • https://blog.csdn.net/yllp_1230/article/details/80655350
  • https://blog.csdn.net/abc6368765/article/details/52797111
  • https://blog.csdn.net/q232916067/article/details/82745853
  • https://www.jianshu.com/p/6e69332cf946
  • https://blog.csdn.net/maqianli23/article/details/53556467
  • https://www.jianshu.com/p/29ecf8c2c454
  • https://www.jianshu.com/p/fae23fcd5df2
  • 。。。

Android WebView 进价高级使用相关推荐

  1. Android WebView访问SSL证书网页(onReceivedSslError)

    Android WebView访问https SSL证书网页,如淘宝,需要在onReceivedSslError添加SSL支持 webview.setWebViewClient(new WebView ...

  2. android webview java_Android Webview中调用本地java方法

    在网页调用本地的分享SDK class JsObject { @JavascriptInterface public String toString() { return "injected ...

  3. android的webView的教程,Android WebView 应用界面开发教程

    WebView组件本身就是一个浏览器实现,Android5.0增强的WebView基于Chromium M37,直接支持WebRTC.WebAudio.WebGL.开发者可以直接在WebView中使用 ...

  4. Android WebView 支持H5图片上传input type=file

    2019独角兽企业重金招聘Python工程师标准>>> Android WebView 缓存处理 Android WebView 支持H5图片上传<input type=&qu ...

  5. Chrome 调试 Android WebView 网页

    手机开启开发者模式,并且Usb 连接到电脑 Android webView 开启调试模式 mWebView.setWebContentsDebuggingEnabled(true); Chrome 浏 ...

  6. Android webview 写入cookie的解决方法以及一些属性设置

    Android webview 写入cookie的解决方法以及一些属性设置 参考文章: (1)Android webview 写入cookie的解决方法以及一些属性设置 (2)https://www. ...

  7. android url webview,android - webview获取到当前页面的url

    android - webview获取到当前页面的url 2017-10-23 08:54 访问量: 2958 分类: 技术 使用 webview.getUrl() 即可. 可以完美返回  a.com ...

  8. Android Webview H5 秒开方案实现

    本文首发于微信公众号「玉刚说」 原文链接:Android Webview H5 秒开方案实现 前言 现在许多app都嵌入了H5页面, 然而WebView加载速度慢这个问题却一直影响着用户的体验, 所以 ...

  9. Android WebView 性能优化

    原文出处:http://motalks.cn/2016/09/11/Android-WebView-JavaScript-3/ WebView相关阅读 Android WebView 和 javaSc ...

  10. Android WebView 和 javaScript的互相调用(三)

    原文出处:http://motalks.cn/2016/08/27/Android-WebView-JavaScript-2/ WebView相关阅读 Android WebView 和 javaSc ...

最新文章

  1. Omi框架学习之旅 - 生命周期 及原理说明
  2. 【Python】快速设置 pip 源
  3. OpenID 和 OAuth 的区别及第三方登录的安全隐患分析
  4. ​电赛 | 19年全国一等奖,北航学子回忆录(上)
  5. 深度学习之生成对抗网络(6)GAN训练难题
  6. if的作用域问题 *输出1~6的随机数*
  7. nessus重置密码
  8. Canal Mysql binlog 同步至 ElasticSearch 详细介绍
  9. 报告:2015年数据中心SDN市场将增长70%
  10. 【优化布局】基于matlab GUI遗传算法求解PCB元器件布局优化问题【含Matlab源码 694期】
  11. 小米格式化fastboot_小米fastboot刷机教程
  12. 人工智能与心理学(人工智能最终方向)
  13. If you already have a 64-bit JDK installed 解决方法
  14. 漫威宇宙影视作品及观看顺序
  15. c语言 指针 pdf,彻底搞定C指针.pdf
  16. 新手建站之【域名解析】⑦
  17. Excel导出(浏览器下载器下载导出Excel)
  18. 【归并排序】【洛谷】【P1309-瑞士轮】
  19. social-GAN
  20. Java并发编程 - 共享模型之管程

热门文章

  1. php onblur=,onblur
  2. PostgreSQL数据库概述
  3. AUTOSAR工程师,年薪50W?
  4. 降雪致国道315线部分道路通行受阻公路交警部门昼夜坚守
  5. 【RuoYi-Vue-Plus】学习笔记 02 - OSS模块(二)之文件上传(使用MinIO基于Win10环境)
  6. css三角形的IE兼容写法
  7. 最全面计算机英语单词列表(二)
  8. 202102-一个小屁民的若有所思
  9. WTL 自绘控件库 (CQsCheckBox)
  10. 大一python期末总结