I am using an authenticated webview for my app.There is a url called with respect to a search term, such that if you entered abc in the search box, it will call the url "http://something.com/something/abc/something". It loads fine, until I have an invalid searchterm say if I type in "INVALIDCRAP" it will still take the url as "http://something.com/something/INVALIDCRAP/something and try to load it thus giving me the 412 precondition error. I want to make it such that in case the identifier "INVALIDCRAP" doesnt exist, instead of 412 precondition error it will redirect me to say "google.com".Any ideas on how to go about it ? Thanks in advance Here is my code for the same:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = this.getArguments();
URL = getUrl();
if(bundle != null)
mSearchTerm = getArguments().getString(SEARCH_TERM);
}
public void setSearchTerms(String sTerms){
mSearchTerm = sTerms;
}
private static String getUrl(){
String url = "";
final String getuuid = SharedPreferencesManager.getInstance().getUUID();
final String environmentApi = SharedPreferencesManager.getInstance().getEnvironmentApi();
if (environmentApi.equalsIgnoreCase(NetworkUtils.Apis.ALPHA)) {
"https://something.com/service/v1/?q="+mSearchTerm+"%20revenue&ui.theme=novadark&uuid="+getuuid+"&userAgent=android";
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (goingBack) {
return null;
}
final MainActivity activity = (MainActivity) getActivity();
final Resources resources = Application.getAppResources();
activity.setBackPressListener(this);
View view = inflater.inflate(R.layout.fragment_search_answers, container, false);
mWebview = (WebView)view.findViewById(R.id.webview);
progressBar = (LinearLayout) view.findViewById(R.id.loading);
mWebview.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.VISIBLE);
mWebview.setWebViewClient(new MyWebViewClient(this, mWebview));
mWebview.setBackgroundColor(0);
mWebview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebview.getSettings().setAllowFileAccess(true);
mWebview.getSettings().setDomStorageEnabled(true);
mWebview.getSettings().setJavaScriptEnabled(true);
mWebview.setHttpAuthUsernamePassword(HOST, REALM, USERNAME, PASSWORD);
mWebview.setScrollbarFadingEnabled(false);
mWebview.getSettings().getLoadsImagesAutomatically();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
mWebview.getSettings().setDisplayZoomControls(false);
if(StringUtils.isEmpty(URL)){
}else if(!StringUtils.isEmpty(URL)){
if(URLUtil.isValidUrl(URL)){
mWebview.loadUrl(URL);
}else{
mWebview.loadUrl("http://www.google.com");
}
}
return view;
}
public class MyWebViewClient extends WebViewClient {
private String loginCookie;
public MyWebViewClient(AnswersWebViewFragment answersWebViewFragment, WebView webview) {
super();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
view.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {
view.setVisibility(View.VISIBLE);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie(url, loginCookie);
final Animation fade = new AlphaAnimation(0.0f, 1.0f);
fade.setDuration(200);
view.startAnimation(fade);
view.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
}
@Override
public void onReceivedError( WebView view, int errorCode, String description, String failingUrl ) {
Toast.makeText(view.getContext(), "Authentication Error", Toast.LENGTH_LONG).show();
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public void onLoadResource( WebView view, String url ){
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onReceivedHttpAuthRequest( WebView view, final HttpAuthHandler handler, final String host, final String realm ){
handler.proceed(USERNAME,PASSWORD);
}
@Override
public void onReceivedSslError( WebView view, SslErrorHandler handler, SslError error ) {
handler.proceed();
}
}
Here's the screen for the same:
If that really is the case that onReceivedError is not called then I suppose there's only one option (and only under condition that you control the website). Just make the assumption that the title will contain e.g "Server Error" if 412 happens.
...your code
webview.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
String serverError = "ServerError";
if (title.contains(serverError)) {
view.stopLoading();
webview.loadUrl(getNewUrl());
}
}
});
public String getNewUrl(){
//do your stuff here
return "http://www.google.com";
}
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments