当前位置: 移动技术网 > IT编程>移动开发>Android > Android使用webView长按保存下载网络图片

Android使用webView长按保存下载网络图片

2019年09月06日  | 移动技术网IT编程  | 我要评论

沈崇案,食品添加剂论文,pretty boy伴奏

本文实例为大家分享了android使用webview长按保存下载网络图片的具体代码,供大家参考,具体内容如下

最近发现在webview的setonlongclicklistener中可以获取到webview.hittestresult,根据获取的hittestresult的type来判断做不同的处理。通过判断type的类型获取点击图片的url,然后把图片下载到本地,发送广播通知系统图库进行更新,在系统图库中查看下载的图片。运行demo在网页中对图片做长按点击即可下载网络图片

直接上代码:

下面附有demo下载:点击

package demo.sam.webview_demo; 

import android.app.activity; 
import android.app.dialog; 
import android.content.context; 
import android.content.dialoginterface; 
import android.content.intent; 
import android.net.uri; 
import android.os.handler; 
import android.os.message; 
import android.provider.mediastore; 
import android.support.v7.app.alertdialog; 
import android.support.v7.app.appcompatactivity; 
import android.os.bundle; 
import android.text.editable; 
import android.util.log; 
import android.view.keyevent; 
import android.view.view; 
import android.webkit.webchromeclient; 
import android.webkit.webresourcerequest; 
import android.webkit.websettings; 
import android.webkit.webview; 
import android.webkit.webviewclient; 
import android.widget.button; 
import android.widget.edittext; 
import android.widget.progressbar; 
import android.widget.toast; 

import java.io.filenotfoundexception; 

public class mainactivity extends activity { 

 private progressbar progress; 
 private webview webview; 
 private edittext edittext; 
 private button click; 
 private context context; 


 @override 
 protected void oncreate(bundle savedinstancestate) { 
  super.oncreate(savedinstancestate); 
  setcontentview(r.layout.activity_main); 
  context= this; 
  initview(); 
  initdata(); 
  initlistener(); 



 } 

 private void initdata() { 
  websettings settings = 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(new webviewclient(){ 

   // 页面在当前页面跳转 
   @override 
   public boolean shouldoverrideurlloading(webview view, webresourcerequest request) { 
    return super.shouldoverrideurlloading(view, request); 
   } 

   // 页面加载结束 
   @override 
   public void onpagefinished(webview view, string url) { 
    super.onpagefinished(view, url); 
    if(progress!=null){ 
     progress.setvisibility(view.gone); 
    } 
   } 
  }); 

 } 

 private void initview() { 
  progress = (progressbar) findviewbyid(r.id.progress); 
  webview = (webview) findviewbyid(r.id.webview); 
  edittext = (edittext) findviewbyid(r.id.url); 
  click = (button) findviewbyid(r.id.click); 
 } 

 private void initlistener() { 
  // 网页加载进度显示 
  webview.setwebchromeclient(new webchromeclient(){ 
   @override 
   public void onprogresschanged(webview view, int newprogress) { 
    super.onprogresschanged(view, newprogress); 
    progress.setvisibility(view.visible); 
    progress.setprogress(newprogress); 
   } 
  }); 

  click.setonclicklistener(new view.onclicklistener() { 
   @override 
   public void onclick(view view) { 
    log.e("输入的网站",edittext.gettext().tostring().trim()); 
    webview.loadurl(edittext.gettext().tostring().trim()); 
   } 
  }); 

  // 长按点击事件 
  webview.setonlongclicklistener(new view.onlongclicklistener() { 
   @override 
   public boolean onlongclick(view view) { 
    final webview.hittestresult hittestresult = webview.gethittestresult(); 
    // 如果是图片类型或者是带有图片链接的类型 
    if(hittestresult.gettype()== webview.hittestresult.image_type|| 
      hittestresult.gettype()== webview.hittestresult.src_image_anchor_type){ 
     // 弹出保存图片的对话框 
     alertdialog.builder builder = new alertdialog.builder(context); 
     builder.settitle("提示"); 
     builder.setmessage("保存图片到本地"); 
     builder.setpositivebutton("确认", new dialoginterface.onclicklistener() { 
      @override 
      public void onclick(dialoginterface dialoginterface, int i) { 
       string url = hittestresult.getextra(); 
       // 下载图片到本地 
       downpicutil.downpic(url, new downpicutil.downfinishlistener(){ 

        @override 
        public void getdownpath(string s) { 
         toast.maketext(context,"下载完成",toast.length_long).show(); 
         message msg = message.obtain(); 
         msg.obj=s; 
         handler.sendmessage(msg); 
        } 
       }); 

      } 
     }); 
     builder.setnegativebutton("取消", new dialoginterface.onclicklistener() { 
      // 自动dismiss 
      @override 
      public void onclick(dialoginterface dialoginterface, int i) { 
      } 
     }); 
     alertdialog dialog = builder.create(); 
     dialog.show(); 
    } 
    return true; 
   } 
  }); 

  webview.loadurl("http://www.baidu.com"); 
 } 

 handler handler =new handler(){ 
  @override 
  public void handlemessage(message msg) { 
   super.handlemessage(msg); 
   string picfile = (string) msg.obj; 
   string[] split = picfile.split("/"); 
   string filename = split[split.length-1]; 
   try { 
    mediastore.images.media.insertimage(getapplicationcontext().getcontentresolver(), picfile, filename, null); 
   } catch (filenotfoundexception e) { 
    e.printstacktrace(); 
   } 
   // 最后通知图库更新 
   getapplicationcontext().sendbroadcast(new intent(intent.action_media_scanner_scan_file, uri.parse("file://" + picfile))); 
   toast.maketext(context,"图片保存图库成功",toast.length_long).show(); 
  } 
 }; 


 // 监听返回键返回网页的上一层 
 @override 
 public boolean onkeydown(int keycode, keyevent event) { 
  if(keycode == keyevent.keycode_back && webview.cangoback()){ 
   if(webview != null){ 
    webview.goback(); 
    return true; 
   } 
  } 
  return super.onkeydown(keycode, event); 
 } 

} 

图片下载的工具类

import android.os.asynctask; 
import android.os.environment; 
import android.util.log; 

import java.io.file; 
import java.io.filenotfoundexception; 
import java.io.fileoutputstream; 
import java.io.ioexception; 
import java.io.inputstream; 
import java.io.outputstream; 
import java.net.url; 
import java.util.random; 

/** 
 * 图片下载的工具类 
 */ 
public class downpicutil { 

 /** 
  *下载图片,返回图片的地址 
  * @param url 
  */ 
 public static void downpic(string url,downfinishlistener downfinishlistener){ 
  // 获取存储卡的目录 
  string filepath = environment.getexternalstoragedirectory().getpath(); 
  file file = new file(filepath+file.separator+"webviewcache"); 
  if(!file.exists()){ 
   file.mkdir(); 
  } 

  loadpic(file.getpath(),url,downfinishlistener); 

 } 

 private static void loadpic(final string filepath, final string url, final downfinishlistener downfinishlistener) { 
  log.e("下载图片的url",url); 
  new asynctask<void,void,string>(){ 
   string filename; 
   inputstream is; 
   outputstream out; 

   @override 
   protected string doinbackground(void... voids) { 

    // 下载文件的名称 
    string[] split = url.split("/"); 
    string newstring = split[split.length - 1]; 
    filename =newstring.substring(newstring.length()-20,newstring.length()-1) ; 
    // 创建目标文件,不是文件夹 
    file picfile = new file(filepath + file.separator + filename); 
    if(picfile.exists()){ 
     return picfile.getpath(); 
    } 

    try { 
     url picurl = new url(url); 
     //通过图片的链接打开输入流 
     is = picurl.openstream(); 
     if(is==null){ 
      return null; 
     } 
     out = new fileoutputstream(picfile); 
     byte[] b=new byte[1024]; 
     int end ; 
     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 (filenotfoundexception e) { 
     e.printstacktrace(); 
    } catch (ioexception e) { 
     e.printstacktrace(); 
    } 



    return picfile.getpath(); 
   } 

   @override 
   protected void onpostexecute(string s) { 
    super.onpostexecute(s); 
    if(s!=null){ 
     downfinishlistener.getdownpath(s); 
    } 
   } 
  }.execute(); 
 } 
 //下载完成回调的接口 
 public interface downfinishlistener{ 

  void getdownpath(string s); 
 } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网