WebView长按保存图片;WebView不跳转到系统的浏览器;WebView加载显示进度条;WebView返回事件处理;
直接看代码即可,代码里面注释写的很清楚,这个类拉下来就能用;
写法和命名比较粗暴,但也简单易懂;
public class MainActivity extends AppCompatActivity {
private final String TAG = MainActivity.this.getClass().getSimpleName();
private WebView wv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
QbSdk.initX5Environment(this,null); //最好在application中
getWindow().setFormat(PixelFormat.TRANSLUCENT);
wv = findViewById(R.id.wv);
final ProgressBar pb = findViewById(R.id.pb);
wv.loadUrl("https://github.com/CuiChenbo/CcMall");
wv.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
//重写此方法 可让webview不跳转到系统的浏览器
webView.loadUrl(url);
return super.shouldOverrideUrlLoading(webView, url);
}
});
wv.setWebChromeClient(new WebChromeClient(){
//WebView进度的回调监听
@Override
public void onProgressChanged(WebView webView, int i) {
super.onProgressChanged(webView, i);
if (i>=100){
pb.setProgress(100);
pb.setVisibility(View.GONE);
}else {
pb.setProgress(i);
}
}
//JS Alert的监听 可用来做和js(H5)的交互
@Override
public boolean onJsAlert(WebView webView, String s, String s1, JsResult jsResult) {
return super.onJsAlert(webView, s, s1, jsResult);
}
//JsConfirm的监听
@Override
public boolean onJsConfirm(WebView webView, String s, String s1, JsResult jsResult) {
return super.onJsConfirm(webView, s, s1, jsResult);
}
//JsPrompt 的监听 可用来做和js(H5)的交互
@Override
public boolean onJsPrompt(WebView webView, String s, String s1, String s2, JsPromptResult jsPromptResult) {
return super.onJsPrompt(webView, s, s1, s2, jsPromptResult);
}
});
//WebView长按的监听
wv.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
WebView.HitTestResult hitTestResult = wv.getHitTestResult();
int type = hitTestResult.getType(); //获取触摸点的类型
final String extra = hitTestResult.getExtra(); //获取触摸点的数据
Log.i(TAG, "type:"+type+"____extra:"+extra);
if (type == WebView.HitTestResult.IMAGE_TYPE||type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE){
//说明触摸点的这个类型是图片类 去提示下载图片
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("提示")
.setMessage("是否保存图片")
.setPositiveButton("保存", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
SeveImage(extra);
}
})
.setNegativeButton("取消",null)
.show();
return true;
}else {
return false;
}
}
});
}
//保存图片
private void SeveImage(String extra) {
DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
Uri uri = Uri.parse(extra);
DownloadManager.Request request = new DownloadManager.Request(uri);
//设置允许使用的网络类型,这里是移动网络和wifi都可以
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
// 允许媒体扫描,根据下载的文件类型被加入相册、音乐等媒体库
request.allowScanningByMediaScanner();
//禁止发出通知,既后台下载,如果要使用这一句必须声明一个权限:android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
request.setShowRunningNotification(false);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//不显示下载界面
request.setVisibleInDownloadsUi(true);
request.setDestinationInExternalFilesDir(MainActivity.this, Environment.DIRECTORY_PICTURES, System.currentTimeMillis() + ".jpg");
//*设置下载后文件存放的位置,如果sdcard不可用,那么设置这个将报错,因此最好不设置如果sdcard可用,下载后的文件 在/mnt/sdcard/Android/data/packageName/files目录下面,如果sdcard不可用,设置了下面这个将报错,不设置,下载后的文件在/cache这个 目录下面*//*
//request.setDestinationInExternalFilesDir(this, null, "tar.apk");
long id = downloadManager.enqueue(request);
IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
DownloadMangerReceiver mDownloadMangerReceiver = new DownloadMangerReceiver();
registerReceiver(mDownloadMangerReceiver, intentFilter);
}
//保存图片的监听
class DownloadMangerReceiver extends BroadcastReceiver {
private DownloadManager manager;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
manager =(DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
Toast.makeText(context, "文件下载完成", Toast.LENGTH_SHORT).show();
/*
* 获取下载完成对应的下载ID, 这里下载完成指的不是下载成功, 下载失败也算是下载完成,
* 所以接收到下载完成广播后, 还需要根据 id 手动查询对应下载请求的成功与失败.
*/
// 根据获取到的ID,使用上面第3步的方法查询是否下载成功
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//改写物理返回键的逻辑
if(keyCode== KeyEvent.KEYCODE_BACK) {
if(wv.canGoBack()) {
wv.goBack();//返回上一页面
return true;
} else {
System.exit(0);//退出程序
}
}
return super.onKeyDown(keyCode, event);
}
}
layout布局文件也看一下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent"
>
<ProgressBar
android:id="@+id/pb"
android:layout_width="match_parent"
android:layout_height="2dp"
android:max="100"
android:background="@color/colorAccent"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
/>
<com.tencent.smtt.sdk.WebView
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/wv"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ccb.pactera.x5webview.MainActivity"> </com.tencent.smtt.sdk.WebView>
</LinearLayout>
com.tencent.smtt.sdk.WebView是我用的X5WebView,有兴趣的可以去看一下:X5WebView
WebView长按保存图片;WebView不跳转到系统的浏览器;WebView加载显示进度条;WebView返回事件处理;的更多相关文章
- vue:使用不同参数跳转同一组件,实现动态加载图片和数据,以及利用localStorage和vuex持久化数据
需求:通过不同的参数复用同一组件,实现动态加载数据和图片,同时,在页面刷新时,图片依旧可以加载成功. 过程出现的bug和问题: 1.使用params传参后,再次刷新页面,参数丢失导致数据无法再次加载 ...
- webview长按保存图片
private String imgurl = ""; /*** * 功能:长按图片保存到手机 */ @Override public void onC ...
- java的跳转和重定向,加载显示层
HttpServltRequest req, HttpDervletResponse resp 的 req.sendRedirect('页面');跳转到页面 浏览器地址跳转 --------- ...
- selenium模块跳过用户名密码验证码输入,加载浏览器标签和cookie,进行翻页爬虫多页动态加载的数据(js)
能解决登陆一次后,之后不需要二次登陆的动态加载数据,网页保存的cookie和标签,加入到selenium自动化测试浏览器中 1 from selenium import webdriver 2 imp ...
- ios开发之--给WebView加载进度条
不是新东西,就是在项目里面用到H5页面的时候,中间加载延迟的时候,在最上面加载一个进度条,代码如下: // 获取屏幕 宽度.高度 bounds就是屏幕的全部区域 #define KDeviceWidt ...
- WebView之加载网页时增加进度提示
上一节讲了一些webview的基本使用以及在记载网页时如何屏蔽掉第三方浏览器,使我们自己开发的程序成为一个微型浏览器.那么这一节将一下在webView加载网页的过程中如何加上进度提示.效果图如下: 主 ...
- IOS WebView修改contentInset 导致webview长按弹出菜单跳动的解决方法
最近在项目中需要用到webview 加载H5 并且在webview 底部使用原生UI添加其他空间比如广告.或者评论(Scrollview) 最初使用修改webview中scrollview 的cont ...
- Android WebView加载本地html并实现Java与JS交互
最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ...
- WebView的使用及添加进度条
实现的效果比较简单类似于微信打开网页,头部有个进度条显示加载进度 下载地址:http://download.csdn.net/detail/qq_29774291/9666941 1.在安卓端加载一个 ...
随机推荐
- tomcat源码阅读之集群
一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...
- 混合pyqt和qtcreator
目的:测试能否用qtcreator编辑ui资源,而用python编写代码逻辑 import sysfrom PyQt4 import QtGui, uic class MyWindow(QtGui.Q ...
- 关联本地文件夹到 GitLab 项目
关联本地文件夹到 GitLab 项目的 dev 分支: rm -rf .git git init git remote add origin git pull git checkout dev git ...
- pyquery的使用
常用的三种初始化方法: 1.字符串初始化: from pyquery import PyQuery as pq html=""" <html> <hea ...
- 大数据离线分析平台 JSSDK数据收集引擎编写
JsSDK设计规则在js sdk中我们需要收集launch.pageview.chargeRequest和eventDuration四种数据,所以我们需要在js中写入四个方法来分别收集这些数据,另外我 ...
- MySQL数据库优化小建议
背景 “那啥,你过来一下!” “怎么了?我代码都单元测试了的,没出问题啊!”我一脸懵逼跑到运维大佬旁边. “你看看!你看看!多少条报警,赶快优化一下!”运维大佬短信列表里面好多MySQL CPU 10 ...
- Kafka Stream
Kafka Stream是Apache Kafka从0.10版本引入的一个新Feature(当前:1.0.0-rc0,参见:https://github.com/apache/kafka/releas ...
- c# 几种常见的弹框方法
1.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('第一行'); ...
- 《LOST》 电视
还没看正剧,所以转来帮助看电视 从起源到终点:<LOST>剧情全解析(一) 此文是LOST完结之后的剧情解析,剧透,慎入 从起源到终点:<LOST>剧情全解析(一) 转 ...
- 一个OpenGL小程序
发个没什么技术含量的文,最近准备通过opengl的学习来好好c++,于是找了网上的教程来搭建opengl的编写环境,建了个空项目,又找了个案例稍微改了改运行了下,还成,ok了~喜不自禁~ 贴个图: 代 ...