2013-09-25 37 views
1

我正在爲我的app使用經過身份驗證的webview。有一個關於搜索條件調用的url,例如,如果您在搜索框中輸入abc,它會調用url「http://something.com/something/abc/something」。它加載得很好,直到我有一個無效的searchterm說,如果我輸入「INVALIDCRAP」,它仍然會採取的網址爲「http://something.com/something/INVALIDCRAP /東西,並嘗試加載它,從而給我412前提條件錯誤。如果標識符「INVALIDCRAP」不存在,而不是412 precondition錯誤,它會重定向我說「google.com」。關於如何去解決它的任何想法?在此先感謝 這裏是我的代碼相同:如何在android webview url中檢測412條先決條件失敗的錯誤

@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(); 
     } 

    } 

下面是相同的畫面: enter image description here

+0

爲線索,我發現我可以使用onReceivedHttpAuthRequest檢查與一些事件處理的412錯誤響應,但不知道該怎麼做 –

回答

3

如果真的是沒有調用onReceivedError的情況下,我想只有一個選項(並且只有在您控制網站的情況下)。只要假定標題將包含例如「服務器錯誤」(如果發生412)。

...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"; 
} 
+0

難道不這樣開放的谷歌瀏覽器?有沒有辦法打開內置碎片? –

+0

這不會打開谷歌瀏覽器!你不會在這裏廣播意圖,只是使用webview類的特定實例的方法。您正在訂購它來加載特定的網址。 – MadDeveloper

+0

如果我計劃打開另一個片段而不是url,該怎麼辦?這是如何工作 –

相關問題