2011-10-05 244 views
3

在我的Android应用程序中,我有从数据库访问的各种URL,然后打开WebView以显示该URL。通常,url看起来像这样:Android - 检测URL MIME类型?

http://www.mysite.com/referral.php?id=12345 

这些引荐链接总是重定向/转发到另一个url。有时生成的网址直接映射到图片。有时候是以PDF格式。有时候只是另一个HTML页面。

无论如何,我需要能够区分这些不同类型的网页。例如,如果生成的网址链接到PDF文件,我想使用Google文档查看器技巧来显示它。如果它只是一个简单的HTML页面,我只想简单地显示它,如果它是一个图像,我打算下载图像并以某种方式显示在我的应用程序中。

我想这是最好的方法来确定MIME类型的结果网址。你怎么做到这一点?有没有更好的方式来实现我想要的?

回答

0

我认为,内容类型HTTP头应该做的伎俩:

Content type

+0

任何线索如何访问Android中的标题? –

+0

你正在使用AndroidHTTPClient或类似的东西来获取这些链接的内容?如果是,那么你应该在HTTP客户端类返回的HttpResponse对象中有getHeaders方法。 – Mateusz

+0

我想通了。我使用'HttpClient','HttpGet'和'HttpResponse'来检索标题并查找'Content-Type'标题。谢谢! –

-2

这里是我的解决方案来获得MIME类型。

它也在主线程(UI)并提供薪酬计划猜测MIME类型(不是100%肯定虽然)

import java.net.URL; 
import java.net.URLConnection; 

public static String getMimeType(String url) 
{ 
    String mimeType = null; 

    // this is to handle call from main thread 
    StrictMode.ThreadPolicy prviousThreadPolicy = StrictMode.getThreadPolicy(); 

    // temporary allow network access main thread 
    // in order to get mime type from content-type 

    StrictMode.ThreadPolicy permitAllPolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(permitAllPolicy); 

    try 
    { 
     URLConnection connection = new URL(url).openConnection(); 
     connection.setConnectTimeout(150); 
     connection.setReadTimeout(150); 
     mimeType = connection.getContentType(); 
     Log.i("", "mimeType from content-type "+ mimeType); 
    } 
    catch (Exception ignored) 
    { 
    } 
    finally 
    { 
     // restore main thread's default network access policy 
     StrictMode.setThreadPolicy(prviousThreadPolicy); 
    } 

    if(mimeType == null) 
    { 
     // Our B plan: guessing from from url 
     try 
     { 
      mimeType = URLConnection.guessContentTypeFromName(url); 
     } 
     catch (Exception ignored) 
     { 
     } 
     Log.i("", "mimeType guessed from url "+ mimeType); 
    } 
    return mimeType; 
} 

注:

  • 我添加了一个150毫秒超时:随意调整,或删除它,如果你从主线外调用它(并且您可以等待URLCconnection完成它的工作)。另外,如果你在主线程之外使用这个,ThreadPolicy的东西是没用的。有关...

  • 对于那些谁不知道为什么我让网络上的主线程,这里的原因是:

    我必须找到一种方法,从主线程获取的MIME类型,因为WebViewClient. shouldOverrideKeyEvent (WebView view, KeyEvent event)是所谓在主线程我实现的,它需要知道MIME类型,以返回适当的值(true或false)

4

你可以找出在这种方式的MIME内容类型:

webView.setDownloadListener(new DownloadListener() { 
    @Override 
    public void onDownloadStart(String url, String userAgent, 
      String contentDisposition, String mimetype, 
      long contentLength) { 

     //here you getting the String mimetype 
     //and you can do with it whatever you want 
    } 
}); 

在这种方法中,你可以检查,如果MIME类型是PDF格式,并使用修改后的URL像这样的WebView显示它通过谷歌文档:

String pdfPrefixUrl = "https://docs.google.com/gview?embedded=true&url=" 

if ("application/pdf".equals(mimetype)) { 
    String newUrl = pdfPrefixUrl + url; 
    webView.loadUrl(newUrl); 
}  

希望这将有助于!