Android使用webView长按保存下载网络图片
本文实例为大家分享了Android使用webView长按保存下载网络图片的具体代码,供大家参考,具体内容如下
最近发现在webView的setOnLongClickListener中可以获取到WebView.HitTestResult,根据获取的HitTestResult的Type来判断做不同的处理。通过判断Type的类型获取点击图片的url,然后把图片下载到本地,发送广播通知系统图库进行更新,在系统图库中查看下载的图片。运行Demo在网页中对图片做长按点击即可下载网络图片
直接上代码:
下面附有Demo下载:点击打开链接
packagedemo.sam.webview_demo;
importandroid.app.Activity;
importandroid.app.Dialog;
importandroid.content.Context;
importandroid.content.DialogInterface;
importandroid.content.Intent;
importandroid.net.Uri;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.provider.MediaStore;
importandroid.support.v7.app.AlertDialog;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.text.Editable;
importandroid.util.Log;
importandroid.view.KeyEvent;
importandroid.view.View;
importandroid.webkit.WebChromeClient;
importandroid.webkit.WebResourceRequest;
importandroid.webkit.WebSettings;
importandroid.webkit.WebView;
importandroid.webkit.WebViewClient;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.ProgressBar;
importandroid.widget.Toast;
importjava.io.FileNotFoundException;
publicclassMainActivityextendsActivity{
privateProgressBarprogress;
privateWebViewwebView;
privateEditTexteditText;
privateButtonclick;
privateContextcontext;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context=this;
initView();
initData();
initListener();
}
privatevoidinitData(){
WebSettingssettings=webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setUseWideViewPort(true);//设置此属性,可任意比例缩放
settings.setLoadWithOverviewMode(true);
//使页面支持缩放
settings.setBuiltInZoomControls(true);
settings.setSupportZoom(true);
//支持自动加载图片
settings.setLoadsImagesAutomatically(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//排版适应屏幕
//缩放按钮
settings.setDisplayZoomControls(false);
webView.setWebViewClient(newWebViewClient(){
//页面在当前页面跳转
@Override
publicbooleanshouldOverrideUrlLoading(WebViewview,WebResourceRequestrequest){
returnsuper.shouldOverrideUrlLoading(view,request);
}
//页面加载结束
@Override
publicvoidonPageFinished(WebViewview,Stringurl){
super.onPageFinished(view,url);
if(progress!=null){
progress.setVisibility(View.GONE);
}
}
});
}
privatevoidinitView(){
progress=(ProgressBar)findViewById(R.id.progress);
webView=(WebView)findViewById(R.id.webView);
editText=(EditText)findViewById(R.id.url);
click=(Button)findViewById(R.id.click);
}
privatevoidinitListener(){
//网页加载进度显示
webView.setWebChromeClient(newWebChromeClient(){
@Override
publicvoidonProgressChanged(WebViewview,intnewProgress){
super.onProgressChanged(view,newProgress);
progress.setVisibility(View.VISIBLE);
progress.setProgress(newProgress);
}
});
click.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
Log.e("输入的网站",editText.getText().toString().trim());
webView.loadUrl(editText.getText().toString().trim());
}
});
//长按点击事件
webView.setOnLongClickListener(newView.OnLongClickListener(){
@Override
publicbooleanonLongClick(Viewview){
finalWebView.HitTestResulthitTestResult=webView.getHitTestResult();
//如果是图片类型或者是带有图片链接的类型
if(hitTestResult.getType()==WebView.HitTestResult.IMAGE_TYPE||
hitTestResult.getType()==WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE){
//弹出保存图片的对话框
AlertDialog.Builderbuilder=newAlertDialog.Builder(context);
builder.setTitle("提示");
builder.setMessage("保存图片到本地");
builder.setPositiveButton("确认",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialogInterface,inti){
Stringurl=hitTestResult.getExtra();
//下载图片到本地
DownPicUtil.downPic(url,newDownPicUtil.DownFinishListener(){
@Override
publicvoidgetDownPath(Strings){
Toast.makeText(context,"下载完成",Toast.LENGTH_LONG).show();
Messagemsg=Message.obtain();
msg.obj=s;
handler.sendMessage(msg);
}
});
}
});
builder.setNegativeButton("取消",newDialogInterface.OnClickListener(){
//自动dismiss
@Override
publicvoidonClick(DialogInterfacedialogInterface,inti){
}
});
AlertDialogdialog=builder.create();
dialog.show();
}
returntrue;
}
});
webView.loadUrl("http://www.baidu.com");
}
Handlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
StringpicFile=(String)msg.obj;
String[]split=picFile.split("/");
StringfileName=split[split.length-1];
try{
MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(),picFile,fileName,null);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}
//最后通知图库更新
getApplicationContext().sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.parse("file://"+picFile)));
Toast.makeText(context,"图片保存图库成功",Toast.LENGTH_LONG).show();
}
};
//监听返回键返回网页的上一层
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_BACK&&webView.canGoBack()){
if(webView!=null){
webView.goBack();
returntrue;
}
}
returnsuper.onKeyDown(keyCode,event);
}
}
图片下载的工具类
importandroid.os.AsyncTask;
importandroid.os.Environment;
importandroid.util.Log;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.URL;
importjava.util.Random;
/**
*图片下载的工具类
*/
publicclassDownPicUtil{
/**
*下载图片,返回图片的地址
*@paramurl
*/
publicstaticvoiddownPic(Stringurl,DownFinishListenerdownFinishListener){
//获取存储卡的目录
StringfilePath=Environment.getExternalStorageDirectory().getPath();
Filefile=newFile(filePath+File.separator+"webViewCache");
if(!file.exists()){
file.mkdir();
}
loadPic(file.getPath(),url,downFinishListener);
}
privatestaticvoidloadPic(finalStringfilePath,finalStringurl,finalDownFinishListenerdownFinishListener){
Log.e("下载图片的url",url);
newAsyncTask(){
StringfileName;
InputStreamis;
OutputStreamout;
@Override
protectedStringdoInBackground(Void...voids){
//下载文件的名称
String[]split=url.split("/");
StringnewString=split[split.length-1];
fileName=newString.substring(newString.length()-20,newString.length()-1);
//创建目标文件,不是文件夹
FilepicFile=newFile(filePath+File.separator+fileName);
if(picFile.exists()){
returnpicFile.getPath();
}
try{
URLpicUrl=newURL(url);
//通过图片的链接打开输入流
is=picUrl.openStream();
if(is==null){
returnnull;
}
out=newFileOutputStream(picFile);
byte[]b=newbyte[1024];
intend;
while((end=is.read(b))!=-1){
out.write(b,0,end);
}
Log.e("OK??","----------");
if(is!=null){
is.close();
}
if(out!=null){
out.close();
}
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnpicFile.getPath();
}
@Override
protectedvoidonPostExecute(Strings){
super.onPostExecute(s);
if(s!=null){
downFinishListener.getDownPath(s);
}
}
}.execute();
}
//下载完成回调的接口
publicinterfaceDownFinishListener{
voidgetDownPath(Strings);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。