2011-04-19 46 views
1

我希望有人能指出我在哪里很厚。Android的webview问题与链接过滤

我打电话给一个webviewclient并重写加载,以捕获mailto链接(工作)和特定的外部URL(不工作)。具体的链接只是在浏览器中为非移动站点链接启动。我很想弄清楚这一点。

public boolean shouldOverrideUrlLoading(WebView view, String url) {   
    if (url.startsWith("mailto:")) {      
     url = url.replaceFirst("mailto:", ""); 
      url = url.trim(); 
      try { 
      url = URLDecoder.decode(url,"UTF-8"); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
    int subjectStart = url.indexOf("subject="); 
      int subjectStop = url.indexOf("&body="); 
      String subject = url.substring(subjectStart,subjectStop); 
      subject = subject.replace("subject=", ""); 
      String bod = url.substring(subjectStop); 
      bod = bod.replace("&body=", ""); 
      Intent i = new Intent(Intent.ACTION_SEND); 
      i.setType("test/plain"); 
      i.putExtra(Intent.EXTRA_SUBJECT,subject);    
      i.putExtra(Intent.EXTRA_TEXT, bod); 
      startActivity(i); 
      return true; 

} else if (url.contains("[EXTERNAL LINK I WANT TO OPEN IN BROWSER]") == true) { 
    //tried without intent and nothing 
    Uri uri = Uri.parse(url.toString()); 
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri); 
    startActivity(browserIntent); 

    return false; //tried true here too 

} else { 
    view.loadUrl(url); 
    return true; 
    } 
} 

[...] 

我试图打回真,返回false那里,我尝试了版本无意的浏览器。几乎所有的人都会在web浏览器中打开链接而不是浏览器,而那些没有做过的浏览器并没有做任何事情。

mailtos工作得很好,我在外部链接上缺少什么?

如果你需要它,这里是我如何调用webclient。

public class MyWebViewClient extends WebViewClient { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    switcher = (ViewSwitcher) findViewById(R.id.profileSwitcher); 
    WebView webView = (WebView) findViewById(R.id.webview); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.loadUrl("[MY SITE]"); 
    webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
    webView.setWebViewClient(new MyWebViewClient() 
    { 
     public void onPageFinished(WebView view, String url) { 
      if (REFRESH_WEB ==1){ 
      startScan(); 
      REFRESH_WEB++; 
      } 
       } 
    }); 
+0

尝试使用'Log'记录每个检索到的URL,并查看'contains()'调用出错的位置。 – CommonsWare 2011-04-19 20:24:42

回答

2

你不得不把它写在第一时间,当你想在浏览器启动,你应该返回true,还你正在做的mailto模式一些额外的工作。您可以使用内置的MailTo类。 @CommonsWare上的+1也会评论一些东西,以确定它是否适合你。

public boolean shouldOverrideUrlLoading(Webview view, String url){ 

     if(url.startsWith("mailto:"){ 
      MailTo mt = MailTo.parse(url); 
      //populate intent with mt.getSubject(), mt.getBody(), etc 
      //start activity 
      return true; 
     } 
     else if(url.contains("youtube.com")){ 
      Uri uri = Uri.parse(url.toString()); 
      Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri); 
      startActivity(browserIntent); 
      return true; 
     } 
     else return false; 
}