1. 程式人生 > >Android中Uri的使用

Android中Uri的使用

原文轉自:http://www.cnblogs.com/hnrainll/archive/2011/11/15/2250136.html

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.

使用方法如下。

首先第一步,初始化:

  1. UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  
  1. UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  

第二步註冊需要的Uri:

  1. matcher.addURI("com.yfz.Lesson""people", PEOPLE);  
  2. matcher.addURI("com.yfz.Lesson""person/#", PEOPLE_ID);  
  1. matcher.addURI("com.yfz.Lesson""people", PEOPLE);  
  2. 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.        }  
  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.     }  
  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這個方法,第二個引數開始時不需要"/", 否則是無法匹配成功的。

3.ContentUris

ContentUris 類用於獲取Uri路徑後面的ID部分

1)為路徑加上ID: withAppendedId(uri, id)

比如有這樣一個Uri

  1. Uri uri = Uri.parse("content://com.yfz.Lesson/people")  
  1. Uri uri = Uri.parse("content://com.yfz.Lesson/people")  

通過withAppendedId方法,為該Uri加上ID

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

最後resultUri為: content://com.yfz.Lesson/people/10

2)從路徑中獲取ID: parseId(uri)

  1. Uri uri = Uri.parse("content://com.yfz.Lesson/people/10")  
  2. long personid = ContentUris.parseId(uri);  
  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.         private static final String AUTHORITY = "com.yfz.Lesson";  
  10. 相關推薦

    移動開發----android uri.parse()用法

    android 中uri.parse()用法 //1,調web瀏覽器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = new Intent(Intent.ACTION_VIEW, myBlogUri); //2,地圖 U

    AndroidUri的使用

    原文轉自:http://www.cnblogs.com/hnrainll/archive/2011/11/15/2250136.html 1.Uri 通用資源標誌符(Universal Resource Identifier, 簡稱"URI")。 Uri代表要操作的

    javaURI,URL,URL介紹及AndroidUri解析

    一、URI 1.1 定義 在電腦術語中,統一資源識別符號(Uniform Resource Identifier,即URI)是一個用於標識某一網際網路資源名稱的字串。 該種標識允許使用者對任何(包括本地和網際網路)的資源通過特定的協議進行互動操作。 1.2 組成 一般格式為:

    Androidres/drawable(mipmap)/xxxx.png的Uri和url的轉換

      宣告:下列方法已經經過驗證,可用 Uri------>url. /** * res/drawable(mipmap)/xxx.png::::uri---->url * * @return */ private

    Android查詢聯絡人常用的URI

    // 查詢聯絡人的Uri     Uri contactsUri = Uri.parse("content://com.android.contacts/contacts"); // 查詢聯絡人頭像的Uri     Uri uriPhoto = ContentUris.w

    操作Android聯絡人,通話記錄,短息,的URI,和具體的查詢語句,欄位註解。(根據自己需求)

    讀取簡訊的URI:     /**      * 所有的簡訊      */       public static final String SMS_URI_ALL = "content://sms/";       /**      * 收件箱簡訊      */       public sta

    關於Android使用Uri監聽資料庫的變化

        網上原創的關於監聽資料庫變化的文章很少,基本沒找到有用的一篇,所以自己去看了一下藍芽傳輸的原始碼,寫了一個Demo,放在這裡給大家參考一下,看原始碼:     src裡面有三個檔案MyDataProvider、MainActivity和MyBean,看下面:   

    AndroidURIUri

    一、URI與Uri大家可能經常會看到在開發時,怎麼有的時候是URI,有的時候是Uri,這是怎麼回事?名稱如此相像的兩個類是有什麼區別和聯絡?1.所屬的包不同。URI位置在java.net.URI,顯然是Java提供的一個類。而Uri位置在android.net.Uri,是由A

    Android的線程

    開發者 又是 ace appcompat 技術 ted unknown 消息通知 設計模型 本文轉自:http://www.jianshu.com/p/d59b3cce2b54 如何理解線程 在操作系統中,線程是操作系統調度的最小單元,同時線程又是一種受限的系統資源,即

    AndroidgetDrawable和getColor過時的替代方法

    this logs con 知識 log launcher 16px ase spa 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 前言 Android SDK 升級到 23 之後,getDrawable和getColor方法提示過時。 解決方案 getRe

    EventBus在Android的簡單使用

    pos stop hub create 數據傳遞 bsp 還要 GridView itemclick EventBus是一個方便與Android中各組件通信的開源框架,開源地址;https://github.com/greenrobot/EventBus。Ev

    Android通過反射來設置Toast的顯示時間

    ring margin ner manage etc short 延遲 lln sse 這個Toast的顯示在Android中的用途還是非常大的,同一時候我們也知道toast顯示的時間是不可控的。我們僅僅能改動他的顯示樣式和顯示的位置,盡管他提供了一個顯示時間的設置方法

    Android的GraphicBuffer同步機制-Fence

    mman fill spl 之前 超出 on() passing cli 觸發 Fence是一種同步機制,在Android裏主要用於圖形系統中GraphicBuffer的同步。那它和已有同步機制相比有什麽特點呢?它主要被用來處理跨硬件的情況。尤其是CPU。GPU和HWC

    Android處理大圖片時圖片壓縮

    oca 內存空間 pan std ret bitmap sans source tar 1、BitmapFactory.Options中的屬性 在進行圖片壓縮時,是通過設置BitmapFactory.Options的一些值來改變圖片的屬性的,以下我們來看看BitmapF

    關於android的單位(dp、sp)

    字號 兩個 metrics 不一定 ont ace white 超級 style android讓人頭疼的適配問題。 --------- Android 中的單位大概有這些: 經常使用的dip、sp。有時候用到px。 --------- 介紹兩個類: Type

    android圖型的陰影效果(shadow-effect-with-custom-shapes)

    sim 狀態 odi bottom msu custom top ado cto 思路:在自己定義shape中添加一層或多層,並錯開。就可以顯示陰影效果。為添加立體感,button按下的時候,僅僅設置一層。我們能夠通過top, bottom, right 和 left 四

    Android驗證輸入是否為漢字及手機號,郵箱驗證,IP地址可用port號驗證

    bili repl ips gettext content 驗證 arr mat 數據 1,驗證是否為漢字 // 驗證昵稱 private boolean verifyNickname() { String nickname = edt_use

    Android帶你開發一款自動爆破簽名校驗工具kstools

    系統服務 代理類 water 利用 技術分享 roo 解決 問題 dia 一、技術回顧 為了安全起見,一些應用會利用自身的簽名信息對應用做一層防護,為了防止應用被二次打包操作,在之前已經介紹了很多關於應用簽名校驗爆破的方法,一條基本原則不能忘:全局搜索"signature"

    android使用videoview播放視頻

    idg pla dea extern sch dia 關聯 extend out 先是布局文件: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 x

    Android的Surface, SurfaceHolder, SurfaceHolder.Callback, SurfaceView

    oid 格式 坐標系 androi 繪制 是把 nts embedded 成員 傳入一個surface,然後讓openGL在surface上畫圖 window->view hierachy(DecorView是tree的root)->ViewRoot->