10

たとえば、ユーザーが入力したURLのファビコンを取得しようとしています

_url = "google.com";

HttpUrlConnection を使用して/favicon.ico、ホスト URL の拡張子からファビコンのビットマップを取得します。

        String faviconString = Uri.parse(_url).getHost() + "/favicon.ico";
        URL faviconUrl = null;
        Bitmap favicon = null;
        try
        {
            faviconString = "http://" + faviconString;
            faviconUrl = new URL(faviconString);
            HttpURLConnection connection = (HttpURLConnection) faviconUrl.openConnection();
            connection.setDoInput(true);
            connection.connect();
            favicon = BitmapFactory.decodeStream(connection.getInputStream());
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return favicon;

ただし、ユーザーはおそらくhttp://orを指定しないhttps://ため、自分で追加する必要があります。私が抱えている問題はhttp://、URL の前に追加するとすべて正常に動作することですがhttps://、一部のサイトではファビコンが返され、他のサイトでは null が返されるだけです。を使用しているページを確認するにはどうすればよいhttpsですか? http://すべての場合に追加する必要がありますか?厳密に制限しhttps、使用に対して null を返すWeb サイトはありますhttpか?

4

6 に答える 6

4

注:私の答えがどれほど役立つかはわかりません。

Google を使用してファビコンを取得できます。

http://www.google.com/s2/favicons?domain=stackoverflow.com

戻り値:

ここに画像の説明を入力

httpまたはを指定する必要はありませんhttps

 http://www.google.com/s2/favicons?domain=my.yorku.ca ===>> (https://my.yorku.ca)

戻り値:

ここに画像の説明を入力

しかし、これはhttps://my.yorku.caが使用する実際のファビコンではありません。したがって、ファビコンへのアクセスを提供していないサイトの場合、Google はデフォルトのものを返すと思います。

InputStream is = null;

String urlPrefix = "http://www.google.com/s2/favicons?domain=";

String _url = "google.com";

Bitmap favicon = null;

try {

    is = (InputStream) new URL(urlPrefix + _url).getContent();

} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

favicon = BitmapFactory.decodeStream(is);

デフォルトのファビコンのコピーを実際に保持して、次のことを確認できます。

if (defaultBitmap.sameAs(favicon)) {
    // favicon wasn't available
}
于 2013-09-24T03:08:33.700 に答える
1

ウェブサイトがnullまたはfaviconを返すかどうかを確認するのはどうですか?

これがお役に立てば幸いです

于 2013-09-23T18:41:20.520 に答える
1

URL が「https」で始まる場合は、これを試してください。

              TrustManager[] trustAllCerts = new TrustManager[]
               {
                 new X509TrustManager()
                  {
                    public java.security.cert.X509Certificate[] getAcceptedIssuers()  { return null; }
                    public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType)  {}
                    public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType)  {}
                  }
                 };
              try
                {
                  SSLContext sc = SSLContext.getInstance( "SSL"); // "TLS" "SSL"
                  sc.init( null, trustAllCerts, null);
                  HttpsURLConnection.setDefaultSSLSocketFactory( sc.getSocketFactory());
                  HttpsURLConnection.setDefaultHostnameVerifier( 
                   new HostnameVerifier() 
                    {
                      public boolean verify( String hostname, SSLSession session) { return true; }
                    } );
                }
               catch( Exception e)
于 2013-09-30T11:53:48.593 に答える
1

さらに「簡単」な別の答え。

ユーザーにファビコンの URL (プロトコルを含む) を入力させ、URL がファビコンを返すことを確認するだけです。そうでない場合は、検証エラーをエンド ユーザーに表示します。

アジャイルの原則に従い、最小限の作業を行い、何が機能するかを確認します。1 つの計画がうまくいかない場合は、別の計画を試してください。

于 2013-09-29T16:17:32.297 に答える