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

本文实例为大家分享了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);
 }
} 

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

(0)

相关推荐

  • Android WebView实现长按保存图片及长按识别二维码功能

    先来简单说一下本文所要实现的功能:用户在浏览网页的时候,长按某一区域,识别如果是图片,则弹出弹框,出现保存图片的功能.同时识别图片是否是二维码,如果是则在弹框中追加识别二维码功能. 细节上:保存图片的弹框要显示在手指长按的位置:选择图片保存后,可以让用户直接去相册查看:选择识别二维码,判断是是不是网址,是的话可以让用户选择复制或访问,否则可以让用户选择复制或搜索. 然后再来看一下效果图: 保存图片 save.gif 识别包含普通文字的二维码: text.gif 识别包含网址的二维码: code.

  • Android WebView自定义长按选择实现收藏/分享选中文本功能

    效果图(1.3M) 一.前言 ** 戳这里可以去DEMO,来吧 ** 相信刚接触android不久的同志们,在面对产品提出的 : "自定义WebView页面中,长按文本的弹出选项.点击选择后,分享.转发.收藏选择文本" 这样的需求时,第一反应大部分是:这是系统行为,如果实现需要在web端实现. 但是web端实现的局限性太大,曾经也有过监听系统粘贴板,在用户点击复制的时候实现其他的逻辑,但是这样用户体验不好,所以自定义WebView中长按的弹出菜单,并在点击时返回选中文本的小控件闪亮登场

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

    本文实例为大家分享了Android使用webView长按保存下载网络图片的具体代码,供大家参考,具体内容如下 最近发现在webView的setOnLongClickListener中可以获取到WebView.HitTestResult,根据获取的HitTestResult的Type来判断做不同的处理.通过判断Type的类型获取点击图片的url,然后把图片下载到本地,发送广播通知系统图库进行更新,在系统图库中查看下载的图片.运行Demo在网页中对图片做长按点击即可下载网络图片 直接上代码: 下面附

  • Android在WebView中调用系统下载的方法

    前言 最近发现项目中的WebView加载下载页的时候是一片空白,没有出现下载,于是简单的调用了系统的下载对其进行下载. 过程 自定义一个下载监听,实现了DownloadListener这个接口 class MyDownloadStart implements DownloadListener{ @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String

  • Android 实现WebView点击图片查看大图列表及图片保存功能

    在日常开发过程中,有时候会遇到需要在app中嵌入网页,此时使用WebView实现效果,但在默认情况下是无法点击图片查看大图的,更无法保存图片.本文将就这一系列问题的实现进行说明. 图示: 项目的知识点: 加载网页后如何捕捉网页中的图片点击事件: 获取点击的图片资源后进行图片显示,获取整个页面所有的图片: 支持查看上下一张的图片以及对图片缩放显示: 对图片进行保存: 其他:图片缓存的处理(不用每次都重新加载已查看过的图片) 项目代码结构: 前期准备(添加权限.依赖和混淆设置): 添加权限: <us

  • Android 下载网络图片并显示到本地

    Android下载网络图片的流程是: 发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件. 注意点 最新的Android系统不可以在主线程上请求网络,需要使用线程来请求 下载图片属于耗时任务,最优做法是放在一个AsyncTask中操作 设计思路 1.网络请求:该例中需要下载的文件类型是图片类型,可以将网络请求获取的数据类型转换为Bitmap已供ImageView直接使用,但是一个合理的网络请求类的设计是将下载的数据类型转换为最基本的InputStre

  • Android编程实现录音及保存播放功能的方法【附demo源码下载】

    本文实例讲述了Android编程实现录音及保存播放功能的方法.分享给大家供大家参考,具体如下: 在android中进行录音相对来说是比较简单的,使用系统提供的MediaRecorder类进行录音并保存,然后调用MediaPlayer进行播放.以下为xml配置文件代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas

  • Android HttpURLConnection下载网络图片设置系统壁纸

    需求: 壁纸是url链接,get就能请求到,所以就用get请求到图片,把图片转化为bitmap,然后设置壁纸. 代码: 这里我封装了工具类 package xxxxx.utils; import android.app.Activity; import android.app.WallpaperManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Envi

  • Android加载长图的多种方案分享

    背景介绍 在某些特定场景下,我们需要考虑加载长图的需求,比如加载一幅<清明上河图>,这个好像有点过分了,那就加载1/2的<清明上河图>吧... 那TMD还不是一样道理. 言归正传说一下我这边遇到的情况,之前有图片或大图的模块是划分为H5来实现的,现在需求变更划分为原生开发,那么问题就来了. 图片尺寸为 图片大小为 这一刻我是懵逼的,哪个端图片上传的时候没限制尺寸和压缩?mdzz, 吐槽归吐槽,还是要撸起袖子解决加载长图大图的问题. 先提供几个技术方案来对比一下: 方案1:WebVi

  • Android使用WebView实现离线阅读功能

    1.先看效果图,加载动画: 加载完成,注意当前为飞行模式! 2.使用 1).让你的javabean实现OffLineLevelItem接口,因为我的这个离线阅读支持多级下载,比如Demo中的每个频道下面的第一页item都可以缓存. package com.zgh.offlinereader; import java.util.List; public interface OffLineLevelItem { //是否有下一级 boolean haveNextLevel(); //内容url St

  • Android中WebView常见问题及解决方案汇总

    Android WebView常见问题解决方案汇总: 就目前而言,如何应对版本的频繁更新呢,又如何灵活多变地展示我们的界面呢,这又涉及到了web app与native app之间孰优孰劣的争论. 于是乎,一种混合型的app诞生了,灵活多变的部分,如淘宝商城首页的活动页面,一集凡客诚品中我们都可以见到web页面与native页面的混合,既利用了web app的灵活易更新,也借助了native app本身的效率. 当然,就会用到webview这样的一个控件,这里,我把自己使用过程中遇到的一些问题整理

  • 使用Android系统提供的DownloadManager来下载文件

    在android2.3以后android系统提供了一个系统组件来供其他app调用来下载东西,使用起来非常方便. 例如我们可以拿来下载app的新版本apk,同时在同时注册一个广播接收器来接收下载完成时DownloadManager发出的的广播,然后自动安装程序. SDK在API Level 9中加入了DownloadManager服务,可以将长时间的下载任务交给系统,完全由系统管理. 直接看实例代码: package com.hebaijun.downloadtest; import java.i

随机推荐