Android WebView URL 拦截,我只想加载一个网站及其页面,没有别的
Android WebView URL intercept , i want to load only one website and it's pages , and nothing else
我有一个问题,我正在尝试为我的网站创建一个应用程序,我正在使用 android webview 来做,但是因为有外部 links(广告,返回links.. 等)在我的网站中,当用户单击这些 links 时,webview 打开 links 并且我的应用程序就像浏览器一样,我知道这就是 webview但我希望它只打开我网站 link 的
我验证了 shouldOverrideUrlLoading 方法并拦截了 url
如果 url 与我的网站前缀不同,我返回 true,但是当我单击外部 link 时,webview 变为全白,并且当我单击外部 link 时,希望 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;
}
}
您不必编写 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);
}
}
在这两种情况下,您都消费了事件。试试下面的东西。
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)
。
我有一个问题,我正在尝试为我的网站创建一个应用程序,我正在使用 android webview 来做,但是因为有外部 links(广告,返回links.. 等)在我的网站中,当用户单击这些 links 时,webview 打开 links 并且我的应用程序就像浏览器一样,我知道这就是 webview但我希望它只打开我网站 link 的
我验证了 shouldOverrideUrlLoading 方法并拦截了 url 如果 url 与我的网站前缀不同,我返回 true,但是当我单击外部 link 时,webview 变为全白,并且当我单击外部 link 时,希望 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;
}
}
您不必编写 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);
}
}
在这两种情况下,您都消费了事件。试试下面的东西。
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)
。