1. 什么是URI Scheme?
一般情况下,遇到这种概念不清的问题,最好的第一手资料就是wiki,实在看不懂,再看百度百科,但前者给出的资料一般都是更加准确一些。
以下为维基百科和百度百科关于这个问题的连接:
从维基百科上的定义我们得知,URI Scheme 是统一资源标识符(Uniform
Resource Identifier
 )
的命名结构,说白了,就是定义一个资源的(暂且我们先认为URI
Scheme与URI的概念是一样的)。但是,这个资源是一个宽泛的概念,并不一定是我们所说的web资源,它可以是你本机的一个文件,也可以是网络上的
视频,等等。因此,我们有必要从一些常规的误区分辨出来,以加深我们的理解:
(1)认为URI就是URL。

实际上,从其名称上来看,URI(Uniform Resource Identifier) 和URL(Uniform Resource Locator
)两者名称都不一样,所以必然有区别,前者是统一资源标识符,后者是统一资源定位符,后者是网络上用于定位互联网上Web资源的,如HTML文档、图像、视频片段、程序等。

(2)它是一个通用定义,不是“protocols”,也不是URI protocols或者URL protocols。

(3)它经常用于设计特殊的协议。如http scheme(HTTP协议), XML namespaces,文件标示等等。

从上面的一些结论来看,URI Scheme实际上一个概念性的东西,是一个规范,所以符合它的规范的都可以称之为URI Scheme,当然,我们也可以设计我们自己的scheme,用来实现我们特殊的目的。它一般具有如下的形式:

<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]

像:

http://write.blog.csdn.net/postedit/7313543,

file:///c:/WINDOWS/clock.avi

git://github.com/user/project-name.git

ftp://user1:1234@地址

ed2k://|file|%5BMAC%E7%89%88%E6%9E%81%E5%93%81%E9%A3%9E%E8%BD%A69%EF%BC%9A%E6%9C%80%E9%AB%98%E9%80%9A%E7%BC%89%5D.%5BMACGAME%5DNeed.For.Speed.Most.Wanted.dmg|4096933888|2c55f0ad2cb7f6b296db94090b63e88e|h=ltcxuvnp24ufx25h2x7ugfaxfchjkwxa|/

这些都是一个URI Scheme。

其中:

<scheme name>:很明显,这是scheme的名称,对于上面五个scheme,它们scheme名分别是http, file, git, ftp, ed2k(电驴协议),实际上,它们也代表着协议名称。

<hierarchical part>:实际上,一般情况,它包含 authority 和 path。

<query>:可选项目,一般使用;隔开或&隔开的键值对<key>=<value>

<fragmentg> :可选项目包,其它额外的标识信息

从wiki上抄来一个更加具体的例子可能更好的说明问题,假设有如下两个URI Scheme,

foo://username:password@example.com:8042/over/there/index.dtb?type=animal&name=narwhal#nose
urn:example:animal:ferret:nose

它们的分析结果如下:


如果你看懂了这个图,你肯定也明白URI Scheme到底是什么玩意了。

---------------------------------------------------------------------------分割线---------------------------------------------------------------------------


android开发中,我们可能会需要分析webbrowser上web页面的一些特定URI
Scheme,比如说,点击网页上某个下载按钮,该按钮被点击后发出一个scheme,内里包含了需要下载的文件信息。我们监听这个点击事件,获取其
URI Scheme,分析该scheme,然后去下载对应的文件。实际上,就是要分析一些链接,然后再操作,那如何获取路径这个scheme?

假设我们的scheme是电驴协议的URI,如:

ed2k://|file|%5BMAC%E7%89%88%E6%9E%81%E5%93%81%E9%A3%9E%E8%BD%A69%EF%BC%9A%E6%9C%80%E9%AB%98%E9%80%9A%E7%BC%89%5D.%5BMAC-GAME%5DNeed.For.Speed.Most.Wanted.dmg|4096933888|2c55f0ad2cb7f6b296db94090b63e88e|h=ltcxuvnp24ufx25h2x7ugfaxfchjkwxa|/

我们需要做的事就是通过webview重写shouldOverrideUrlLoading这个方法,获取指定的URI Scheme,并解析它,最后下载对应文件。

该函数的作用是:在新的页面进行跳转前,给应用程序一次接管新的url的机会,当应用程序处理了该url,返回true,如果想让当然的webview自行处理,返回false.

以下是一个简单的代码片段。

 webview.setWebViewClient(new WebViewClient()
 {
     @Override
     public boolean shouldOverrideUrlLoading(WebView wv, String url)
     {
         if (null != url && url.startsWith("ed2k:"))
         {
             // Parse the url and download file async...
             return true;
         }
         else
         {
             return super.shouldOverrideUrlLoading(wv, url);
         }
     }
 });  

URI Scheme的更多相关文章

  1. JS魔法堂:Data URI Scheme介绍

    一.前言 上周五公司内部的Any Topic Conf.上我和同事们分享了这个主题,有同事说这个有用,有同事说这个没啥用,后来还延伸到网站性能的话题上,大家讨论的激烈程度让我觉得这次选题还不错.本篇先 ...

  2. 【Win10 UWP】URI Scheme(二):自定义协议的处理和适用场景

    上一篇提到Windows Store协议的使用,其实Windows Store协议仅是系统内建的一种协议规则.我们也可以自己定义一套规范的URI-Scheme,除了可以给其他App调用外,本应用也可以 ...

  3. 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用

    协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...

  4. 网页优化URI(http URI scheme与data URI scheme)

    网页优化的一大首要任务是减少HTTP 请求 (http request) 的次数,例如通过合并多个JS文件,合并CSS样式文件.除此之外,还有一个data URL 的密技,让我们直接把图像的内容崁入网 ...

  5. data URI scheme

    优化网页效能,首要的任务是尽量减少HTTP请求(http request)的次数,例如把多个JavaScript文档合并,多个CSS文件合并等等.此外,还有有一种 data URL 的方法,可以直接把 ...

  6. data URI scheme及其应用

    data URI scheme通俗的来讲就是将一张图片直接塞到HTML中而不是通过HTTP请求去获取.这样从表面上看会降低一次HTTP的请求,实现了对于网页的优化(只是看了其它一些文章data URI ...

  7. 服务器端发送邮件签名采用Data URI scheme包含图片

    要在服务器端基于HTML,拼接邮件内容,原来用户使用outlook采用了邮件签名,签名里含有公司Logo的图片,Outlook的msg文件里是专有的cid:xxxx,这里借用Data URI sche ...

  8. 关于 Data URI Scheme -- data:image/jpg;base64

    转载一篇大神的文章 大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqA ...

  9. 006-网页嵌入数据Data URI scheme

    在项目css中或者图片展示中: url(data:image/png;base64,iVBORw0KGgoAAA 在RFC2397中定义的Data URI scheme,目的是将一些小的数据,直接嵌入 ...

随机推荐

  1. Codevs 1173 最优贸易 2009年NOIP全国联赛提高组

    1173 最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述] C 国有n ...

  2. 关于MessageBox的用法

    今天编写MFC工程的时候,使用MessageBox函数,老是出错,不断从网上查找解决方案,最后找到了 MessageBox( _T("Help, Something went wrong.& ...

  3. 判断UserAgent是否来自微信

    iso: Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko ...

  4. 使用CSS完成元素居中的七种方法

    在网页布局中元素水平居中比元素垂直居中要简单不少,同时实现水平居中和垂直居中往往是最难的.现在是响应式设计的时代,我们很难确切的知道元素的准确高度和宽度,所以一些方案不大适用.据我所知, 在CSS中至 ...

  5. php中的修饰符

    上面使用了一个修饰符U,详见关于修饰符的介绍. PHP正则表达式修饰符的理解: 在PHP正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这 ...

  6. 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数

    ---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...

  7. C语言数据结构之栈:括号匹配

    括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...

  8. 移动端Reactive Native轮播组件

    移动端Reactive Native轮播组件 总结下这段时间学习reactive native的一些东西,我们来认识一下,被炒得这么火的rn,究竟是个什么东西,以及如何去搭建自己的demo. reac ...

  9. CSS 居中方法集锦(*******************************)

      记录收集纯CSS层面实现的水平.垂直居中方法可用于块级.行内快.内联元素以及文字图片等. 水平或垂直居中 1.1 text-align1.2 margin1.3 line-height1.4 pa ...

  10. 来自内部的XSS攻击的防范

    来自内部的XSS攻击的防范 引入:前面我们分2篇文章分别探讨了来自外部的XSS攻击和来自内部的XSS攻击,现在我们来专门探讨如何防范来自内部的XSS攻击. 实践:其实从 http://www.2cto ...