Android - определить URL-адрес MIME? - PullRequest
4 голосов
/ 05 октября 2011

В моем приложении для Android у меня есть различные URL-адреса, к которым я обращаюсь из базы данных, а затем открываю WebView для отображения этого URL-адреса.Обычно URL выглядит примерно так:

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

Эти реферальные ссылки всегда перенаправляют / пересылают на другой URL.Иногда полученный URL-адрес непосредственно к изображению.Иногда это в PDF.Иногда это просто другая HTML-страница.

В любом случае мне нужно различать эти типы страниц.Например, если полученный URL-адрес ссылается на PDF-файл, я хочу использовать трюк Google Docs Viewer для его отображения.Если это просто обычная HTML-страница, я хочу просто отобразить ее, а если это изображение, я планирую загрузить изображение и отобразить его в своем приложении определенным образом.

Я думаю, что лучший способ приблизитьсяэто должно определить тип пантомимы полученного URL.Как ты это делаешь?И есть ли лучший способ выполнить то, что я хочу?

Ответы [ 3 ]

5 голосов
/ 02 декабря 2015

Вы можете узнать, какой тип 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
    }
});

В этом методе вы можете проверить, является ли mimetype pdf, и показать его через Документы Google в WebView, используя измененный URL-адрес, например:

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

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

Надеюсь, это поможет!

0 голосов
/ 22 апреля 2013

Вот мое решение, чтобы получить тип пантомимы.

Он также работает в главном потоке (UI) и обеспечивает план 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;
}

Примечания:

  • Я добавил 150 мс Тайм-аут : не стесняйтесь настраивать это, или удалите его, если вы вызываете это из-за пределов основного потока (и вы можете подождать, пока URLCconnection сделает это работа). Кроме того, ThreadPolicy бесполезен, если вы используете это вне основного потока. об этом ...

  • Для тех, кто интересуется , почему я разрешаю сеть в главном потоке , вот причина:

    Мне нужно было найти способ получить MIME-тип из основного потока, потому что WebViewClient. shouldOverrideKeyEvent (представление WebView, событие KeyEvent) вызывается в основном потоке , и моя реализация этого должна знать тип MIME, чтобы возвратить соответствующее значение (true или false)

0 голосов
/ 05 октября 2011

Я думаю, что заголовок http типа контента должен помочь:

Тип содержимого

...