Android实现在webview中长按图片弹出菜单保存图片

在项目中遇到一个保存webview中二维码图片的问题,做个笔记。
效果如图: Android实现在webview中长按图片弹出菜单保存图片_第1张图片
用到webview的三个方法:

  • getHitTestResult()——Gets a HitTestResult based on the current cursor node
  • getType()——Gets the type of the hit test result(获取所选中目标的类型,可以是图片,超链接,邮件,电话等等)
  • getExtra()——Gets additional type-dependant information about the result(获取额外的信息,例如图片的地址)

1. 第一步:给webview添加长按监听

_mWebview.setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                }            });

2. 第二步:通过webview的getHitTestResult()方法获取HitTestResult 对象

(1)通过getType()获取类型,通过类型判断是否是图片

WebView.HitTestResult result = ((WebView) v).getHitTestResult();int type = result.getType();

type有这几种类型

WebView.HitTestResult.UNKNOWN_TYPE    未知类型WebView.HitTestResult.PHONE_TYPE    电话类型WebView.HitTestResult.EMAIL_TYPE    电子邮件类型WebView.HitTestResult.GEO_TYPE    地图类型WebView.HitTestResult.SRC_ANCHOR_TYPE    超链接类型WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE    带有链接的图片类型WebView.HitTestResult.IMAGE_TYPE    单纯的图片类型WebView.HitTestResult.EDIT_TEXT_TYPE    选中的文字类型

(2)通过getExtra()获取额外信息,图片这里就是图片地址

String imgurl = result.getExtra();

通过判断类型来做不同的显示效果,在这里我只对图片处理,长按图片弹出一个PopWindow,效果自己写。

3. 第三步:通过获取的图片地址下载图片

最后把所有代码整理一下:

自定义PopWindow——ItemLongClickedPopWindow.java

public class ItemLongClickedPopWindow extends PopupWindow {    /** * 书签条目弹出菜单 * @value * {@value} * */    public static final int FAVORITES_ITEM_POPUPWINDOW = 0;    /** * 书签页面弹出菜单 * @value * {@value} * */    public static final int FAVORITES_VIEW_POPUPWINDOW = 1;    /** * 历史条目弹出菜单 * @value * {@value} * */    public static final int HISTORY_ITEM_POPUPWINDOW = 3;    /** * 历史页面弹出菜单 * @value * {@value} * */    public static final int HISTORY_VIEW_POPUPWINDOW = 4;    /** * 图片项目弹出菜单 * @value * {@value} * */    public static final int IMAGE_VIEW_POPUPWINDOW = 5;    /** * 超链接项目弹出菜单 * @value * {@value} * */    public static final int ACHOR_VIEW_POPUPWINDOW = 6;    private LayoutInflater itemLongClickedPopWindowInflater;    private View itemLongClickedPopWindowView;    private Context context;    private int type;    /** * 构造函数 * @param context 上下文 * @param width 宽度 * @param height 高度 * */    public ItemLongClickedPopWindow(Context context, int type, int width, int height) {        super(context);        this.context = context;        this.type = type;        //创建        this.initTab();        //设置默认选项        setWidth(width);        setHeight(height);        setContentView(this.itemLongClickedPopWindowView);        setOutsideTouchable(true);        setFocusable(true);    }    //实例化    private void initTab() {        this.itemLongClickedPopWindowInflater = LayoutInflater.from(this.context);        switch (type) {// case FAVORITES_ITEM_POPUPWINDOW:// this.itemLongClickedPopWindowView = this.itemLongClickedPopWindowInflater.inflate(R.layout.list_item_longclicked_favorites, null);// break;// case FAVORITES_VIEW_POPUPWINDOW: //对于书签内容弹出菜单,未作处理// break;// case HISTORY_ITEM_POPUPWINDOW:// this.itemLongClickedPopWindowView = this.itemLongClickedPopWindowInflater.inflate(R.layout.list_item_longclicked_history, null);// break;// case HISTORY_VIEW_POPUPWINDOW: //对于历史内容弹出菜单,未作处理// break;// case ACHOR_VIEW_POPUPWINDOW: //超链接// break;            case IMAGE_VIEW_POPUPWINDOW: //图片                this.itemLongClickedPopWindowView = this.itemLongClickedPopWindowInflater.inflate(R.layout.list_item_longclicked_img, null);                break;        }    }    public View getView(int id) {        return this.itemLongClickedPopWindowView.findViewById(id);    }}

PopWindow的布局文件——list_item_longclicked_img.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:orientation="vertical">    <TextView  android:id="@+id/item_longclicked_viewImage" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center" android:text="查看图片" android:textColor="@android:color/white" android:textSize="16sp" />    <View  android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/gray_9F" />    <TextView  android:id="@+id/item_longclicked_saveImage" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center" android:text="保存图片" android:textColor="@android:color/white" android:textSize="16sp" /></LinearLayout>

通过GestureDetector获取按下的位置,来定位PopWindow显示的位置

private GestureDetector gestureDetector;private int downX, downY;    gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {            @Override            public void onLongPress(MotionEvent e) {                downX = (int) e.getX();                downY = (int) e.getY();            }        });

在Activity中对webview的监听

_mWebview.setOnLongClickListener(new View.OnLongClickListener() {     @Override     public boolean onLongClick(View v) {        WebView.HitTestResult result = ((WebView)v).getHitTestResult();        if (null == result)             return false;        int type = result.getType();        if (type == WebView.HitTestResult.UNKNOWN_TYPE)             return false;        if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) {          //let TextViewhandles context menu return true;         }final ItemLongClickedPopWindow itemLongClickedPopWindow = new ItemLongClickedPopWindow(HtmlActivity.this,ItemLongClickedPopWindow.IMAGE_VIEW_POPUPWINDOW, UIUtils.dip2px(120), UIUtils.dip2px(90));    // Setup custom handlingdepending on the type   switch (type) {       case WebView.HitTestResult.PHONE_TYPE: // 处理拨号           break;       case WebView.HitTestResult.EMAIL_TYPE: // 处理Email           break;       case WebView.HitTestResult.GEO_TYPE: // TODO           break;       case WebView.HitTestResult.SRC_ANCHOR_TYPE: // 超链接           // Log.d(DEG_TAG, "超链接");           break;       case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:           break;       case WebView.HitTestResult.IMAGE_TYPE: // 处理长按图片的菜单项           imgurl = result.getExtra();           //通过GestureDetector获取按下的位置,来定位PopWindow显示的位置           itemLongClickedPopWindow.showAtLocation(v,        Gravity.TOP|Gravity.LEFT, downX, downY + 10);           break;       default:           break;    }itemLongClickedPopWindow.getView(R.id.item_longclicked_viewImage)    .setOnClickListener(new View.OnClickListener() {           @Override           public void onClick(View v) {               itemLongClickedPopWindow.dismiss();           }     });                                                                          itemLongClickedPopWindow.getView(R.id.item_longclicked_saveImage)    .setOnClickListener(new View.OnClickListener() {           @Override           public void onClick(View v) {               itemLongClickedPopWindow.dismiss();               new SaveImage().execute(); // Android 4.0以后要使用线程来访问网络           }    });    return true;  }});

最后下载图片

private String imgurl = "";    /*** * 功能:用线程保存图片 * * @author wangyp */    private class SaveImage extends AsyncTask<String, Void, String> {        @Override        protected String doInBackground(String... params) {            String result = "";            try {                String sdcard = Environment.getExternalStorageDirectory().toString();                File file = new File(sdcard + "/Download");                if (!file.exists()) {                    file.mkdirs();                }                int idx = imgurl.lastIndexOf(".");                String ext = imgurl.substring(idx);                file = new File(sdcard + "/Download/" + new Date().getTime() + ext);                InputStream inputStream = null;                URL url = new URL(imgurl);                HttpURLConnection conn = (HttpURLConnection) url.openConnection();                conn.setRequestMethod("GET");                conn.setConnectTimeout(20000);                if (conn.getResponseCode() == 200) {                    inputStream = conn.getInputStream();                }                byte[] buffer = new byte[4096];                int len = 0;                FileOutputStream outStream = new FileOutputStream(file);                while ((len = inputStream.read(buffer)) != -1) {                    outStream.write(buffer, 0, len);                }                outStream.close();                result = "图片已保存至:" + file.getAbsolutePath();            } catch (Exception e) {                result = "保存失败!" + e.getLocalizedMessage();            }            return result;        }        @Override        protected void onPostExecute(String result) {            showToast(result);        }    }

原文:http://www.educity.cn/wenda/179077.html

更多相关文章

  1. Android快速开发框架之xUtils---图片模块
  2. Android ImageView图片自适应大小
  3. android菜单的使用
  4. android切换到后台图片纹理丢失的解决方案
  5. 万能imageLoader加载图片的包装,直接用
  6. 2010.12.16——— android listView 显示图片 内存溢出问题
  7. [置顶] 我的Android进阶之旅------>android异步加载图片显示,并且
  8. 探讨android图片资源的抖动处理和格式转换
  9. Android之解决ViewPager2+PhotoView滑动图片花屏问题

随机推荐

  1. Android(安卓)Studio 2.0代码热更新
  2. WIFI学习之三:android wifi工作流程
  3. Android(安卓)之AES加密,解密与后台进行
  4. Android(安卓)快速掌握Fragment生命周期
  5. Android(安卓)ListView setOnItemClickLi
  6. Android开发者指南(18) ―― Web Apps Ov
  7. Ripple反馈
  8. Android(安卓)RoboGuice 使用指南(8):Pro
  9. Pool, SimplePool与SynchronizedPool
  10. android mediaplayer 架构