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);
matcher.addURI("com.yfz.Lesson", "person/#", PEOPLE_ID);

第三部,与已经注册的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;}}
}

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3560342.html

【Android】Uri、UriMatcher、ContentUris详解相关推荐

  1. android uri图片压缩,详解android 通过uri获取bitmap图片并压缩

    详解android 通过uri获取bitmap图片并压缩 很多人在调用图库选择图片时会在onactivityresult中用media.getbitmap来获取返回的图片,如下: uri mimage ...

  2. Android设备扫描机制详解

    Android设备扫描机制详解 本文基于Android pie,对Android的设备扫描机制做一个全面的解析,由于本人掌握的知识有限,如有讲错的地方还请大家指出来. Android提供了一套扫描机制 ...

  3. Android WebView(一) WebView详解

    WebView,在Android开发中,我们总是会遇到,它是Google封装的,使用WebKit渲染引擎加载显示网页.接下来,我们就详细看看WebView的介绍以及使用.如果你想了解WebView主要 ...

  4. Android网页浏览器开发详解(一)

    Android网页浏览器开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的csdn博客) Androi ...

  5. 《Android NFC开发实战详解》——6.4节Android NFC P2P开发进阶

    本节书摘来自异步社区<Android NFC开发实战详解>一书中的第6章,第6.4节Android NFC P2P开发进阶,作者 赵波,更多章节内容可以访问云栖社区"异步社区&q ...

  6. Android NFC卡实例详解

    Android NFC卡实例详解 公司最近在做一个NFC卡片的工程,经过几天的时间,终于写了一个Demo出来,在此记录下在此过程中遇到的问题.由于之前本人是做iOS的,Android写起来并不是那么的 ...

  7. Android百度地图实例详解之仿摩拜单车APP(包括附近车辆、规划路径、行驶距离、行驶轨迹记录,导航等)

    Android百度地图实例详解之仿摩拜单车APP(包括附近车辆.规划路径.行驶距离.行驶轨迹记录,导航等) 标签: android百度地图行驶轨迹记录共享单车行驶距离和时间 2017-03-08 20 ...

  8. Android 蓝牙BLE开发详解

    Android 蓝牙BLE开发详解 由于年初接手了个有关蓝牙BLE的项目,开始了对蓝牙ble的学习,经过长时间的慢慢学习(学得太慢,太拖了),终于了解了该怎么写蓝牙BLE,现在就给大家分享一下. 一. ...

  9. android jar 包 意见反馈功能,android重点jar包详解.docx

    android重点jar包详解 深入理解View(一):从setContentView谈起 我们都知道?MVC,在Android中,这个?V?即指View,那我们今天就来探探View的究竟.在onCr ...

  10. Android应用坐标系统全面详解

    Android应用坐标系统全面详解 原文链接:CSDN@工匠若水,http://blog.csdn.net/yanbober/article/details/50419117 1. 背景 去年有很多人 ...

最新文章

  1. mysql工具navicat用户授权_Navicat使用教程:在Navicat Premium中管理MySQL用户 - 第4部分:权限管理器工具...
  2. 运算服务器v9型号,v9云服务器
  3. 互换性与技术测量教材pdf_【检验】临床生物化学检验技术(第6版)人民卫生出版社【电子教材PDF】【人卫教材电子版】...
  4. 【JS】实时监控页面,input框数值自动求和
  5. RabbitMq(十六)单机多实例集群搭建步骤介绍
  6. 线程堆栈大小 pthread_attr_setstacksize 的使用【原创】
  7. 微信 SDK 升级,全面支持异步缓存接口, .NET 3.5/4.0版本5月1日起停止更新
  8. 自定义注解完成数据库切库
  9. MySQL 2006-MySQLserver has gone away
  10. centos7 安装mysql8_CentOS7中安装MySQL8.0.21爬坑记录
  11. MySQL的高可用实现:MySQL系列之十四
  12. chrome鼠标手势插件
  13. 淘宝详情页排版布局怎么做?大神导航,一个神奇的网站,从此开启大神之路!
  14. 2018年自学编程的学习计划表
  15. 防火墙——防火墙基础知识
  16. 缺氧游戏 不给计算机加水,缺氧中的物理学攻略 温度/装饰/水压/热导图文详解...
  17. 计算机地质模拟,地质过程计算机模拟.ppt
  18. tinymce富文本数学公式插件
  19. 相机模型(内参数,外参数)
  20. 什么是Qi2?新无线充电标准解释

热门文章

  1. Spring Boot 数据库连接池入门
  2. 坑爹!花费2亿耗时2年,网站没建完Java都写不好,顶级咨询公司埃森哲被告上法庭
  3. 入职三天,公司给了100块钱叫我走人
  4. JVM内存占用情况深入分析,分分钟解开你的疑惑
  5. 构造函数不可以声明为虚函数,析构函数可以声明为虚函数
  6. map:根据 value 找 key ?
  7. 3.MYSQL函数创建和使用
  8. Python list列表的使用(增删改查)
  9. Android——设置布局的背景颜色
  10. Data source rejected establishment of connection, message from server: Too many connections