服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android使用webView长按保存下载网络图片

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

2022-10-27 14:08Sandy林 Android

这篇文章主要为大家详细介绍了Android使用webView长按保存下载网络图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

直接上代码:

下面附有Demo下载:点击打开链接

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
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);
 }
 
}

图片下载的工具类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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);
 }
}

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

原文链接:https://blog.csdn.net/u013334392/article/details/56282805

延伸 · 阅读

精彩推荐