天天看點

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.

a)       Public void addURI(String authority,String path,int code)

添加一個用于比對的URI,當比對成功時則code。URI可以是精确的字元串,uri中帶有*表示可比對任意text,#表示隻能比對數字。

Authority:用于比對的域名;

Path:比對路徑,*表示text的占位符,#表示使用數字的占位符;

Code:當使用比對成功後傳回code,值需要大于0,否則抛出IllegalArgument異常。

此方法将authority按照”/”進行拆分,然後将拆分後的每一部分儲存到UriMatcher類型的ArrayList中;在添加的時候會判斷目前authority是否已經添加過,若已加則break;若未添加過,則判斷是否含有”#”則将其辨別成1代表域名後面跟随的是數字;”*”辨別成2,代表域名後面跟随的是文本;0代表後面沒有跟随資料;最後建立一個新的UriMatcher對象添加到集合中。

b)       Public int match(Uri uri)

嘗試在url中比對相對應的路徑

Uri:指定需要比對的url;

傳回值:在使用addURI時産生的code,若沒有比對則傳回-1。

使用uri. getPathSegments()擷取uri中各段存入list中,若list size為0或uri的Authority為null則傳回預設值(此預設值在new時指定,若為指定則為-1);

然後周遊ArrayLis<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;   
       }      

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