0

有人可以帮助我吗?我在使用 LoadUrl 和 javascript 时遇到了困难。

下面的代码在我运行 2.3 的旧 HTC 上似乎可以正常工作(杀死应用程序然后再次尝试使其工作)但是,我运行最新 Android 的 Xperia Z 卡在“尝试获取评论”上。

它坚持的代码部分是InjectJavaScript(),其中这无法LoadUrl(我知道这是因为永远不会调用onPageFinished)。奇怪的是代码的统计部分工作正常且完全相同。

对不起,它的代码很乱......

@SuppressLint("SetJavaScriptEnabled")
public class MyIceland extends SherlockActivity {


    private static class FetchMyIceland extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... arg0) {
            setDialog("Checking Farera for WoW Data....",2);
            switch(FETCHFROMMYICELAND){
            case 0: //contact Farera for information.   
                Log.i("IcePlan","Farera Check/Empathica Front Page Retrieval...");
                MyIceland.url = MainActivity.BASE_URL+"android_get.php?action=myiceland&store="+MainActivity.STORE;
                try {
                    String Result = HTTPGET();
                    if(Result.startsWith("no")){ //content for today?
                        setDialog("No WoW Data Available for Today\nAbout to contact Empathica.com....",2);
                        activity.runOnUiThread(new Runnable(){@Override public void run() {MyIceland.FetchFromEmpathica("http://www.iceland.empathica.com/LogonIceland.aspx");;}}); }
                    else{FETCHFROMMYICELAND = 100;} //we do have content...
                } catch (IOException e1) {Log.i("IcePlan",e1.toString());} catch (Exception e1) {Log.i("IcePlan",e1.toString());
                } //we have data for today, so download and sort it.
            break;
            case 1: //get comments
                setDialog("About to Contact Empathica.com for Comments....",2);
                try {Thread.sleep(1000);} catch (InterruptedException e) {Log.i("IcePlan",e.toString());}
                activity.runOnUiThread(new Runnable(){@Override public void run() {MyIceland.FetchFromEmpathica("http://v2.empathica.com/Reporting1/ClientReporting/LiveDataReporting.aspx?RID=1&PID=Comments&TID=1a");}});
                break;
            case 2: //POST data
                setDialog("Posting all data to Farera.com \n So we don't have to do this again today....",2);
                 List<NameValuePair> params = new ArrayList<NameValuePair>();
                 try {params.add(new BasicNameValuePair("frontpage", URLEncoder.encode(FRONTPAGE, "utf-8")));} catch (UnsupportedEncodingException e) {Log.e("IcePlan",e.toString());}
                 try {params.add(new BasicNameValuePair("comments", URLEncoder.encode(COMMENTS, "utf-8")));} catch (UnsupportedEncodingException e) {Log.e("IcePlan",e.toString());}

                 MyIceland.url = MainActivity.BASE_URL+"android_get.php?action=store_myiceland&store="+MainActivity.STORE;
                 String POST = HTTPPOST(params);
                 if(POST != null){FETCHFROMMYICELAND = 100; }

                 break;


            }

            return null;
        }
        @Override
        protected void onPreExecute(){super.onPreExecute();}
        @Override
        protected void onPostExecute(Void arg0){

            if(FETCHFROMMYICELAND == 100) new MyIceland.DisplayMyIceland().execute();
            }

    }
    //------------------------------------------------------
    //-----------------------------------------------------
    //-----------------------------------------------------

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_iceland);
        ctx = getApplicationContext();
        activity = this;
        //webView2 = (WebView) findViewById(R.id.myIwebview2_widget);
        /********************************************************/
        /****************** ABS ********************************/
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().show();
        // This is a workaround for http://b.android.com/15340 from
        // http://stackoverflow.com/a/5852198/132047

        BitmapDrawable bg = (BitmapDrawable) getResources().getDrawable(
                R.drawable.bg_striped);
        bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        getSupportActionBar().setBackgroundDrawable(bg);

        BitmapDrawable bgSplit = (BitmapDrawable) getResources().getDrawable(
                R.drawable.bg_striped);
        bgSplit.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        getSupportActionBar().setSplitBackgroundDrawable(bgSplit);
        /************************************************************/
        try {
            ov_e = (TextView) findViewById(R.id.overall_exp_tx);
            ov_r= (TextView) findViewById(R.id.overall_rank_tx);
            s_e= (TextView) findViewById(R.id.storeexp_tx);
            st_e= (TextView) findViewById(R.id.staffexp_tx);
            t_e= (TextView) findViewById(R.id.tillexp_tx);
            res= (TextView) findViewById(R.id.responses_tx);
            res_r= (TextView) findViewById(R.id.resp_rank_tx);

            MyIceland.list = (ListView) findViewById(R.id.wow_lv); // set list
            MyIceland.adapter = new SeparatedListAdapter(ctx, false); // initialise adapter
            //authenticate
            CookieSyncManager.createInstance(this);
            SetUp(); //Set up webView
            setDialog("Loading MyIceland data...\n Please be Patient...",0);
            new FetchMyIceland().execute(); //get data
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.i("IcePlan",e.toString());
        }

    }

    private static String HTTPPOST(List<NameValuePair> params){
        String Resp = null;
        try {
            HttpClient client = new DefaultHttpClient();  
            String postURL = MyIceland.url;
            HttpPost post = new HttpPost(postURL); 
                //List<NameValuePair> params = new ArrayList<NameValuePair>();
                //params.add(new BasicNameValuePair("user", "kris"));
                UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8);
                post.setEntity(ent);
                HttpResponse responsePOST = client.execute(post);  
                HttpEntity resEntity = responsePOST.getEntity();  
                if (resEntity != null) {  
                    Resp = "not null";

                }
        } catch (Exception e) {
            Log.e("IcePlan HTTPPOST",e.toString());
        }
        return Resp;
    }
    private static String HTTPGET() throws Exception, IOException{
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
        HttpResponse response = client.execute(request);
        InputStream in = response.getEntity().getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder str = new StringBuilder();
        String line = null;
        while((line = reader.readLine()) != null)
        {
            str.append(line);
        }
        in.close();
        Log.i("IcePlan",str.toString());
        return str.toString();
    }   
    private void SetUp(){
        webView = (WebView) findViewById(R.id.myIwebview_widget); //load custom webview
        webView.clearView(); //clear view of browser
        webView.clearFormData(); //clear form data
        webView.setNetworkAvailable(MainActivity.isOnline(ctx)); //set network state
        webView.getSettings().setDomStorageEnabled(true);
        webView.getSettings().setPluginsEnabled(false); //no flash
        webView.getSettings().setJavaScriptEnabled(true); // enable javascript
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
        webView.getSettings().setSavePassword(false); //don't show password dialog
        webView.setVerticalScrollBarEnabled(false); //no scrolling!
        webView.setHorizontalScrollBarEnabled(false); //no scrolling!
        webView.getSettings().setLoadsImagesAutomatically(false); // NO Images
        webView.getSettings().setSaveFormData(false); //Don't save form data

        //webView.setVisibility(View.VISIBLE);
        return;
    }
    private static void FetchFromEmpathica(String EmpathURL){

     /*****************************************************
     * setWebViewClient to load pages
     *****************************************************
     *****************************************************
     */
    webView.loadUrl(EmpathURL);
    MyIceland.page = 0; 
    webView.setWebViewClient(new WebViewClient() {  

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            //Log.i("IcePlan",url);
              view.loadUrl(url);
              return true;
               }
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.i("IcePlan","Starting...");
            super.onPageStarted(view, url, favicon);

        }
           @Override
           public void onPageFinished(WebView view, String url) {

               Log.i("IcePlan","Loaded...");
               switch(FETCHFROMMYICELAND){
               case 0:
                   if(MyIceland.page == 0){

                       MyIceland.page=1;
                       try {Thread.sleep(500);}catch (InterruptedException e) {Log.e("IcePlan",e.toString());}
                       view.loadUrl("javascript: {" +
                                    "document.forms[0].elements['userNameBox'].value = 'xxx.xxxxx';" +
                                    "setTimeout(function(){document.forms[0].elements['passwordBox'].value = 'xxxxxxx';},300);" +
                                    "setTimeout(function(){document.forms[0].elements['loginButton'].click();},300); };");  
                   }else if(MyIceland.page == 1){
                       MyIceland.page=2;
                       try {Thread.sleep(1000);}catch (InterruptedException e) {Log.e("IcePlan",e.toString());}

                       String oAuthUrl=("v2.empathica.com");
                        if(url.indexOf(oAuthUrl) > -1)
                        {
                             Log.i("Contains","Auth URL");  
                              InjectJavaScript(view);
                        }else{view.loadUrl("javascript:{};");}
                   }else if (MyIceland.page ==2){
                       if(MyIceland.FRONTPAGE == null){
                       Log.i("IcePlan","Inject");
                       InjectJavaScript(view);
                       }else{MyIceland.page=3;}

                   }
                   break;
               case 1:
                       if(MyIceland.COMMENTS == null){
                           Log.i("IcePlan","Inject Comments");
                           InjectJavaScript(view);
                        }else{MyIceland.page=100;} //else end

                   break;
               }

               super.onPageFinished(view, url);
           }
        });
    return;

}



    }
    private static void setDialog(final String msg, final int dothis){
        activity.runOnUiThread(new Runnable() {
              @Override
            public void run() {
        switch(dothis){
        case 0: //set up and show
            if (dlg == null) {
                dlg = new ProgressDialog(activity);
                dlg.setTitle("Loading...");
                dlg.setMessage(msg);
                dlg.setCancelable(activity.isFinishing());
                dlg.show();
            }
            break;
        case 1: //remove and reset to null
            if (dlg.isShowing() || dlg!=null) {
                dlg.hide();
                dlg = null;
            }
            break;
        case 2:
            if (dlg.isShowing() || dlg!=null) {
                dlg.setMessage(msg);
            }
        }
              }});
        return;
    }   

/*********************************************************
 * HACK - Inject Javascript to get the HTML we want!
 *********************************************************/
    private static void InjectJavaScript(WebView view){
        switch(FETCHFROMMYICELAND){
        case 0: //get front page
            setDialog("Attempting to get Statistics...",2);
        view.loadUrl("javascript:{" +
                "var element =  document.getElementById('ReportDivFPRank');"+
                "if (typeof(element) != 'undefined' && element != null)"+
                "{" +
                "var e=document.getElementById(\"ReportDivFPCR\");"+
                "var content=e.innerHTML;"+
                "window.HTMLOUT.processHTML(content);"+// exists.
                "}" +
                "};");
        break;
        case 1: //get comments
            setDialog("Attempting to get Comments....",2);
            view.loadUrl("javascript:{" +
                    "var element =  document.getElementById('AddNPSDetails');"+
                    "if (typeof(element) != 'undefined' && element != null)"+
                    "{" +
                    "var e=document.getElementById(\"_ctl1_ReportDiv\");"+
                    "var content=e.innerHTML;"+
                    "window.HTMLOUT.processHTML(content);"+// exists.
                    "}" +
                    "};");
            break;
        }
        return;
        }
    /*********************************************************
     * Class injected into Empathica website to get HTML
     * Continues onto our controlling AsyncTask
     * @author Vince
     *
     ********************************************************/
    public static class MyJavaScriptInterface
      {

          public void processHTML(final String html)
          {
              setDialog("Caught RAW data....",2);
              if(html != ""){
                  //MyIceland.webView2.loadDataWithBaseURL("notreal/", html, "text/htm", "utf-8",null);
                  if(FETCHFROMMYICELAND == 0){ setDialog("Retrieved Area Statistics....",2); MyIceland.FRONTPAGE = html;}
                  else if(FETCHFROMMYICELAND == 1){ setDialog("Retrieved Area Comments....",2); MyIceland.COMMENTS = html;}
                  FETCHFROMMYICELAND++;
                  new MyIceland.FetchMyIceland().execute();

                  }

             return;  
            }
          } 

}
4

1 回答 1

0

我看到FetchFromEmpathica当您加载第二个页面时将再次调用它,并且您再次将 a 设置new WebViewClient()为 webview,将它放在setup()方法上,以便它会被调用一次。

确保您的 Xperia 是 4.1.2,但请查看上面提到的内容

参考:现在必须注释 WebViews 中的 JavascriptInterface 方法

从 Android 4.2 开始,您现在必须使用 @JavascriptInterface 显式注释公共方法,以使它们可以从托管的 JavaScript 访问。请注意,这也仅在您将应用的 minSdkVersion 或 targetSdkVersion 设置为 17 或更高时才会生效。

添加它并import android.webkit.JavascriptInterface

因此,代码将是最新版本的最新版本。

      @JavascriptInterface
      public void processHTML(final String html)
      {
        //code
      }
于 2013-05-06T19:11:10.183 回答