URI是什么,在Android中有什么作用?

Android开发实战:content:// URI转文件路径的兼容性处理与避坑指南 在Android开发中,文件访问是常见的需求,涉及文件上传、预览、分享等场景。Android系统基于沙盒安全模型,通过content:// URI机制实现应用间安全的文件共享,而非直接暴露文件系统路径。其核心原理是通过ContentResolver解析URI,获取文件描述符或输入流,从而在严格权限控制下访问文件。这一机制在保障安全的同时,也带来了技术挑战,尤其是在处理不同厂商文件管理器返回的多样化URI格式时。本文聚焦于content:// URI到真实文件路径的转换,深入剖析了Android文件访问框架, 阅读详情
URI是什么,在Android中有什么作用? Android中的URI即通用资源标识符,Universal Resource Identifier, 简称URI。 Uri代表要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示。 URI一般由三部分组成: 1、访问资源

      URI是什么,在Android中有什么作用?
Android中的URI即通用资源标识符,Universal Resource Identifier, 简称"URI"。

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

URI一般由三部分组成:

1、访问资源的命名机制。 

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

3、存放资源的主机名。

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

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

某个图片的Uri:content://media/external/images/media/4
我们很经常需要解析Uri,并从Uri中获取数据。
Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。

UriMatcher

UriMatcher 类主要用于匹配Uri.
使用方法如下。
首先第一步,初始化:
1.UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  
第二步注册需要的Uri:
1.matcher.addURI("com.yfz.Lesson", "people", PEOPLE);  
?matcher.addURI("com.yfz.Lesson", "person/#", PEOPLE_ID);  

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




1.Uri uri = Uri.parse("content://" + "com.yfz.Lesson" + "/people");  
2.int match = matcher.match(uri);  
3.       switch (match)  
4.       {  
5.           case PEOPLE:  
6.               return "vnd.android.cursor.dir/people";  
7.           case PEOPLE_ID:  
8.               return "vnd.android.cursor.item/people";  
9.           default:  
10.               return null;  
11.       }  

match方法匹配后会返回一个匹配码Code,即在使用注册方法addURI时传入的第三个参数。
上述方法会返回"vnd.android.cursor.dir/person".

总结: 

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

--# 号为通配符

--* 号为任意字符
另外说一下,官方SDK说明中关于Uri的注册是这样写的:
1.private static final UriMatcher sURIMatcher = new UriMatcher();  
2.    static  
3.    {  
4.        sURIMatcher.addURI("contacts", "/people", PEOPLE);  
5.        sURIMatcher.addURI("contacts", "/people/#", PEOPLE_ID);  
6.        sURIMatcher.addURI("contacts", "/people/#/phones", PEOPLE_PHONES);  
7.        sURIMatcher.addURI("contacts", "/people/#/phones/#", PEOPLE_PHONES_ID);  
8.        sURIMatcher.addURI("contacts", "/people/#/contact_methods", PEOPLE_CONTACTMETHODS);  
9.        sURIMatcher.addURI("contacts", "/people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);  
10.        sURIMatcher.addURI("contacts", "/deleted_people", DELETED_PEOPLE);  
11.        sURIMatcher.addURI("contacts", "/phones", PHONES);  
12.        sURIMatcher.addURI("contacts", "/phones/filter/*", PHONES_FILTER);  
13.        sURIMatcher.addURI("contacts", "/phones/#", PHONES_ID);  
14.        sURIMatcher.addURI("contacts", "/contact_methods", CONTACTMETHODS);  
15.        sURIMatcher.addURI("contacts", "/contact_methods/#", CONTACTMETHODS_ID);  
16.        sURIMatcher.addURI("call_log", "/calls", CALLS);  
17.        sURIMatcher.addURI("call_log", "/calls/filter/*", CALLS_FILTER);  
18.        sURIMatcher.addURI("call_log", "/calls/#", CALLS_ID);  
19.    }  

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

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




ContentUris

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

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

比如有这样一个Uri
view plaincopy to clipboardprint?
1.Uri uri = Uri.parse("content://com.yfz.Lesson/people")  
通过withAppendedId方法,为该Uri加上ID
view plaincopy to clipboardprint?
1.Uri resultUri = ContentUris.withAppendedId(uri, 10);  
最后resultUri为: content://com.yfz.Lesson/people/10
2)从路径中获取ID: parseId(uri)
view plaincopy to clipboardprint?
1.Uri uri = Uri.parse("content://com.yfz.Lesson/people/10")  
2.long personid = ContentUris.parseId(uri);  

最后personid 为 :10
附上实验的代码:
1.package com.yfz;  
2.import com.yfz.log.Logger;  
3.import android.app.Activity;  
4.import android.content.ContentUris;  
5.import android.content.UriMatcher;  
6.import android.net.Uri;  
7.import android.os.Bundle;  
8.public class Lesson_14 extends Activity {  
9.          
10.        private static final String AUTHORITY = "com.yfz.Lesson";  
11.        private static final int PEOPLE = 1;  
12.        private static final int PEOPLE_ID = 2;  
13.          
14.        //NO_MATCH表示不匹配任何路径的返回码   
15.        private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);  
16.        static  
17.        {  
18.            sURIMatcher.addURI(AUTHORITY, "people", PEOPLE);  
19.              
20.            //这里的#代表匹配任意数字,另外还可以用*来匹配任意文本   
21.            sURIMatcher.addURI(AUTHORITY, "people/#", PEOPLE_ID);  
22.        }  
23.          
24.        @Override  
25.        protected void onCreate(Bundle savedInstanceState) {  
26.            super.onCreate(savedInstanceState);  
27.            Logger.d("------ Start Activity !!! ------");  
28.              
29.            Uri uri1 = Uri.parse("content://" + AUTHORITY + "/people");  
30.            Logger.e("Uri:" + uri1);  
31.            Logger.d("Match 1" + getType(uri1));  
32.              
33.            Uri uri2 = Uri.parse("content://" + AUTHORITY + "/people" + "/2");  
34.              
35.            Logger.e("Uri:" + uri2);  
36.            Logger.d("Match 2" + getType(uri2));  
37.              
38.            //拼接Uri   
39.            Uri cUri = ContentUris.withAppendedId(uri1, 15);  
40.            Logger.e("Uri:" + cUri);  
41.            //获取ID   
42.            long id = ContentUris.parseId(cUri);  
43.            Logger.d("Uri ID: " + id);  
44.        }  
45.          
46.        private String getType(Uri uri) {  
47.            int match = sURIMatcher.match(uri);  
48.            switch (match)  
49.            {  
50.                case PEOPLE:  
51.                    return "vnd.android.cursor.dir/person";  
52.                case PEOPLE_ID:  
53.                    return "vnd.android.cursor.item/person";  
54.                default:  
55.                    return null;  
56.            }  
57.        }  

Android 中Uri.parse()的作用 Uri的概述: 通用资源标志符(Universal Resource Identifier, 简称"URI")。 Uri代表要操作的数据,Android上可用的每种资源 (图像、视频片段、网页等) 都可以用Uri来表示。从概念上来讲,URI包括URL。 Uri的通用格式为:scheme: scheme-specific-part #fragment 1.path转uri: Uri uri = Uri.parse(path); 将路径转换为要操作的数据。 ...... 阅读详情

相关推荐

PCB压合原理与工艺全流程深度解析

PCB压合是多层印制电路板制造中的核心工序,其本质并非简单物理叠加,而是高分子树脂流动、玻璃布应力释放、铜箔热膨胀及界面能调控的协同过程。理解压合原理,需掌握温度-压力-时间三维曲线动态关系;优化工艺流程,须兼顾叠板精度、热压参数匹配与冷却策略;关键影响因素如半固化片(PP)选型、铜箔表面处理、设备温场均匀性、结构对称性、环境湿度及操作手法,共同决定层间结合力、翘曲度与孔壁质量。本文围绕PCB压合原理、工艺流程、关键影响因素三大维度展开,融合IPC标准、实测数据与产线案例,为工艺工程师、NPI人员及设备维护

weixin_29191081的博客 256

Android URI

URI是什么,在Android中有什么作用? Android中的URI即通用资源标识符,Universal Resource Identifier, 简称"URI"。 Uri代表要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示。 URI一般由三部分组成: 1、访问资源的命名机制。  2、资源自身的名称,由路径表示。

nicole_jj的专栏 622

Unity性能优化 - 动态图集

Unity 动态图集是 Unity 引擎中用于处理游戏纹理优化的一种技术。本文介绍了什么是动态图集,动态图集的优缺点,以及提供了一套完整的代码供大家参考。

qq_33808037的博客 4840

Android中的Uri详解

一、概述 通用资源标志符(Universal Resource Identifier, 简称"URI")。Uri代表要操作的数据,Android上可用的每种资源 (图像、视频片段、网页等) 都可以用Uri来表示。从概念上来讲,URI包括URL。 Uri的通用格式为:scheme:scheme-specific-part#fragm...

yy的博客 3万+

SerDes硬件设计原理介绍

接收端:外部差分串行数据------线性均衡器----(CDR从数据中恢复出采样时钟)-----解串器(串行信号转并行信号)-------8B/10B的解码器或解扰器-----FIFO-----FPGA接受差分并行数据。发送端: FPGA发送差分并行数据----FIFO------8B/10B编码器或者扰码器-----串行器(并行信号转串行信号)-----均衡器(滤波)--------TX串行信号差分外发。串行器:8bit的并行数据----2bit的并行数据----1bits的串行数据。

weixin_42304393的博客 1108

不止于连接:用VS Code Remote-SSH深度开发树莓派(Ubuntu 22.04环境实战)

本文详细介绍了如何在Ubuntu 22.04环境下使用VS Code的Remote-SSH功能进行树莓派深度开发。通过SSH配置、VS Code扩展安装和远程环境优化,开发者可以在本地高效编写代码,同时在树莓派上直接运行和测试,解决性能瓶颈问题。文章还提供了高级功能如端口转发、多项目管理和远程调试的实战技巧。

didui8202的博客 352

URI是什么?

URI是什么?

半夏_2021的博客 1万+

父子Agent架构:解决AI系统上下文污染的技术方案

在AI系统设计中,上下文管理是核心挑战之一。传统单Agent架构在处理复杂任务时,常面临上下文无限膨胀导致的信息淹没和性能下降问题。父子Agent架构通过职责分离和上下文隔离机制,采用分而治之的思想,将大任务拆解为多个子任务由专门子Agent处理。该架构中父Agent负责任务规划和结果汇总,子Agent执行具体任务后立即销毁中间状态,通过精炼摘要进行通信。这种设计不仅能有效控制上下文长度,还能提升系统稳定性和执行效率,特别适用于编程辅助、自动化测试等需要多步骤处理的场景。父子Agent架构体现了计算机科学中

weixin_42531710的博客 352

如何用python绘制圆_如何在python中绘制300万个圆圈

我在熊猫数据框中有许多(〜3M)圆的数据集(每个圆都有x,y和od属性).我想将它们相互绘制以可视化图案我以前使用较小的数据集(大约15,000个圆圈)完成了此操作,但现在似乎很king琐(到我只有几十万的时候,内存就增加到了16GB)df是数据框plt是matplotlib.pyplotax2=plt.gca(xlim=(-.25,.25),ylim=(-0.25,0.25))for i,row...

weixin_39898011的博客 607

嵌入式状态机编程-QP状态机框架与常见状态机方法

状态机基本术语 现态:是指当前所处的状态。 条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。 传统有限状态机Fsm实现方法 如图,是一个定时计数器,计数器存在两种状态,一种为设置状态,一种为计时状态 设

qq_36969440的博客 9663

【Unity大规模RTS/攻城战框架】Large Scale Combat System - RTS Sieges深度解析

本文介绍了Unity专业级大规模RTS战斗框架Large Scale Combat System(LSCS)。该系统通过Job System+Burst技术解决了万人级单位的性能问题,提供完整的RTS操作体系、动态阵型系统、战术AI和攻城战功能。其亮点包括可破坏城门、行走城墙、战术AI配置系统,支持URP渲染管线,适用于Total War风格的大规模兵团对战项目。LSCS不仅提供核心战斗系统,还包含UI、小地图等配套模块,是Unity中少有的专业级RTS解决方案,特别适合需要深度战术玩法和大规模战斗的开发者

2403_88403568的博客 1334

android中uri的作用,Android学习笔记之ContentProvider和Uri详解

本文介绍了自定义Content Provider的相关内容,完全解析内容提供者的用法。Content Provider,内容提供者,相信大家对这个组件的名字都不陌生,可能是自己平时做的都是一些简单的App,所以对于Content Provider的使用并不是很多,也不是特别熟悉。但是这里还是对Content Provider作个简单的总结,不是很深入,但是希望能给包括我在内的初学者一点帮助,看完这...

weixin_39987926的博客 704

14003.xilinx系统移植

文章目录1 xilinx 系统移植 sd卡版本1.1 创建项目1.2 拷贝 *.hdf 到工程目录1.3 根据hdf文件对系统进行配置1.3.1 设置内核源码路径为本地1.3.2 设置分区的名称与大小1.4 清除本地缓存并编译成功1.5 打包生成BOOT.BIN并拷贝到sd卡1.6 问题1.7 系统启动成功1.8 配置设备树文件丰富系统外设 1 xilinx 系统移植 sd卡版本 芯片型号 ZYNQ UltraScale+ XAZU2EG ,对应厂家提供的demo板为 zu102或zu104 1.1 创建

写给自己的笔记 481

URI是什么,在Android中有什么作用? .

URI是什么,在Android中有什么作用? Android中的URI即通用资源标识符,Universal Resource Identifier, 简称URI。 Uri代表要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示。 URI一般由三部分组成: 1、访问资源       URI是什么,在Android中有什么作

小妞妞 1052

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 手机内存uri_Android | 作用域存储适配

前言Android 10 已经发布了很长一段时间了,并且 Android 11 已经有很大一部分人在使用了,那么你的程序对他做了适配吗?在 10.0 中,作用域存储变得非常重要,这个新的功能颠覆了我们一直惯用外置存储的方式,因此大量的 app 都面临着代码的适配本篇文章对作用域存储,以及如何进行适配,做了比较详细的介绍在 7.0 以前我们访问内存卡中的文件时可以通过 Uri.fromFile ,将...

weixin_39712969的博客 306

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android中uri的作用,Android Url&Uri详细解析

概述在项目开发中,有时会遇到解析Url、Uri的需求,要从中得到链接中的相应字段、参数等。有多种实现方式,在这里总结一下应用到的。URL与URI的区别Uri - 统一资源标志符Url - 统一资源定位符都是定位资源位置所属包不同Url是 Java提供的一个类,位于java.net.URIUri是Android 提供的一个类,位于android.net.Uri由此可见Uri是Url的扩展,来满足An...

weixin_33245735的博客 2130

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android中uri的作用,Provider中的Uri详解

Uri解析数据访问的方法(如:insert(Uri, ContentValues) and update(Uri, ContentValues, String, String[]))可能被多个线程同时调用,此时必须是线程安全的。其他方法(如: onCreate())只能被应用的主线程调用,它应当避免冗长的操作。ContentResolver(内容解析者)请求被自动转发到合适的内容提供者实例,所以子...

weixin_29526313的博客 1168

URI与Uri的简单认识

上几篇给大家讲了ContentProvider,里面有用到Uri,可能很多同学对Uri是什么,怎么来的,这些都不是很熟悉,今天就给大家具体讲讲Uri 一、URI与Uri 大家可能经常会看到在开发时,怎么有的时候是URI,有的时候是Uri,这是怎么回事? 名称如此相像的两个类是有什么区别和联系? 1.所属的包不同。URI位置在java.net.URI,显然

AfinalStone的专栏 1026

Android中URI的理解(与Intent的联系)

在Android中,几乎所有数据都由URI来表示,如查询ContenProvider中的数据需要URI,Intent启动一个新Activity有时候也需要为Intent设置URI以来表示需要操作的对象, (比如以下代码:        一、打开一个网页,类别是Intent.ACTION_VIEW   Uri uri = Uri.parse(“http://blog.3gstdy.com/

AdolfTianYuan的专栏 2458

Uri详解之——Uri结构与代码提取

上几篇给大家讲了ContentProvider,里面有用到Uri,可能很多同学对Uri是什么,怎么来的,这些都不是很熟悉,今天就给大家具体讲讲Uri 一、URI与Uri 大家可能经常会看到在开发时,怎么有的时候是URI,有的时候是Uri,这是怎么回事? 名称如此相像的两个类是有什么区别和联系? 1.所属的包不同。URI位置在java.net.URI,显然是Java提供的

codepython的专栏 1989

Uri类使用的理论基础--Uri结构分析与

一、URI与Uri 大家可能经常会看到在开发时,怎么有的时候是URI,有的时候是Uri,这是怎么回事? 名称如此相像的两个类是有什么区别和联系? 1.所属的包不同。URI位置在java.net.URI,显然是Java提供的一个类。而Uri位置在android.net.Uri,是由Android提供的一个类。所以初步可以判断,Uri是URI的“扩展”以适应Andro

sugaryaruan的博客 1402

android中URI到底是什么?

android ,URI, ContentProvider, android framework, NotePad

magic_coder的专栏 9939
上一篇: Activity.RESULT_OK
下一篇: Android Cursor用法
普通网友
博客等级 码龄16年 90粉丝 1232原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值