Android — определить тип mime URL?

#android #url #webview #mime-types

#Android #url #webview #mime-типы

Вопрос:

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

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

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

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

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

Ответ №1:

Вы можете узнать, какой 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 Docs в WebView, используя измененный URL-адрес следующим образом:

 String pdfPrefixUrl = "https://docs.google.com/gview?embedded=trueamp;url="

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

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

Комментарии:

1. Ты спас меня @Yazon2006. Спасибо

2. Это работает только с загруженными файлами. Для содержимого, которое обычно отображается непосредственно в браузере, например, изображений, это не сработает.

Ответ №2:

Вот мое решение для получения типа mime.

Он также работает в основном потоке (UI) и предоставляет план B для определения типа 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, событие KeyEvent) вызывается в основном потоке, и моя реализация должна знать тип mime, чтобы вернуть соответствующее значение (true или false)

Ответ №3:

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

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

Комментарии:

1. Есть какие-нибудь подсказки, как получить доступ к заголовку в Android?

2. Вы используете AndroidHttpClient или что-то в этом роде, чтобы получить содержимое этих ссылок? Если да, то у вас должен быть метод getHeaders в объекте HttpResponse, возвращаемом HTTP-клиентским классом.

3. Я понял это. Я использовал HttpClient , HttpGet и HttpResponse для извлечения заголовков и искал Content-Type заголовок. Спасибо!