2014-12-24 5 views
1

Я хотел бы обнаружить, когда мой веб-просмотр загружает определенную страницу, например, неправильную страницу входа. Я пробовал использовать onLoadResource и shouldOverrideUrlLoading, но я не могу заставить их работать, и я думаю, что лучший способ будет анализировать HTML каждый раз, когда веб-просмотр начнет загружать страницу, и если определенная строка будет найдена в HTML , тогда сделайте что угодно.Анализ HTML-содержимого Webview - Android

Есть ли способ для этого? Я пробовал использовать TagSoup, но я не знаю, как связать его с моим веб-просмотром. Вот что мой код выглядит сейчас:

String fullpost = "pass=" + passwordt + "&user=" + usernamet + "&uuid=" + UUID; 

    String url = "mydomain.com"; 
     mWebview.postUrl(url, EncodingUtils.getBytes(fullpost, "BASE64")); 
     mWebview.setWebViewClient(new WebViewClient() { 

      public void onPageFinished(WebView mWebview, String url) { 
       String webUrl = mWebview.getUrl(); 
        if (webUrl.contains("/loginf")) { 
         MainActivity.this.mWebview.stopLoading(); 
         MainActivity.this.setContentView(R.layout.preweb); 

        } 
       } 
     }); 

В основном, postUrl запускается с пользователем нажатием на кнопку в макете, и это то, что начинает WebView, а затем я называю setContentView в макете, который содержит WebView.

Отправляясь, если информация для входа верна, веб-страница переходит на XXX, и если она неверна, она переходит в YYY. Итак, я хочу немедленно обнаружить (и на каждой загрузке страницы), если загружен YYY, то //domagic. Надеюсь, это имеет смысл. Будучи перенаправлением страницы с url в XXX или YYY, автоматический и не инициированный пользователем, shouldOverrideUrlLoading не работает, и я не могу понять, как использовать onLoadResource, поэтому я просто полностью потерян.

Моя текущая мысль - загрузить все в отдельном потоке, а затем использовать WebView для отображения содержимого (таким образом, я могу разобрать HTML), но я не уверен, как это работает или даже как это сделать ,

У кого-нибудь есть идеи или предложения?

ответ

0

Я думаю, что прочитал способ получить текстовую строку содержимого веб-просмотра. Затем вы можете использовать jsoup для его анализа. [neh, даже не нужен jsoup; просто indexOf string check]

Я предлагаю вам рассмотреть возможность обращения к логину с помощью HTTP-клиента. Это дает вам гибкость и кажется более правильным способом. Я использую библиотеку loopj для запросов HTTP и post. Это позволяет использовать более простой код. Для меня, во всяком случае, относительный новичок в Android. Вот какой код из моего проекта, чтобы вы подумали. Я забыл что-то вроде индикатора прогресса и управления файлами cookie.

private void loginFool() { 
    String urlString = "http://www.example.com/login/"; 

    // username & password 
    RequestParams params = new RequestParams(); 
    params.put("username", username.getText().toString()); 
    params.put("password", password.getText().toString()); 

    // send the request 
    loopjClient.post(urlString, params, new TextHttpResponseHandler() { 

     @Override 
     public void onStart() { 
      // called before request is started 
      //System.err.println("Starting..."); 
     } 

     @Override 
     public void onSuccess(int statusCode, Header[] headers, String responseString) { 
      // called when response HTTP status is "200 OK" 

      // see if 'success' was a failed login... 
      int idx = responseString.indexOf("Please try again!"); 
      if(idx > -1) { 
       makeMyToast("Sorry, login failed!"); 
      } 
      // or actual success-ful login 
      else { 

       // manage cookies here 

       // put extractData in separate thread 
       final String responseStr = responseString; 
       new Thread(new Runnable() { 
        public void run(){ 

         extractData(responseStr); 
         selectData(defaultPrefs.getInt("xyz_display_section", 0)); 

         // start the next activity 
         Intent intent = new Intent(MainActivity.this, PageViewActivity.class); 
         startActivity(intent); 
         finish(); 

        } 
       }).start(); 

      } 
     } 

     @Override 
     public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { 
      // called when response HTTP status is "4XX" (eg. 401, 403, 404) 

      makeMyToast("Whoops, network error!"); 
     } 

     @Override 
     public void onFinish() { 
      // done 
     } 

    }); 
} 

Вы можете видеть, что в OnSuccess обратного вызова в обработчик ответа, я могу проверить строку, чтобы увидеть, если Логин не удалось, и, в OnFailure обратного вызова, я даю сообщение об ошибке сети.

Я не достаточно опытен, чтобы узнать, на какой процент веб-серверов работает этот тип почтового входа.

Клиент loopj получает и управляет файлами cookie. Если вы будете получать доступ к страницам с сайта через веб-просмотр, вам необходимо скопировать файлы cookie из клиента loopj, в веб-просмотр. Я мощеные код из нескольких интернет-сообщений, чтобы сделать это:

// get cookies from the generic http session, and copy them to the webview 
CookieSyncManager.createInstance(getApplicationContext()); 
CookieManager.getInstance().removeAllCookie(); 
CookieManager cookieManager = CookieManager.getInstance(); 

List<Cookie> cookies = xyzCookieStore.getCookies(); 
for (Cookie eachCookie : cookies) { 
    String cookieString = eachCookie.getName() + "=" + eachCookie.getValue(); 
    cookieManager.setCookie("http://www.example.com", cookieString); 
    //System.err.println(">>>>> " + "cookie: " + cookieString); 
} 
CookieSyncManager.getInstance().sync(); 
// holy crap, it worked; I am automatically logged in, in the webview 

EDIT: И, я должен был включать переменные определения и инициализации класса:

private AsyncHttpClient loopjClient = new AsyncHttpClient(); 
private PersistentCookieStore xyzCookieStore; 

xyzCookieStore = new PersistentCookieStore(this); 
loopjClient.setCookieStore(Utility.xyzCookieStore);