O Android pressiona longamente o menu pop-up da imagem para salvar a imagem no webview

O Android pressiona longamente o menu pop-up da imagem para salvar a imagem no webview

No projeto, encontrei um problema ao salvar a imagem do código QR no webview e fiz uma anotação.
O efeito é mostrado na figura: Escreva a descrição da imagem aqui
três métodos de uso do webview:

  • getHitTestResult () —— Obtém um HitTestResult com base no nó do cursor atual
  • getType () —— Obtém o tipo de resultado do teste de clique
  • getExtra () —— Obtém informações adicionais dependentes do tipo sobre o resultado (para obter informações adicionais, como o endereço da imagem)

1. A primeira etapa: adicionar monitoramento de toque longo ao webview

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

2. Etapa 2: obtenha o objeto HitTestResult por meio do método getHitTestResult () de webview

(1) Obtenha o tipo por meio de getType () e julgue se é uma imagem pelo tipo

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

Existem vários tipos de tipo :

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) Obtenha informações extras através de getExtra (), a imagem aqui é o endereço da imagem

String imgurl = result.getExtra();
  •  

Diferentes efeitos de exibição podem ser feitos avaliando o tipo. Aqui, eu apenas processo a imagem. Pressione e segure a imagem para abrir uma PopWindow e escreva o efeito sozinho.

3. A terceira etapa: baixar a imagem através do endereço da imagem obtida

Finalmente, resolva todos os códigos:

PopWindow-ItemLongClickedPopWindow.java personalizado

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);
    }
}

Layout do PopWindow file-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>

Obtenha a posição pressionada através do GestureDetector para localizar a posição exibida pelo 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();
            }
        });

Monitorar a visualização da web em atividade

_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;
  }
});

Finalmente baixe a imagem

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);
        }
    }

Original: http://www.educity.cn/wenda/179077.html

Android WebView Pressione longamente para salvar a imagem no telefone

if (type == WebView.HitTestResult.IMAGE_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {imgurl = result.getExtra (); menu.setHeaderTitle ("提示"); menu.add (0, v.getId (), 0, "保存 到 手机") .setOnMenuItemClickListener (handler); }}}} / *** * 功能 : 用 线程 保存 图片 * * @author wangyp * * / private class SaveImage extends AsyncTask <String, Void, String> {@Override protected String doInBackground (String ... params) {String resultado = ""; try {String sdcard = Environment.getExternalStorageDirectory (). toString (); Arquivo arquivo = novo arquivo (sdcard + "/ Download"); if (arquivo!. existe ()) {arquivo.mkdirs (); } int idx = imgurl.lastIndexOf ("."); String ext = imgurl.substring (idx); arquivo = novo arquivo (sdcard + "/ Download /" + new Date (). getTime () + ext); InputStream inputStream = null; URL url = novo URL (imgurl); HttpURLConnection conn = (HttpURLConnection) url.openConnection (); conn.setRequestMethod ("GET"); conn.setConnectTimeout (20000); if (conn.getResponseCode () == 200) {inputStream = conn.getInputStream (); } byte [] buffer = novo byte [4096]; int len ​​= 0; FileOutputStream outStream = new FileOutputStream (arquivo); while ((len = inputStream.read (buffer))! = -1) {outStream.write (buffer, 0, len); } outStream.close (); result = "图片 已 保存 至 至:" + file.getAbsolutePath (); } catch (Exception e) {result = "保存 失败!" + e.getLocalizedMessage (); } resultado de retorno; } @Override protected void onPostExecute (String result) {MsgBox ("提示", result); }} } resultado de retorno; } @Override protected void onPostExecute (String result) {MsgBox ("提示", result); }} } resultado de retorno; } @Override protected void onPostExecute (String result) {MsgBox ("提示", result); }}

O Android WebView intercepta todo o conteúdo para gerar imagens longas acima de 5.0. Problema de exceção do sistema

Recentemente, houve alguns problemas ao fazer a interceptação de webview de todo o conteúdo para gerar imagens longas. O sistema pode gerar imagens longas normalmente no Android 5.0, mas acima do 5.0, ele irá capturar apenas o conteúdo da primeira tela, e o resto é tudo em branco. Marque De acordo com os dados, verifica-se que o sistema está na versão 5.0+. O Android otimizou a visualização da web. Para reduzir o uso de memória e melhorar o desempenho, ele desenhará de forma inteligente a parte do HTML que precisa ser desenhada por padrão, que é na verdade o conteúdo HTML exibido na tela atual., Portanto, a imagem não exibida está em branco. A solução é a seguinte:

 


Como mostrado acima: adicione uma frase enableSlowWholeDocumentDraw () antes de setContentView no método onCreate da atividade; isso significa cancelar o desenho inteligente do sistema. Claro, o desempenho vai diminuir depois disso, mas para realizar a função, pode apenas seja assim.
Depois de adicionar, o sistema irá travar no Android5.0, é porque não há método enableSlowWholeDocumentDraw () no 5.0, então você precisa fazer um julgamento para obter o número da versão do sistema local, quando o número da versão for maior que 5.0, ligue o método enableSlowWholeDocumentDraw (), caso contrário, ele não é chamado.
O código é: API = 21 é o sistema Android5.0

if (android.os.Build.VERSION.SDK_INT> = 21) {     enableSlowWholeDocumentDraw (); } A seguir está o código para gerar imagens longas :


 

public Bitmap viewShot (visualização final da visualização) {     if (visualização == null)         return null;     view.setDrawingCacheEnabled (true);     view.buildDrawingCache ();     int measureSpec = View.MeasureSpec.makeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED);     view.measure (measureSpec, measureSpec);     if (view.getMeasuredWidth () <= 0 || view.getMeasuredHeight () <= 0) {         return null;     }     Bitmap bm;     tente {         bm = Bitmap.createBitmap (view.getMeasuredWidth (), view.getMeasuredHeight (), Bitmap.Config.ARGB_8888);     } catch (OutOfMemoryError e) {         System.gc ();         experimentar {















            bm = Bitmap.createBitmap (view.getMeasuredWidth (), view.getMeasuredHeight (), Bitmap.Config.ARGB_8888);
        } catch (OutOfMemoryError ee) {             return null;         }     }     Canvas bigCanvas = new Canvas (bm);     Paint paint = new Paint ();     int iHeight = bm.getHeight ();     bigCanvas.drawBitmap (bm, 0, iHeight, paint);     view.draw (bigCanvas);     showToast (getString (R.string.already_share_save_img));     retornar bm; } - ———————————————— Aviso de direitos autorais: este artigo é o artigo original do blogueiro CSDN "A_mnesia" e segue o contrato de direitos autorais CC 4.0 BY-SA. Anexe o link da fonte original e esta declaração para reimpressão. Link original: https://blog.csdn.net/m13984458297/article/details/78687015













 

 

Acho que você gosta

Origin blog.csdn.net/MYBOYER/article/details/104642091
Recomendado
Clasificación