【Android】Uri、UriMatcher、ContentUris详解
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详解相关推荐
- android uri图片压缩,详解android 通过uri获取bitmap图片并压缩
详解android 通过uri获取bitmap图片并压缩 很多人在调用图库选择图片时会在onactivityresult中用media.getbitmap来获取返回的图片,如下: uri mimage ...
- Android设备扫描机制详解
Android设备扫描机制详解 本文基于Android pie,对Android的设备扫描机制做一个全面的解析,由于本人掌握的知识有限,如有讲错的地方还请大家指出来. Android提供了一套扫描机制 ...
- Android WebView(一) WebView详解
WebView,在Android开发中,我们总是会遇到,它是Google封装的,使用WebKit渲染引擎加载显示网页.接下来,我们就详细看看WebView的介绍以及使用.如果你想了解WebView主要 ...
- Android网页浏览器开发详解(一)
Android网页浏览器开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的csdn博客) Androi ...
- 《Android NFC开发实战详解》——6.4节Android NFC P2P开发进阶
本节书摘来自异步社区<Android NFC开发实战详解>一书中的第6章,第6.4节Android NFC P2P开发进阶,作者 赵波,更多章节内容可以访问云栖社区"异步社区&q ...
- Android NFC卡实例详解
Android NFC卡实例详解 公司最近在做一个NFC卡片的工程,经过几天的时间,终于写了一个Demo出来,在此记录下在此过程中遇到的问题.由于之前本人是做iOS的,Android写起来并不是那么的 ...
- Android百度地图实例详解之仿摩拜单车APP(包括附近车辆、规划路径、行驶距离、行驶轨迹记录,导航等)
Android百度地图实例详解之仿摩拜单车APP(包括附近车辆.规划路径.行驶距离.行驶轨迹记录,导航等) 标签: android百度地图行驶轨迹记录共享单车行驶距离和时间 2017-03-08 20 ...
- Android 蓝牙BLE开发详解
Android 蓝牙BLE开发详解 由于年初接手了个有关蓝牙BLE的项目,开始了对蓝牙ble的学习,经过长时间的慢慢学习(学得太慢,太拖了),终于了解了该怎么写蓝牙BLE,现在就给大家分享一下. 一. ...
- android jar 包 意见反馈功能,android重点jar包详解.docx
android重点jar包详解 深入理解View(一):从setContentView谈起 我们都知道?MVC,在Android中,这个?V?即指View,那我们今天就来探探View的究竟.在onCr ...
- Android应用坐标系统全面详解
Android应用坐标系统全面详解 原文链接:CSDN@工匠若水,http://blog.csdn.net/yanbober/article/details/50419117 1. 背景 去年有很多人 ...
最新文章
- mysql工具navicat用户授权_Navicat使用教程:在Navicat Premium中管理MySQL用户 - 第4部分:权限管理器工具...
- 运算服务器v9型号,v9云服务器
- 互换性与技术测量教材pdf_【检验】临床生物化学检验技术(第6版)人民卫生出版社【电子教材PDF】【人卫教材电子版】...
- 【JS】实时监控页面,input框数值自动求和
- RabbitMq(十六)单机多实例集群搭建步骤介绍
- 线程堆栈大小 pthread_attr_setstacksize 的使用【原创】
- 微信 SDK 升级,全面支持异步缓存接口, .NET 3.5/4.0版本5月1日起停止更新
- 自定义注解完成数据库切库
- MySQL 2006-MySQLserver has gone away
- centos7 安装mysql8_CentOS7中安装MySQL8.0.21爬坑记录
- MySQL的高可用实现:MySQL系列之十四
- chrome鼠标手势插件
- 淘宝详情页排版布局怎么做?大神导航,一个神奇的网站,从此开启大神之路!
- 2018年自学编程的学习计划表
- 防火墙——防火墙基础知识
- 缺氧游戏 不给计算机加水,缺氧中的物理学攻略 温度/装饰/水压/热导图文详解...
- 计算机地质模拟,地质过程计算机模拟.ppt
- tinymce富文本数学公式插件
- 相机模型(内参数,外参数)
- 什么是Qi2?新无线充电标准解释
热门文章
- Spring Boot 数据库连接池入门
- 坑爹!花费2亿耗时2年,网站没建完Java都写不好,顶级咨询公司埃森哲被告上法庭
- 入职三天,公司给了100块钱叫我走人
- JVM内存占用情况深入分析,分分钟解开你的疑惑
- 构造函数不可以声明为虚函数,析构函数可以声明为虚函数
- map:根据 value 找 key ?
- 3.MYSQL函数创建和使用
- Python list列表的使用(增删改查)
- Android——设置布局的背景颜色
- Data source rejected establishment of connection, message from server: Too many connections