标签:android开发 touch icon 回调 google 应用
苹果的Touch Icon相对我们都比较熟悉,是苹果为了支持网络应用(或者说网页)添加到桌面需要的图标,有了这些Touch Icon的网页链接更加和Native应用更相像了。由于苹果设备IPod,IPhone,IPad等设备广泛,很多网页都提供了touch icon这种图标资源。由于Android中并没有及早的有一份这样的标准,当我们想把网页添加到桌面时,仍然需要使用苹果的Touch Icon。<span style="font-family:Arial;font-size:14px;"><link rel="apple-touch-icon" href="/custom_icon.png"></span>如果想支持IPhone和IPad,我们需要使用sizes属性来制定多个图片,默认sizes的值为60 x 60。
<span style="font-family:Arial;font-size:14px;"><link rel="apple-touch-icon" href="touch-icon-iphone.png"> <link rel="apple-touch-icon" sizes="76x76" href="touch-icon-ipad.png"> <link rel="apple-touch-icon" sizes="120x120" href="touch-icon-iphone-retina.png"> <link rel="apple-touch-icon" sizes="152x152" href="touch-icon-ipad-retina.png"></span>在IOS7之前,苹果系统会对添加到桌面的图标进行圆角化等视觉上的处理,为了不让其处理,我们可以使用apple-touch-icon-precomposed来作为rel的值实现。
<span style="font-family:Arial;font-size:14px;"><link rel="apple-touch-icon-precomposed" sizes="72x72" href="http://www.qiyipic.com/20130423143600/fix/H5-72x72.png"> <link rel="apple-touch-icon-precomposed" sizes="114x114" href="http://www.qiyipic.com/20130423143600/fix/H5-114x114.png"> <link rel="apple-touch-icon-precomposed" sizes="57x57" href="http://www.qiyipic.com/20130423143600/fix/H5-57x57.png"> <link rel="apple-touch-icon-precomposed" href="http://www.qiyipic.com/20130423143600/fix/H5-0x0.png"></span>
<span style="font-family:Arial;font-size:14px;"><link rel="apple-touch-icon-precomposed" sizes="72x72" href="http://www.qiyipic.com/20130423143600/fix/H5-72x72.png"> <link rel="apple-touch-icon-precomposed" sizes="114x114" href="http://www.qiyipic.com/20130423143600/fix/H5-114x114.png"> <link rel="apple-touch-icon-precomposed" sizes="57x57" href="http://www.qiyipic.com/20130423143600/fix/H5-57x57.png"> <link rel="apple-touch-icon-precomposed" href="http://www.qiyipic.com/20130423143600/fix/H5-0x0.png"></span>
1.由于Touch Icon url地址没有硬性规定,不能根据url包含某些尺寸来判断使用哪个icon
2.由于网页编写touch icon元素相对随意,不能根据onReceivedTouchIconUrl调用先后来决定使用哪个icon
3.回调中没有sizes属性值,不好确定使用哪个icon
4.如果我们选取质量最高的图片,然后进行适当压缩处理或许可以解决问题,但是将全部icon下载下来或者根据Head头信息总感觉不怎么好。
改进方法<span style="font-family:Arial;font-size:14px;">var touchIcons = []; function gatherTouchIcons(elements) { var normalTouchIconLength = elements.length; var currentElement; for (var i =0; i < normalTouchIconLength;i++) { currentElement = elements[i]; var size; if (currentElement.hasAttribute('sizes')) { size = currentElement.sizes[0]; } else { size = ''; } var info = {'sizes':size, 'rel': currentElement.rel, 'href': currentElement.href}; touchIcons.push(info); } } function obtainTouchIcons() { normalElements = document.querySelectorAll("link[rel='apple-touch-icon']"); precomposedElements = document.querySelectorAll("link[rel='apple-touch-icon-precomposed']"); gatherTouchIcons(normalElements); gatherTouchIcons(precomposedElements); var info = JSON.stringify(touchIcons); window.app_native.onReceivedTouchIcons(document.URL, info); } obtainTouchIcons();</span>
<span style="font-family:Arial;font-size:14px;">package com.example.obtaintouchicon; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity { protected String LOGTAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WebView webView = new WebView(this); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); final String touchIconJsCode = getTouchIconJsCode(); Log.i(LOGTAG , "onPageFinished url = " + url + ";touchIconJsCode=" + touchIconJsCode); view.loadUrl("javascript:" + touchIconJsCode); } }); webView.addJavascriptInterface(new JsObject(), "app_native"); webView.loadUrl("http://192.168.1.5:8000/html/touchicon.html"); } private class JsObject { @JavascriptInterface public void onReceivedTouchIcons(String url, String json) { Log.i(LOGTAG, "onReceivedTouchIcons url=" + url + ";json=" + json); } } private String getTouchIconJsCode() { StringBuilder total = new StringBuilder(); InputStream inputStream = null; BufferedReader bufferReader = null; try { inputStream = getAssets().open("touchicon.js"); bufferReader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = bufferReader.readLine()) != null) { total.append(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (null != inputStream) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return total.toString(); } }</span>返回的JSON数据
<span style="font-family:Arial;font-size:14px;">[ { "sizes":"72x72", "rel":"apple-touch-icon-precomposed", "href":"http://www.qiyipic.com/20130423143600/fix/H5-72x72.png" }, { "sizes":"114x114", "rel":"apple-touch-icon-precomposed", "href":"http://www.qiyipic.com/20130423143600/fix/H5-114x114.png" }, { "sizes":"57x57", "rel":"apple-touch-icon-precomposed", "href":"http://www.qiyipic.com/20130423143600/fix/H5-57x57.png" }, { "sizes":"", "rel":"apple-touch-icon-precomposed", "href":"http://www.qiyipic.com/20130423143600/fix/H5-0x0.png" } ]</span>
<span style="font-family:Arial;font-size:14px;"><link rel="manifest" href="manifest.json"></span>
<span style="font-family:Arial;font-size:14px;">{ "name": "Web Application Manifest Sample", "icons": [ { "src": "launcher-icon-0-75x.png", "sizes": "36x36", "type": "image/png", "density": "0.75" }, { "src": "launcher-icon-1x.png", "sizes": "48x48", "type": "image/png", "density": "1.0" }, { "src": "launcher-icon-1-5x.png", "sizes": "72x72", "type": "image/png", "density": "1.5" }, { "src": "launcher-icon-2x.png", "sizes": "96x96", "type": "image/png", "density": "2.0" }, { "src": "launcher-icon-3x.png", "sizes": "144x144", "type": "image/png", "density": "3.0" }, { "src": "launcher-icon-4x.png", "sizes": "192x192", "type": "image/png", "density": "4.0" } ], "start_url": "index.html", "display": "standalone", "orientation": "landscape" }</span>
但是由于目前,这种标准实施率相对比较低,所以我们还是需要使用苹果的touch icon。
源码下载:http://pan.baidu.com/s/1dDD3gZZ
标签:android开发 touch icon 回调 google 应用
原文地址:http://blog.csdn.net/lz201234/article/details/43191243