如何使用HitTlick获取链接图像(而不是图像URL)的Android WebView中的链接URL与HitTlickResult

Seb*_*ian 10 url android image webview webviewclient

我尝试捕获webview longclicks以显示上下文菜单.(请参阅下面的代码)当长按图像时,我总是将图像URL作为额外的(对于具有IMAGE_TYPE的未链接图像和具有SRC_IMAGE_ANCHOR_TYPE的链接图像).但是如何获得带有超链接的图像的链接URL(而不是图像URL)呢?

最好,塞巴斯蒂安

        mywebview.setOnLongClickListener(new OnLongClickListener() {
            public boolean onLongClick(View v) {

                final WebView webview = (WebView) v;
                final WebView.HitTestResult result = webview.getHitTestResult();

                if (result.getType() == SRC_ANCHOR_TYPE) {
                    return true;
                }

                if (result.getType() == SRC_IMAGE_ANCHOR_TYPE) {
                    return true;
                }

                if (result.getType() == IMAGE_TYPE) {
                    return true;
                }

                return false;
            }
        });
Run Code Online (Sandbox Code Playgroud)

Per*_*_ml 20

在Android 4.2.2上,上述解决方案都不适用于我.所以我研究了默认的android web浏览器的源代码.我解决了这个问题的解决方案 - 从图像链接获取链接URL.

资料来源:https: //github.com/android/platform_packages_apps_browser/blob/master/src/com/android/browser/Controller.java

提取的解决方案:

LongClick监听器:

...
mWebview.setOnLongClickListener(new OnLongClickListener() {

    @Override
    public boolean onLongClick(View v) {
        HitTestResult result = mWebview.getHitTestResult();
        if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
            Message msg = mHandler.obtainMessage();
            mWebview.requestFocusNodeHref(msg);
        }
    }
});
...
Run Code Online (Sandbox Code Playgroud)

处理程序获取URL:

private Handler mHandler = new Handler() {

    @Override
        public void handleMessage(Message msg) {
            // Get link-URL.
            String url = (String) msg.getData().get("url");

            // Do something with it.
            if (url != null) ...
        }
    };
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,对于尝试此方法的 Android 4.4+ 用户,存在一个错误,图像锚点的 HitTestResult 错误地返回 link-url = image-src。该错误在 http://stackoverflow.com/q/20244661/1303595 中进行了描述,并在 https://code.google.com/p/chromium/issues/detail?id=323989 中解决。 (2认同)

小智 6

我知道这是一个老问题,但是我最近遇到了这个问题。基于Perry_ml的答案,我使用下面的Kotlin代码来解决它:

webView.setOnLongClickListener {
    val result = webView.hitTestResult
    if (result.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
        val handler = Handler()
        val message = handler.obtainMessage()

        webView.requestFocusNodeHref(message)
        val url = message.data.getString("url")

        // Do something with url, return true as touch has been handled
        true
    } else {
        false
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里发布了一些有关它的信息


Zit*_*hen 5

我检查了WebView的源代码,似乎图像uri是SRC_IMAGE_ANCHOR_TYPE可以获得的唯一额外数据.但请不要生气,我有一个快速而肮脏的解决方法:

    webview.setOnLongClickListener(new OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            final WebView webview = (WebView) v;
            final HitTestResult result = webview.getHitTestResult();
            if(result.getType()==HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
                webview.setWebViewClient(new WebViewClient(){
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        // 2. and here we get the url (remember to remove the WebView client and return true so that the hyperlink will not be really triggered)
                        mUrl = url; // mUrl is a member variant of the activity
                        view.setWebViewClient(null);
                        return true;
                    }
                });
                // 1. the picture must be focused, so we simulate a DPAD enter event to trigger the hyperlink
                KeyEvent event1 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);
                webview.dispatchKeyEvent(event1);
                KeyEvent event2 = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER);
                webview.dispatchKeyEvent(event2);
                // 3. now you can do something with the anchor url (and then clear the mUrl for future usage)
                String url = mUrl;
                if (url!=null) {
                    Toast.makeText(webview.getContext(), url, Toast.LENGTH_SHORT).show();
                }

                mUrl = null;
            }
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

我在低端Android 2.1设备和高端Android 4.0设备上尝试了这些代码,两者都像魅力一样.

问候

陈子腾