1.Uri

通用资源标志符(Universal Resource Identifier, 简称"URI")。

Uri代表要操作的数据,Android上可用的每种资源 - 图像、视频片段等都可以用Uri来表示。

URI一般由三部分组成:

访问资源的命名机制。

存放资源的主机名。

资源自身的名称,由路径表示。


Android的Uri由以下三部分组成: "content://"、数据的路径、标示ID(可选)

举些例子,如:

所有联系人的Uri: content://contacts/people

某个联系人的Uri: content://contacts/people/5

所有图片Uri: content://media/external

某个图片的Uri:content://media/external/images/media/4


我们很经常需要解析Uri,并从Uri中获取数据。

Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。

虽然这两类不是非常重要,但是掌握它们的使用,会便于我们的开发工作。

下面就一起看一下这两个类的作用。

2.UriMatcher

UriMatcher 类主要用于匹配Uri.

使用方法如下。

首先第一步,初始化:
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  


第二步注册需要的Uri:

matcher.addURI("com.yfz.Lesson", "people", PEOPLE);


第三部,与已经注册的Uri进行匹配:

Uri uri = Uri.parse("content://" + "com.yfz.Lesson" + "/people");int match = matcher.match(uri);       switch (match)       {           case PEOPLE:               return "vnd.android.cursor.dir/people";           case PEOPLE_ID:               return "vnd.android.cursor.item/people";           default:               return null;       }


match方法匹配后会返回一个匹配码Code,即在使用注册方法addURI时传入的第三个参数。

上述方法会返回"vnd.android.cursor.dir/person".

总结:

--常量 UriMatcher.NO_MATCH 表示不匹配任何路径的返回码

--# 号为通配符

--* 号为任意字符


另外说一下,官方SDK说明中关于Uri的注册是这样写的:

private static final UriMatcher sURIMatcher = new UriMatcher();    static    {        sURIMatcher.addURI("contacts", "/people", PEOPLE);        sURIMatcher.addURI("contacts", "/people/#", PEOPLE_ID);        sURIMatcher.addURI("contacts", "/people/#/phones", PEOPLE_PHONES);        sURIMatcher.addURI("contacts", "/people/#/phones/#", PEOPLE_PHONES_ID);        sURIMatcher.addURI("contacts", "/people/#/contact_methods", PEOPLE_CONTACTMETHODS);        sURIMatcher.addURI("contacts", "/people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);        sURIMatcher.addURI("contacts", "/deleted_people", DELETED_PEOPLE);        sURIMatcher.addURI("contacts", "/phones", PHONES);        sURIMatcher.addURI("contacts", "/phones/filter/*", PHONES_FILTER);        sURIMatcher.addURI("contacts", "/phones/#", PHONES_ID);        sURIMatcher.addURI("contacts", "/contact_methods", CONTACTMETHODS);        sURIMatcher.addURI("contacts", "/contact_methods/#", CONTACTMETHODS_ID);        sURIMatcher.addURI("call_log", "/calls", CALLS);        sURIMatcher.addURI("call_log", "/calls/filter/*", CALLS_FILTER);        sURIMatcher.addURI("call_log", "/calls/#", CALLS_ID);    }



这个说明估计已经是Google官方没有更新,首先是初始化方法,没有传参,那么现在初始化时,实际是必须传参的。 可以看一下Android2.2的源码,无参数的构造方法已经是private的了。

另外就是addURI这个方法,第二个参数开始时不需要"/", 否则是无法匹配成功的。

3.ContentUris

ContentUris 类用于获取Uri路径后面的ID部分

1)为路径加上ID: withAppendedId(uri, id)

比如有这样一个Uri
Uri uri = Uri.parse("content://com.yfz.Lesson/people")


通过withAppendedId方法,为该Uri加上ID

Uri resultUri = ContentUris.withAppendedId(uri, 10);

最后resultUri为: content://com.yfz.Lesson/people/10

2)从路径中获取ID: parseId(uri)

Uri uri = Uri.parse("content://com.yfz.Lesson/people/10")long personid = ContentUris.parseId(uri);


最后personid 为 :10

附上实验的代码:

package com.yfz;import com.yfz.log.Logger;import android.app.Activity;import android.content.ContentUris;import android.content.UriMatcher;import android.net.Uri;import android.os.Bundle;public class Lesson_14 extends Activity {private static final String AUTHORITY = "com.yfz.Lesson";private static final int PEOPLE = 1;private static final int PEOPLE_ID = 2;//NO_MATCH表示不匹配任何路径的返回码private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);static    {        sURIMatcher.addURI(AUTHORITY, "people", PEOPLE);                //这里的#代表匹配任意数字,另外还可以用*来匹配任意文本        sURIMatcher.addURI(AUTHORITY, "people/#", PEOPLE_ID);    }@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Logger.d("------ Start Activity !!! ------");Uri uri1 = Uri.parse("content://" + AUTHORITY + "/people");Logger.e("Uri:" + uri1);Logger.d("Match 1" + getType(uri1));Uri uri2 = Uri.parse("content://" + AUTHORITY + "/people" + "/2");Logger.e("Uri:" + uri2);Logger.d("Match 2" + getType(uri2));//拼接UriUri cUri = ContentUris.withAppendedId(uri1, 15);Logger.e("Uri:" + cUri);//获取IDlong id = ContentUris.parseId(cUri);Logger.d("Uri ID: " + id);}private String getType(Uri uri) {int match = sURIMatcher.match(uri);        switch (match)        {            case PEOPLE:                return "vnd.android.cursor.dir/person";            case PEOPLE_ID:                return "vnd.android.cursor.item/person";            default:                return null;        }}}


更多相关文章

  1. 【Android】Uri、UriMatcher、ContentUris详解
  2. Android学习笔记(七)-XML解析与生成:SAX、DOM、PULL(推荐)
  3. Android(安卓)Studio 出现 Gradle's dependency cache may be co
  4. Android解析XML
  5. android intent使用方法
  6. 【Android(安卓)Dev Guide - 03】 - Content Providers
  7. 浅谈Java中Collections.sort对List排序的两种方法
  8. Pycharm安装PyQt5的详细教程
  9. Python list sort方法的具体使用

随机推荐

  1. Native registration unable to find cla
  2. Android Studio 2.0 FileOpUtils Not fou
  3. android 根据Bitmap bitmap 保存图片到手
  4. Android EditText中添加图标的简单方法
  5. 转 Android地图和定位学习总结
  6. 拨号器的实现
  7. Android O, failed to mount /system, /d
  8. Android中dip与px之间单位转换
  9. adb shell 无法启动 (insufficient permis
  10. android gdb ndk so lib