温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-09-27 11:52:27 来源:亿速云 阅读:165 作者:小新 栏目:编程语言

小编给大家分享一下Android如何使用webView长按保存下载网络图片,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

最近发现在webView的setOnLongClickListener中可以获取到WebView.HitTestResult,根据获取的HitTestResult的Type来判断做不同的处理。通过判断Type的类型获取点击图片的url,然后把图片下载到本地,发送广播通知系统图库进行更新,在系统图库中查看下载的图片。运行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);  } }

以上是“Android如何使用webView长按保存下载网络图片”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI