Android Webview在浏览器中打开链接

时间:2020-04-09 09:37:48

标签: java android webview

这是Universal的WebviewFragment.java源代码-完整的多功能Android应用 我想禁用该网址以退出浏览器,我已经按照本教程进行操作:https://sherdle.com/help/can-i-determine-what-links-open-outside-the-webview/

但是该教程只能用于domain.com。因此,对于domain.com/url来说不可能。

public class WebviewFragment extends Fragment implements BackPressFragment,
    CollapseControllingFragment, AdvancedWebView.Listener, ConfigurationChangeFragment, PermissionsFragment {

//Static
public static final String HIDE_NAVIGATION = "hide_navigation";
public static final String LOAD_DATA = "loadwithdata";

//References
private Activity mAct;
private FavDbAdapter mDbHelper;

//Layout with interaction
private AdvancedWebView browser;
private SwipeRefreshLayout mSwipeRefreshLayout;

//Layouts
private ImageButton webBackButton;
private ImageButton webForwButton;
private FrameLayout ll;

public WebviewFragment() {
}

@SuppressLint("InflateParams")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);

    ll = (FrameLayout) inflater.inflate(R.layout.fragment_webview,
            container, false);

    setHasOptionsMenu(true);

    browser = ll.findViewById(R.id.webView);
    mSwipeRefreshLayout = ll.findViewById(R.id.refreshlayout);

    browser.setListener(getActivity(), this);
    browser.setGeolocationEnabled(Config.WEBVIEW_GEOLOCATION);

    browser.setWebViewClient(new WebViewClient() {

        @SuppressWarnings("deprecation")
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }

        @TargetApi(Build.VERSION_CODES.N)
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            return handleUri(request.getUrl().toString());
        }

        @Override
        public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError er) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(mAct);
            builder.setMessage(R.string.notification_error_ssl_cert_invalid);
            builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    handler.proceed();
                }
            });
            builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    handler.cancel();
                }
            });
            final AlertDialog dialog = builder.create();
            dialog.show();
        }

        // Make sure any url clicked is opened in webview
        boolean handleUri(String url)
        {
            if (url.contains("market://") || url.contains("mailto:")
                    || url.contains("play.google") || url.contains("tel:") || url
                    .contains("vid:")) {
                // Load new URL Don't override URL Link
                startActivity(
                        new Intent(Intent.ACTION_VIEW, Uri.parse(url)));

                return true;
            }

            // Return true to override url loading (In this case do
            // nothing).
            return false;
        }

    });

    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            browser.reload();
        }
    });

    return ll;
}// of oncreateview

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mAct = getActivity();

    setRetainInstance(true);

    //browser.getSettings().setSupportMultipleWindows(false);

    browser.setWebChromeClient(new FullscreenableChromeClient(mAct));

    String weburl = getArguments().getStringArray(MainActivity.FRAGMENT_DATA)[0];
    String data = getArguments().containsKey(LOAD_DATA) ? getArguments().getString(LOAD_DATA) : null;
    //if (weburl.startsWith("file:///android_asset/") || hasConnectivity()) {
    //If this is the first time, load the initial url, otherwise restore the view if necessairy
    //If we have HTML data to load, do so, else load the url.
    if (data != null) {
        browser.loadDataWithBaseURL(weburl, data, "text/html", "UTF-8", "");
    } else {
        browser.loadUrl(weburl);
    }
    //}

}

@Override
public void onPause() {
    super.onPause();

    if (browser != null)
        browser.onPause();

    if (isMenuVisible() || getUserVisibleHint())
        setMenuVisibility(false);
}

@Override
public void setMenuVisibility(final boolean visible) {
    super.setMenuVisibility(visible);
    if (mAct == null) return;

    if (visible) {
        if (navigationIsVisible()) {

            ActionBar actionBar = ((AppCompatActivity) mAct)
                    .getSupportActionBar();

            if (actionBar == null) return;

            if (mAct instanceof HolderActivity) {
                actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_HOME_AS_UP);
            } else {
                actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);
            }

            View view = mAct.getLayoutInflater().inflate(R.layout.fragment_webview_actionbar, null);
            LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.END | Gravity.CENTER_VERTICAL);
            actionBar.setCustomView(view, lp);

            webBackButton = mAct.findViewById(R.id.goBack);
            webForwButton = mAct.findViewById(R.id.goForward);

            webBackButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (browser.canGoBack())
                        browser.goBack();
                }
            });
            webForwButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (browser.canGoForward())
                        browser.goForward();
                }
            });
        }
    } else {
        if (navigationIsVisible()
                && getActivity() != null) {

            ActionBar actionBar = ((AppCompatActivity) getActivity())
                    .getSupportActionBar();
            actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);
        }
    }
}

@SuppressLint("RestrictedApi")
@Override
public void onResume() {
    super.onResume();
    if (browser != null) {
        browser.onResume();
    } else {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.detach(this).attach(this).commit();
    }

    if (this.getArguments().containsKey(HIDE_NAVIGATION) &&
            this.getArguments().getBoolean(HIDE_NAVIGATION)) {
        mSwipeRefreshLayout.setEnabled(false);
    }

    if (isMenuVisible() || getUserVisibleHint())
        setMenuVisibility(true);
    adjustControls();
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    browser.onDestroy();
}

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (!hidden) {
        setMenuVisibility(true);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.share:
            shareURL();
            return true;
        case R.id.favorite:
            mDbHelper = new FavDbAdapter(mAct);
            mDbHelper.open();

            String title = browser.getTitle();
            String url = browser.getUrl();

            if (mDbHelper.checkEvent(title, url, Provider.WEBVIEW)) {
                // This item is new
                mDbHelper.addFavorite(title, url, Provider.WEBVIEW);
                Toast toast = Toast.makeText(mAct,
                        getResources().getString(R.string.favorite_success),
                        Toast.LENGTH_LONG);
                toast.show();
            } else {
                Toast toast = Toast.makeText(mAct,
                        getResources().getString(R.string.favorite_duplicate),
                        Toast.LENGTH_LONG);
                toast.show();
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    if (!this.getArguments().containsKey(HIDE_NAVIGATION) ||
            !this.getArguments().getBoolean(HIDE_NAVIGATION))
        inflater.inflate(R.menu.webview_menu, menu);

    //For local urls, we don't need a share item
    if (browser.getUrl() != null && browser.getUrl().startsWith("file:///android_asset/") && navigationIsVisible())
        menu.findItem(R.id.share).setVisible(false);

    ThemeUtils.tintAllIcons(menu, mAct);
}

// Checking for an internet connection
private boolean hasConnectivity() {
    boolean enabled = true;

    ConnectivityManager connectivityManager = (ConnectivityManager) mAct
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = connectivityManager.getActiveNetworkInfo();

    if ((info == null || !info.isConnected() || !info.isAvailable())) {
        enabled = false;
        //Helper.noConnection(mAct);
    }

    return enabled;
}

public void adjustControls() {
    webBackButton = mAct.findViewById(R.id.goBack);
    webForwButton = mAct.findViewById(R.id.goForward);

    if (webBackButton == null || webForwButton == null || browser == null) return;

    if (ThemeUtils.lightToolbarThemeActive(mAct)) {
        webBackButton.setColorFilter(Color.BLACK);
        webForwButton.setColorFilter(Color.BLACK);
    }

    webBackButton.setAlpha(browser.canGoBack() ? 1.0f : 0.5f);
    webForwButton.setAlpha(browser.canGoForward() ? 1.0f : 0.5f);
}

// sharing
private void shareURL() {
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    String appname = getString(R.string.app_name);
    shareIntent.putExtra(Intent.EXTRA_TEXT,
            (getResources().getString(R.string.web_share_begin)) + appname
                    + getResources().getString(R.string.web_share_end)
                    + browser.getUrl());
    startActivity(Intent.createChooser(shareIntent, getResources()
            .getString(R.string.share)));
}

@Override
public boolean handleBackPress() {
    return !browser.onBackPressed();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    browser.onActivityResult(requestCode, resultCode, intent);
}

@Override
public boolean supportsCollapse() {
    return false;
}

@Override
public boolean dynamicToolbarElevation() {
    return false;
}

/**
 * @return Whether navigation should be visible for this webview or not
 */
public boolean navigationIsVisible() {
    //If override is on, always hide
    if (Config.FORCE_HIDE_NAVIGATION) return false;

    //Only hide navigation if key is provided and is true
    return (!this.getArguments().containsKey(HIDE_NAVIGATION) ||
            !this.getArguments().getBoolean(HIDE_NAVIGATION)
    );
}

@Override
public void onPageStarted(String url, Bitmap favicon) {
    if (navigationIsVisible())
        mSwipeRefreshLayout.setRefreshing(true);
}

@Override
public void onPageFinished(String url) {
    if (mSwipeRefreshLayout.isRefreshing())
        mSwipeRefreshLayout.setRefreshing(false);

    adjustControls();
    hideErrorScreen();
}

@Override
public void onPageError(int errorCode, String description, String failingUrl) {
    if (mSwipeRefreshLayout.isRefreshing())
        mSwipeRefreshLayout.setRefreshing(false);

    if (failingUrl.startsWith("file:///android_asset/") || hasConnectivity()) {
        //It is a local error, or a we have connectivity
    } else {
        showErrorScreen();
    }
}

@Override
public void onDownloadRequested(String url, String suggestedFilename, String mimeType, long contentLength, String contentDisposition, String userAgent) {
    if (!Helper.hasPermissionToDownload(getActivity()))
        return;

    if (AdvancedWebView.handleDownload(mAct, url, suggestedFilename)) {
        // download successfully handled
    } else {
        Toast.makeText(mAct, R.string.download_failed, Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onExternalPageRequest(String url) {

}

@Override
public String[] requiredPermissions() {
    if (Config.WEBVIEW_GEOLOCATION)
        return new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE};
    else
        return new String[0];
}

public void showErrorScreen() {
    final View stub = ll.findViewById(R.id.empty_view);
    stub.setVisibility(View.VISIBLE);

    stub.findViewById(R.id.retry_button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            browser.loadUrl("javascript:document.open();document.close();");
            browser.reload();
        }
    });
}

public void hideErrorScreen() {
    final View stub = ll.findViewById(R.id.empty_view);
    if (stub.getVisibility() == View.VISIBLE)
        stub.setVisibility(View.GONE);
}

}

0 个答案:

没有答案
相关问题