【问题标题】:Get href value from anchor tag in Android WebView when link is clicked单击链接时从Android WebView中的锚标记获取href值
【发布时间】:2016-02-20 08:28:18
【问题描述】:

我正在 WebView 中加载网页。网页中有一个链接,在桌面上将下载文件,但在应用程序中,该链接应显示一个 Toast,说明该应用程序已禁用该链接。

当链接被点击时,我不确定如何从锚标记的href 中获取值。

<a class="btn btn-primary" download="http://xx.xxx.com/wp-content/uploads/2015/11/abc-27-15.mp3" href="http://xx.xxx.com/wp-content/uploads/2015/11/abc-27-15.mp3">
<i class="fa fa-download"></i> Download Audio</a>

有人可以分享一个想法或任何关于如何做到这一点的示例代码。

编辑:1

这是我目前正在做的事情:

private static final String URL = "http://xx.xxx.com/wp-content/uploads/";

webView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if (event.getAction() == MotionEvent.ACTION_DOWN) {

                    WebView.HitTestResult hr = ((WebView) v).getHitTestResult();
                    String extra = hr.getExtra();

                    if (extra != null && extra.startsWith(URL) && extra.endsWith(".mp3")) {
                        Log.d("WebviewActivity", "Extra: " + extra);
                        Log.d("WebviewActivity", "Contains URL");

                        return true;
                    } 
                }

                return false;
            }
        });

这种方法的问题是: 当我单击链接时,我会额外获得 url。到这里为止一切正常。但是,从下一次开始,无论我在哪里点击 webview,都会返回相同的额外内容。因此,即使我在单击 url 后单击图像,我也会在额外中获得相同的 url。不知道我是否做错了什么。或者这是正确的方法。

如果您需要任何详细信息,请告诉我。

编辑:2

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) {
                Log.d(TAG, "URL: "+url);
            }
        }
    };



        webView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if (event.getAction() == MotionEvent.ACTION_DOWN) {

                    WebView.HitTestResult hr = ((WebView) v).getHitTestResult();


                    if (hr.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE) {

                        Message msg = mHandler.obtainMessage();
                        webView.requestFocusNodeHref(msg);
                    }


                }

                return false;
            }
        });



        webView.loadUrl(mUrl);

    }

现在,我得到了在最后一个 action_down 事件中单击的 URL。如何获取当前网址?

编辑 3(尝试使用 webviewclient:

 private class MyWebViewClient extends WebViewClient {

        private static final String URL = "xx.xxx.com/wp-content/uploads/";

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);

            if (!isFinishing())
                mProgressDialog.show();
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            mProgressDialog.dismiss();
        }

        @Override
        public void onReceivedError(WebView view, int errorCode,
                                    String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);

            Toast.makeText(WebviewActivity.this,
                    "Please check your internet " + "connection and try again",
                    Toast.LENGTH_SHORT).show();
        }


        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            Log.d("xxx", "Url: " + url);

            if(url.contains(URL)) {
                Log.d("xxx", "Url Contains: " + URL);
                return true;
            }

            return false;
        }

    }


mMyWebViewClient = new MyWebViewClient();
        webView.setWebViewClient(mMyWebViewClient);

点击链接时logcat中的输出:

03-01 15:38:19.402 19626-19626/com.xx.xxx D/cr_Ime: [ImeAdapter.java:553] focusedNodeChanged: isEditable [false]
03-01 15:38:19.428 19626-19626/com.xx.xxx D/cr_Ime: [ImeAdapter.java:253] updateKeyboardVisibility: type [0->0], flags [0], show [true], 
03-01 15:38:19.428 19626-19626/com.xx.xxx D/cr_Ime: [ImeAdapter.java:326] hideKeyboard
03-01 15:38:19.429 19626-19626/com.xx.xxx D/cr_Ime: [InputMethodManagerWrapper.java:56] isActive: true
03-01 15:38:19.429 19626-19626/com.xx.xxx D/cr_Ime: [InputMethodManagerWrapper.java:65] hideSoftInputFromWindow

【问题讨论】:

标签: javascript android webview android-webview


【解决方案1】:

因为您使用的是 WebView 并且链接不是 Java 脚本,这很容易通过 WebViewClient 实现,您可以使用它来监控您的 WebView

myWebView.setWebViewClient( new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // check something unique to the urls you want to block
        if (url.contains("xx.xxx.com")) {
            Toast.make... //trigger the toast
            return true; //with return true, the webview wont try rendering the url
        }
        return false; //let other links work normally
    }

} );

可能是因为您的 URL 以 .mp3 结尾,所以该文件被视为资源。您还应该重写 WebViewClient 的 shouldInterceptRequest 方法来检查这一点。

@Override
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 
    String url = request.getUrl().toString();
    Log.d("XXX", "Url from API21 shouldInterceptRequest : " + url);
    if (url.contains(URL)) { 
        return new WebResourceResponse("text/html", "UTF-8", "<html><body>No downloading from app</body></html>");
    } else {
        return null;
    }
}

public WebResourceResponse shouldInterceptRequest (WebView view, String url) {
    Log.d("XXX", "Url from shouldInterceptRequest : " + url);
    if (url.contains(URL)) { 
        return new WebResourceResponse("text/html", "UTF-8", "<html><body>No downloading from app</body></html>");
    } else {
        return null;
    }
}

【讨论】:

  • 抱歉回复晚了。我一开始就尝试过这种方法。但是,当我点击链接时,shouldOverrideUrlLoading 没有被调用。我唯一一次获得 url 是当我在问题的代码示例中提到的 WebView 上使用 onTouchListener 时
  • 如果 webview 客户端在 webview 上设置正确,获取 URL 总是会导致方法被调用。如果是表单帖子,则不是这种情况,但您说的是锚链接。您是否与触摸侦听器同时使用它?当然,当您取消活动时,这将不起作用
  • 我用 WebViewClient 更新了问题。请看一看。我没有同时使用两者。首先我尝试使用 WebViewClient,但是我无法从 shouldOverrideUrlLoading 获取 url。所以,我正在尝试使用 onTouchListener。
  • 私有静态最终字符串 URL = "xx.xxx.com/wp-content/uploads";我正在将其登录到 shouldOverrideUrlLoading。 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("xxx", "Url:" + url); if(url.contains(URL)) { Log.d("xxx", "Url 包含:" + URL);返回真; } 返回假; }
  • 问题是当我点击链接时,我没有得到任何日志。没有网址或任何东西。用 logcat 更新了问题
【解决方案2】:

大部分工作都可以在网页端本身完成。您必须编写 java 脚本来识别哪个设备正在访问页面(移动设备、桌面设备等),如果它是移动设备,然后使用 java 脚本绑定技术调用本机 android 代码以显示 Toast 消息。

http://developer.android.com/guide/webapps/webview.html

WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android");

WebAppInterface.java

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
         Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

YourHTML 页面(此示例点击按钮)

<input type="button" value="Say hello" onClick="showAndroidToast('Hello  
             Android!')" />

    <script type="text/javascript">
    function showAndroidToast(toast) {
         Android.showToast(toast);
    }
</script>

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多