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

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

Android使用webView长按保存下载网络图片的更多相关文章

  1. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. HTML5页面无缝闪开的问题及解决方案

    这篇文章主要介绍了HTML5页面无缝闪开方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  6. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  7. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  8. ios – 永远不会调用shouldStartLoadWithRequest

    我已经研究和研究,但仍然不明白为什么从未调用过StartLoadWithRequest.我的页面加载正常,并调用了一些UIWebview委托协议方法.请从以下代码中找到相关的摘要:在我的.m中合成我的webview(在头文件中定义):我成功加载了我的webview:把我的代表设置为自己我的所有协议方法都被称为EXCEPTshouldStartLoadWithRequest提前致谢.解决方法尝试在V

  9. ios – UIWebView不适合设备屏幕

    我有一个网页视图,我想填写iDevice的全屏.我把它放在视图中心设置为中心并与容器边缘齐平.然而,当我加载应用程序时,视图比它运行的模拟iPhone大.我做了一些搜索,一些建议自动布局,这已经应该是视图的中心.我发现的另一件事是通过代码设置大小.我甚至将应用程序从通用应用程序更改为iPhone,对布局没有影响.完整来源:解决方法设置缩放以适合视图边界.试试这个:希望这可以帮助..:)

  10. ios – 如何在Swift中手动为UIWebView设置Cookie

    我需要在swift中为webview设置一个cookie.我找到了一个解决方案,但它是针对objective-c的.如何在Swift中做到这一点?

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部