亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android中處理apple-touch-icon詳解

2020-04-11 11:40:59
字體:
來源:轉載
供稿:網友

蘋果的Touch Icon相對我們都比較熟悉,是蘋果為了支持網絡應用(或者說網頁)添加到桌面需要的圖標,有了這些Touch Icon的網頁鏈接更加和Native應用更相像了。由于蘋果設備IPod,IPhone,IPad等設備廣泛,很多網頁都提供了touch icon這種圖標資源。由于Android中并沒有及早的有一份這樣的標準,當我們想把網頁添加到桌面時,仍然需要使用蘋果的Touch Icon。

Touch Icon

當我們想讓一個網頁比較完美地添加到桌面,通常情況下我們需要設置一個png圖片文件作為apple-touch-icon。比如:

復制代碼 代碼如下:

<link rel="apple-touch-icon" href="/custom_icon.png">

如果想支持IPhone和IPad,我們需要使用sizes屬性來制定多個圖片,默認sizes的值為60 x 60。

復制代碼 代碼如下:

<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">

在IOS7之前,蘋果系統會對添加到桌面的圖標進行圓角化等視覺上的處理,為了不讓其處理,我們可以使用apple-touch-icon-precomposed來作為rel的值實現。

更多關于Touch Icon的信息,可以訪問水果開發者網站了解更多。

Android中有缺陷的實現

在Android WebView提供了處理Touch Icon的回調,onReceivedTouchIconUrl(WebView view, String url,boolean precomposed)該方法返回了對我們有用的touch icon的url,和是否為預組合(在IOS中不需要進行視覺處理)。雖然有這些數據,我們可以進行處理,但是這其中是有問題的,就是我們不好確定文件的大小,來選擇適合的圖片。

舉個例子,如下一個網頁的源碼,其中sizes的順序不規律

復制代碼 代碼如下:

<link rel="apple-touch-icon-precomposed" sizes="72x72" >
<link rel="apple-touch-icon-precomposed" sizes="114x114" >
<link rel="apple-touch-icon-precomposed" sizes="57x57" >
<link rel="apple-touch-icon-precomposed"  >

加載網頁,onReceivedTouchIconUrl輸出的日志

復制代碼 代碼如下:

I/MainActivity( 6995): onReceivedTouchIconUrl url=http://www.qiyipic.com/20130423143600/fix/H5-0x0.png;precomposed=true
I/MainActivity( 6995): onReceivedTouchIconUrl url=http://www.qiyipic.com/20130423143600/fix/H5-57x57.png;precomposed=true
I/MainActivity( 6995): onReceivedTouchIconUrl url=http://www.qiyipic.com/20130423143600/fix/H5-114x114.png;precomposed=true
I/MainActivity( 6995): onReceivedTouchIconUrl url=http://www.qiyipic.com/20130423143600/fix/H5-72x72.png;precomposed=true

從上面的輸出來看,基本上是后面(書寫)的元素先打印出來,所以這個回調的缺陷如下

1.由于Touch Icon url地址沒有硬性規定,不能根據url包含某些尺寸來判斷使用哪個icon
2.由于網頁編寫touch icon元素相對隨意,不能根據onReceivedTouchIconUrl調用先后來決定使用哪個icon
3.回調中沒有sizes屬性值,不好確定使用哪個icon
4.如果我們選取質量最高的圖片,然后進行適當壓縮處理或許可以解決問題,但是將全部icon下載下來或者根據Head頭信息總感覺不怎么好。

改進方法

既然WebView沒有現成的方法滿足我們的需求,只好自己來實現。其實實現方法還是比較簡單地就是js腳本注入檢測網頁元素中得touch icon,返回json數據。

JavaScript方法

下面的JS代碼所做的功能為查找所有為touch icon的link元素,包含正常的還標記為precomposed。然后將這些link元素的屬性存入json數據,最后返回給Java代碼中對應的回調。

復制代碼 代碼如下:

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();

Java代碼

這里為了便于理解還是全部貼出了demo的源碼,demo中當網頁加載完成之后注入上面的js代碼獲取touch icon信息,然后返回給java的回調方法中。如果不清楚Java和JavaScript交互,可以訪問Android中Java和JavaScript交互了解更多。

復制代碼 代碼如下:

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();
  }
}

返回的JSON數據

復制代碼 代碼如下:

[
  {
      "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"
  }
]

我們可以對得到的JSON數據按照需要處理。

Google會改進么

答案是會,而且已經改進,但Google修改的不是onReceivedTouchIconUrl這個方法,而是Google正在推行自己的一套規則。

在Chrome上,Google增加了這樣一個元素,這是Google提供的為網頁程序定義元數據的方法。

復制代碼 代碼如下:

<link rel="manifest" href="manifest.json">

在元數據json中,你可以自定義title,起始頁,程序是橫屏還是豎屏展示。一個簡單地json實例如下,這里我們可以看到其中icons中存在多個類似touch icon的圖標,src代表圖標路徑,sizes代表大小,type就是mimetype,density指的是Android中的屏幕密度(這樣更加Android化了)。

復制代碼 代碼如下:

{
  "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"
}

關于Google這套新的標準,可以參考Add to Homescreen 

但是由于目前,這種標準實施率相對比較低,所以我們還是需要使用蘋果的touch icon。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看国产欧美| 在线精品国产成人综合| 色老头一区二区三区在线观看| 国产男女猛烈无遮挡91| 精品久久国产精品| 成人网在线视频| 欧美日韩免费在线| 久久最新资源网| 啊v视频在线一区二区三区| 日韩日本欧美亚洲| 亚洲成人av资源网| 亚洲成人中文字幕| 97香蕉久久超级碰碰高清版| 欧美大全免费观看电视剧大泉洋| 日韩美女写真福利在线观看| 社区色欧美激情 | 久久香蕉频线观| 91在线视频导航| 亚洲视频国产视频| 亚洲欧美一区二区三区在线| 在线精品播放av| www.日韩视频| 国产美女精品视频| 久久久久久91| 欧美在线视频免费观看| 亚洲石原莉奈一区二区在线观看| 久久精品国产视频| 欧美国产亚洲视频| 在线观看欧美成人| 成人激情视频在线观看| 久久99久久亚洲国产| 欧美一级黑人aaaaaaa做受| 日韩有码在线视频| 97在线视频一区| 91久久国产精品91久久性色| 久久久久久久久国产| 精品久久久久久久久久久久久| 中文字幕国内精品| 欧美激情视频网站| 国产精品高潮在线| 欧美激情xxxx性bbbb| 91精品国产自产在线| 国产精品∨欧美精品v日韩精品| 欧美成人精品影院| 在线观看不卡av| 在线播放精品一区二区三区| 日本欧美一二三区| 欧美日韩aaaa| 国产精品88a∨| 日韩资源在线观看| 91av网站在线播放| 国产在线精品播放| 午夜剧场成人观在线视频免费观看| 成人黄色av播放免费| 中日韩美女免费视频网址在线观看| 91久久国产综合久久91精品网站| 91成人国产在线观看| 久久在精品线影院精品国产| 国产区亚洲区欧美区| 亚洲精品一区二区久| 青青草国产精品一区二区| 91色视频在线导航| 亚洲春色另类小说| 久久九九全国免费精品观看| 久久久久久久999精品视频| 夜夜嗨av一区二区三区四区| 日韩精品视频免费专区在线播放| 中文字幕欧美日韩精品| 国产欧美精品在线播放| 7m精品福利视频导航| 欧洲亚洲免费视频| 欧美日韩国产中文字幕| 国产亚洲欧洲黄色| 久久影视电视剧免费网站清宫辞电视| 自拍偷拍亚洲欧美| 久久亚洲综合国产精品99麻豆精品福利| 91亚洲精品在线观看| 美女精品视频一区| 亚洲国产欧美一区二区三区同亚洲| 国产精品电影在线观看| 亚州av一区二区| 日韩高清人体午夜| 亚洲国产高潮在线观看| 91精品国产自产在线老师啪| 少妇高潮 亚洲精品| 日韩中文字幕在线视频播放| 国产激情久久久| 538国产精品一区二区在线| 国产视频丨精品|在线观看| 亚洲精品国产拍免费91在线| 亚洲男人天堂视频| 日韩av电影院| 亚洲二区中文字幕| 亚洲黄页视频免费观看| 97国产一区二区精品久久呦| 久久影视电视剧免费网站清宫辞电视| 国产精品视频在线观看| 欧美黑人极品猛少妇色xxxxx| 91中文字幕在线观看| 国产精品99导航| 九九视频直播综合网| 亚洲美女av电影| 国产精品天天狠天天看| 久久久久久久久久久人体| 日韩av网站在线| 国产一区二区久久精品| 69久久夜色精品国产7777| 国产一区二区三区18| 欧美在线视频观看免费网站| 亚洲综合日韩中文字幕v在线| 成人精品福利视频| 日韩中文字幕国产| 92福利视频午夜1000合集在线观看| 欧美激情视频给我| 亚洲精品美女在线观看播放| 亚洲精品乱码久久久久久金桔影视| 精品综合久久久久久97| 97人人做人人爱| 国产噜噜噜噜久久久久久久久| 久久99视频精品| 动漫精品一区二区| 国产91亚洲精品| 57pao国产成人免费| 中文一区二区视频| 欧美精品电影在线| 久久成人一区二区| 精品视频久久久久久| 久久久精品一区二区三区| 欧美在线一区二区三区四| 欧美国产日韩在线| 狠狠做深爱婷婷久久综合一区| 久久99精品视频一区97| 久久精品久久精品亚洲人| 欧美电影免费在线观看| 欧美xxxx做受欧美.88| 色老头一区二区三区在线观看| 欧美性资源免费| 亚洲色图50p| 欧美大片欧美激情性色a∨久久| 久久久久久久一区二区| 亚洲精品日韩丝袜精品| 亚洲亚裔videos黑人hd| 日韩电影在线观看中文字幕| 欧美色欧美亚洲高清在线视频| 久久青草福利网站| 国产91热爆ts人妖在线| 亚洲欧美日韩久久久久久| 久久久久北条麻妃免费看| 欧美精品久久久久久久久| 国产精品精品视频一区二区三区| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩欧美在线免费观看| 中文字幕综合一区| 国产欧美日韩高清| 最新国产成人av网站网址麻豆| 国产亚洲精品成人av久久ww| 欧美激情在线播放| 国产在线高清精品| 色婷婷av一区二区三区在线观看| 日韩av在线导航| 91精品国产自产在线| 亚洲欧美一区二区三区在线| 2019日本中文字幕| 国产91九色视频|