【问题标题】:Android WebView URL intercept , i want to load only one website and it's pages , and nothing elseAndroid WebView URL拦截,我只想加载一个网站及其页面,没有别的
【发布时间】:2018-03-17 16:29:10
【问题描述】:

我有一个问题,我正在尝试为我的网站创建一个应用程序,我正在使用 android webview 来执行此操作,但是由于我的网站中有外部链接(广告、反向链接..等),当用户单击这些链接,webview 打开链接,我的应用程序就像浏览器一样,我知道这就是 webview,但我希望它只打开我网站的链接

我覆盖了 shouldOverrideUrlLoading 方法并截获了 url 如果 url 与我的网站前缀不同,我返回 true ,但是当我单击外部链接时 webview 变成全白,并且当我单击外部链接时希望 webview 保持不变

这是我的代码

      public boolean shouldOverrideUrlLoading(WebView view, String url) {
        String host = Uri.parse(url).getHost();
        urlData = url;

        if (target_url_prefix.equals(host)) {
            if (mWebviewPop != null) {
                mWebviewPop.setVisibility(View.GONE);
                mContainer.removeView(mWebviewPop);
                mWebviewPop = null;
            }
            return false;
        }

    if(!url.contains(getString(R.string.target_url))) {
                Log.d("intercept External URL", "true");

                return true; 
        }

    }

【问题讨论】:

    标签: android android-studio webview android-webview


    【解决方案1】:

    在这两种情况下,您都消费了该事件。试试下面的方法。

     webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                if (request.getUrl().equals(host)) {
                   // Intercept URL Load url here return true if url is consumed  
                    return true;
                }
                return super.shouldOverrideUrlLoading(view, request);
            }
        });
    

    或者如果你想阻止所有其他链接,那么你可以像下面这样使用它。

     webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                if (request.getUrl().equals(yourwebsite)) {
    
                    return super.shouldOverrideUrlLoading(view, request);
                }
                return true;
            }
        });
    

    请记住,所有其他链接都不起作用,因此这可能会给您的应用留下不好的印象。所以我建议你应该打开其他带有浏览器意图的链接。如下所示。

     webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                if (request.getUrl().equals(yourwebsite)) {
    
                    return super.shouldOverrideUrlLoading(view, request);
                }else{
                    try {
                        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(request.getUrl()));
                        startActivity(browserIntent);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
                return true;
            }
        });
    

    注意:- 这是shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 的实现,适用于 API 21 以上。所以你也应该以同样的方式覆盖以前版本的shouldOverrideUrlLoading(WebView view, String url)

    【讨论】:

    • 我已经找到了解决方案,但这也可以,谢谢
    • 好的。如果您的解决方案与我的不同,则将其发布为答案。
    【解决方案2】:

    您不必编写shouldOverrideUrlLoading 方法。只加载onCreate()方法中的url。

    检查此代码。

    MainActivity.this.

    public class MainActivity extends AppCompatActivity
    {
    
    private static final String PAGE_URL = "http://madarabia.com";
    private NoInternetDialog noInternetDialog;
    private WebView mWebView;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
    
        noInternetDialog = new NoInternetDialog.Builder(getApplicationContext()).build();
    
        mWebView =  findViewById(R.id.webview);
    
        // Force links and redirects to open in the WebView instead of in a browser
        mWebView.setWebChromeClient(new WebChromeClient());
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setDomStorageEnabled(true);
    
        mWebView.setWebViewClient(new WebViewClient());
    
        mWebView.getSettings().setSaveFormData(true);
        mWebView.getSettings().setAllowContentAccess(true);
        mWebView.getSettings().setAllowFileAccess(true);
        mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
        mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
        mWebView.getSettings().setSupportZoom(false);
        mWebView.setClickable(true);
    
        // Use remote resource
        mWebView.postDelayed(new Runnable() {
    
            @Override
            public void run() {
                mWebView.loadUrl(PAGE_URL);
            }
        }, 500);
    
    
        mWebView.onCheckIsTextEditor();
    
        mWebView.requestFocus(View.FOCUS_DOWN);
        mWebView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
    
                switch (event.getAction())
                {
    
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_UP:
                        if (!v.hasFocus())
                        {
                            v.requestFocus();
                        }
                        break;
                }
                return false;
            }
        });
    
    }
    
    
    
    
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
    
        noInternetDialog.onDestroy();
    
    }
    
    // Prevent the back-button from closing the app
    @Override
    public void onBackPressed() {
        if(mWebView.canGoBack()) {
            mWebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
    
    
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            //If there is history, then the canGoBack method will return ‘true’//
            return true;
        }
    
        //If the button that’s been pressed wasn’t the ‘Back’ button, or there’s currently no
        //WebView history, then the system should resort to its default behavior and return
        //the user to the previous Activity//
        return super.onKeyDown(keyCode, event);
    
    
    }
    
    }
    

    【讨论】:

    • 我试试这个,
    • 还是同样的问题,当我点击外部链接时,它们会打开
    猜你喜欢
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2017-07-03
    • 2016-02-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多