2011-10-05 6 views
3

내 Android 앱에는 데이터베이스에서 액세스하는 다양한 URL이 있으며 해당 URL을 표시하기 위해 WebView를 엽니 다. 일반적으로 URL은 다음과 유사합니다.Android - URL MIME 유형을 감지 하시겠습니까?

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

이러한 참조 링크는 항상 다른 URL로 리디렉션됩니다. 결과 URL이 이미지에 직접 나타나는 경우가 있습니다. 때로는 PDF로 연결됩니다. 때로는 다른 HTML 페이지로 연결되기도합니다.

어쨌든 이러한 여러 유형의 페이지를 구별 할 수 있어야합니다. 예를 들어 결과 URL이 PDF 파일로 연결되는 경우 Google 문서 뷰어 트릭을 사용하여 표시하려고합니다. 단순한 HTML 페이지라면 단순히 보여주고 싶습니다. 이미지라면 이미지를 다운로드하고 앱에 특정 방식으로 표시 할 계획입니다.

나는 이것이 결과 URL의 MIME 유형을 결정하는 가장 좋은 방법이라고 생각한다. 어떻게 할 수 있니? 그리고 내가 원하는 것을 성취 할 수있는 더 좋은 방법이 있습니까?

답변

0

나는 콘텐츠 형식 HTTP 헤더 트릭을 할해야한다고 생각 :

Content type

+0

안드로이드에서 헤더에 액세스하는 데 어떤 단서가 있습니까? –

+0

AndroidHTTPClient 또는 그와 비슷한 것을 사용하여 해당 링크의 컨텐츠를 가져오고 있습니까? 그렇다면 HTTP 클라이언트 클래스에 의해 반환 된 HttpResponse 객체에 getHeaders 메소드가 있어야합니다. – Mateusz

+0

나는 그것을 이해했다.헤더를 검색하기 위해'HttpClient','HttpGet','HttpResponse'를 사용했고'Content-Type' 헤더를 찾았습니다. 감사! –

-2

것은 여기 MIME 타입을 얻을 내 솔루션입니다.

또한 메인 스레드 (UI)에 을 작동하고이 MIME 타입을 추측 할 수있는 B 계획을 (비록 확실하지 않은 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; 
} 

노트 제공 :

  • 나는 150ms 타임 아웃를 추가했다 : 그것을 조율하거나, 메인 스레드 바깥에서 이것을 호출하면 제거한다. (URLCconnection이 작업을 수행 할 때까지 기다리는 것이 좋습니다.) 또한 ThreadPolicy 항목은 주 스레드 외부에서 사용하면 쓸모가 없습니다.

    내가 WebViewClient. shouldOverrideKeyEvent (WebView view, KeyEvent event)이기 때문에 메인 스레드에서 MIME 타입을 얻을 수있는 방법을 찾아야했다 : 그것에 대해 ... 내가 메인 스레드에 네트워크를 허용하는 이유 을 궁금해하는 사람들을 위해

  • , 여기에 이유 메인 쓰레드에서 호출과 내 구현은 같은 방법으로 콘텐츠의 유형을 마임 무엇

4

당신은 찾을 수 있습니다 (true 또는 false)를 적절한 값 반환하기 위해 MIME 타입을 알 필요가있다 :

을 16, 이 방법
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을 사용하여 웹보기에 구글 문서 도구를 통해 표시 할 수 있습니다 :

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

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

는 도움이되기를 바랍니다!

관련 문제