文章目录
- 无网络或加载错误时显示本地HTML
- 修改网站logo图
- 长按可以下载图片
- 支持视频全屏播放
- 禁止页面下载App
- 过滤掉烦人的广告
- 支持网页版微信支付
- 支持网页版支付宝付款
- 支持第三方QQ一键登录
- 通过jsoup修改页面内容
- 通过注入JS代码 修改网页内容
- WebView在Fragment中返回键的处理
- 。。。
无网络或加载错误时显示本地HTML
WebView加载网页,那么,自然是有加载错误的时候,或者手机无网络连接,这时总不能显示空白吧!显示本地html5提示用户无网络或是无数据界面。
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
videowebview.loadUrl("file:///android_asset/error.html");
}
修改网站logo图
@Override
public 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);
@Override
public 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() {
@Override
public void onClick(View v) {
downLoad(imageUrl, false);
alertDialog.dismiss();
}
});
dialogView.findViewById(R.id.wall_tv).setOnClickListener(
new View.OnClickListener() {
@Override
public 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 {
@Override
public 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.apk
if (!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"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<TextView
android: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"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/black"/>
<TextView
android: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.ConstraintLayout
xmlns: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">
<FrameLayout
android:id="@+id/video_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone" >
</FrameLayout>
<WebView
android: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 orientation
setRequestedOrientation(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);
}
// 视频加载添加默认图标
@Override
public Bitmap getDefaultVideoPoster() {
if (xdefaltvideo == null) {
xdefaltvideo = BitmapFactory.decodeResource(getResources(), R.drawable.videoicon);
}
return xdefaltvideo;
}
// 视频加载时进程loading
@Override
public 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() {
@Override
public 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);
}
}
});
过滤掉烦人的广告
@Override
public 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>
支持网页版微信支付
@Override
public 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 Lollipop
if (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//设置不用系统浏览器打开,直接显示在当前Webview
public 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();代码是重点,
@Override
protected 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代码 修改网页内容
/**
* 页面加载结束时调用
* @param view
* @param url
*/
@Override
public void onPageFinished(WebView view, String url) {
// hide element by class name
view.loadUrl("javascript:(function() { document.getElementsByClassName('hashover')[0].style.display='none'; })()");
// hide element by id
view.loadUrl("javascript:(function() { document.getElementById('hashover').style.display='none';})()");
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;
@Override
protected int getLayoutId() {
return R.layout.activity_details;
}
@Override
protected void initView() {
ButterKnife.bind(this);
}
@Override
protected void initData() {
mUrl = getIntent().getStringExtra("linkUrl");
Log.e("mUrl", "initData: "+ mUrl);
getData(mUrl);
}
@Override
protected void initData() {
mUrl = getIntent().getStringExtra("linkUrl");
Log.e("mUrl", "initView: " + mUrl);
new Thread(new Runnable() {
@Override
public 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();
//封装消息ID
msg.what = MESSAGE_ID;
//通过mHandler对象将消息发送出去
mHandler.sendMessage(msg);
}
}).start();
}
//创建一个Handler局部类对象
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
//得到封装的消息ID进行匹配
if (MESSAGE_ID == msg.what) {
setWebView();
}
}
};
private void setWebView() {
WebSettings webSettings = mWebViewDetails.getSettings();
// 支持javascript
webSettings.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() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.contains("http://m.tingshouyinji.cn/play.php?id=")) {
getData(url);
} else {
mWebViewDetails.loadUrl(url);
}
return true;
}
@Override
public 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() {
@Override
public 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
*/
@Override
public 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>() {
@Override
public void onReceiveValue(String html) {
Log.d("HTML", html);
// Here you work with the content of the page which is stored in the 'html' variable
}
});
补充
隐藏单个标签元素
// 隐藏底部栏方法
private void hideBottom() {
try {
//定义javaScript方法
String javascript = "javascript:function hideBottom() { "
+ "document.getElementsByClassName('weex')[0].style.display='none'"
+ "}";
//加载方法
mWebView.loadUrl(javascript);
//执行方法
mWebView.loadUrl("javascript:hideBottom();");
} catch (Exception e) {
e.printStackTrace();
}
}
隐藏多个相同标签元素
@Override
public void onPageFinished(WebView webView, String s) {//xhm
super.onPageFinished(webView, s);
//定义javaScript方法
String javascript = "javascript:function hideBottom() { "
+ "var bar = document.querySelectorAll('.bar');"
+ "for(i=0;i<bar.length;i++){ "
+ "bar[i].style.display='none';}"
+ "}";
//加载方法
webView.loadUrl(javascript);
//执行方法
webView.loadUrl("javascript:hideBottom();");
}
参考链接(排名不分先后):
- https://blog.youkuaiyun.com/yllp_1230/article/details/80655350
- https://blog.youkuaiyun.com/abc6368765/article/details/52797111
- https://blog.youkuaiyun.com/q232916067/article/details/82745853
- https://www.jianshu.com/p/6e69332cf946
- https://blog.youkuaiyun.com/maqianli23/article/details/53556467
- https://www.jianshu.com/p/29ecf8c2c454
- https://www.jianshu.com/p/fae23fcd5df2
- 。。。