在android 4.0中为自定义Web浏览器创建白名单

时间:2012-10-22 21:02:14

标签: android webview browser android-4.0-ice-cream-sandwich whitelist

我正在使用webview为Android创建一个Web浏览器。我在我的服务器中保留了我的白名单(生成xml文件的php文件),所以我可以随时修改它。我的应用验证尝试访问的网址是否在白名单中,如果没有,则显示对话框消息。首先,我为Android 2.3实现了它,一切正常。 现在我需要在android 4.0中实现它,但是当我尝试读取白名单时,它会失败。

这是我对WebView的声明

final WebView TBrowser = (WebView) findViewById(R.id.webView);
    TBrowser.getSettings().setJavaScriptEnabled(true);
    TBrowser.getSettings().setLoadWithOverviewMode(true);
    TBrowser.getSettings().setUseWideViewPort(true);
    TBrowser.setWebViewClient(new webViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            String host = Uri.parse(url).getHost();
            boolean validUrl = false;

            try{
                URL website = new URL("http://www.mysite.com/whitelist.php);
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                XMLReader xr = sp.getXMLReader();
                HandlingXML whiteListHandler = new HandlingXML(host);
                xr.setContentHandler(whiteListHandler);

                xr.parse(new InputSource(website.openStream()));

                validUrl = whiteListHandler.isValid();

            }catch (Exception e){
                e.printStackTrace();
            }

            if (validUrl) {
                // This is my web site, so do not override; let my WebView load the page
                return false;
            }else{

            new AlertDialog.Builder(view.getContext())  
            .setTitle("ERROR")  
            .setMessage("URL not supported. Click on START OVER")   
            .setCancelable(true)  
            .create()  
            .show();  

            return true;
            }
        }
    });

这是xml处理程序的代码:

public class HandlingXML extends DefaultHandler{

boolean validationResult = false;
String hostName;

public HandlingXML(String hn){
    hostName = hn;
}

public boolean isValid(){
    return validationResult;
}


@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {


    if (localName.equals("item") && !validationResult){
        if (attributes.getValue("data").equals(hostName)){
            validationResult = true;
        } else {
            validationResult = false;
        }
    }
}

}

这是生成xml的php:

header("content-type: text/xml");
echo "<?xml version=\"1.0\" ?>\n";
echo "<whiteList>\n";

echo "<item data=\"www.facebook.com\"/>\n";
echo "<item data=\"m.facebook.com\"/>\n";
echo "<item data=\"api.twitter.com\"/>\n";
echo "<item data=\"plus.google.com\"/>\n";
echo "<item data=\"accounts.google.com\"/>\n";
echo "</whiteList>\n";

所以,这在android 2.3中运行良好,但在4.0中跳过了try部分(在阅读和处理白名单时)。

我发现“...你的应用程序在Android 3.0及更高版本上崩溃的原因,但在Android 2.x上工作正常是因为HoneyComb和Ice Cream Sandwich对于滥用UI线程更为严格。 ..“

http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html

现在,有人可以帮我弄清楚如何解决这个问题吗?

在文章中提到使用AsyncTask ...我曾经解决过类似的问题:

改变自:

Thread timer = new Thread() {
        public void run() {
            try {
                sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                Intent QuickRateIntent = new Intent(
                        "com.terillion.TERILLIONBROWSERACTIVITY");
                startActivity(QuickRateIntent);
            }
        }
    };
    timer.start();

要:

new timerAsync().execute();

public class timerAsync extends AsyncTask<Void,Void,Void>{

    @Override
    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        Thread timer = new Thread() {
            public void run() {
                try {
                    sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    Intent QuickRateIntent = new Intent(
                            "com.terillion.TERILLIONBROWSERACTIVITY");
                    startActivity(QuickRateIntent);
                }
            }
        };
        timer.start();
        return null;
    }

}

但我不知道如何让它在这里工作。我需要做出哪些改变?和哪里???

0 个答案:

没有答案