編輯:關於Android編程
ContentProvider
是安卓系統的四大組件之一,可以向其他組件提供數據訪問的能力。它就像是一個網站,其他組件(或者其他應用)可以通過“網址”訪問它,獲取需要的信息。因此它可以作為不同應用之間共享數據的一種方式。
我們操作一個應用的數據,無外乎四種操作方式,
增:添加新的數據; 刪:刪除已有的數據; 改:修改已經的數據; 查:查詢已有的數據;所以一個ContentProvider
要對外提供這四種最基礎的功能至少一種。
對數據的操作范圍無外乎,
單條數據的操作:每一次操作增加一條數據,刪除一條數據,修改一條數據,查詢特定一條數據的詳細內容; 多條數據的操作:每一次操作增加多條數據,刪除多條數據,修改多條數據,查詢符合某個特征的多條數據;例如,我們可能會向書架上“一次放一本書”-單條增,“一次取下一本書”-單條刪,“一次問書架上有多少書”-多條查。
因此,仿照網站地址的設計方式,我們可以用如下的“網絡地址”來表達我們希望進行的操作是針對單一一條數據還是同時多條數據:
xxx.xxx.xxx/items/1:針對單一一條數據,最後的數字代表特定一本書的編號(也可以使用書的名字來代替); xxx.xxx.xxx/items:針對多條數據;“網站”只要看到以上的格式就知道,要操作的是一條數據還是多條數據了。
每個ContentProvider
就是一個“網站”,每個網站都有自己的“網址”。安卓系統為這個“網址”設計了如下的結構,
scheme://authority/path
scheme
:固定為“content”,相當於一個網址的“http”; authority
:由開發者自己確定,通常把它寫成這個ContentProvider
的包名,例如“com.anddle.mycontentprovider”,它就相當於網址的地址“www.google.com”; path
:根據查詢內容的邏輯,由開發者自己決定,通常要分成多條數據和單一數據兩類;
典型的例子就像這樣,
多條數據
content://com.anddle.mycontentprovider/items
單一數據
content://com.anddle.mycontentprovider/items/1
這裡面,
scheme:“content”
authority:“com.anddle.mycontentprovider”
path:“items”或者“items/1”
只要定義好了前面兩種原則,外界(其他組件或者其他應用)就可以獲取到ContentProvider
中的內容了。
安卓系統上,提供了很多系統級的ContentProvider
,我們可以直接使用。例如,
Media Provider
:用來查詢磁盤上多媒體文件; Contacts Provider
:用來查詢聯系人信息; Calendar Provider
:用來提供日歷相關信息的查詢; Bookmark Provider
:用來提供書簽信息的查詢;
它們的用法大同小異,只要使用它們對應的Uri地址就可以進行增刪改查的操作了。
這裡我們就用Media Provider
來講解。
Media Provider
作為系統級別的應用程序在系統上運行,專門負責收集多媒體文件(音頻、視頻、文件)相關的信息。
Media Provider
在開機啟動後,會在後台“監聽”磁盤上文件的變化,特定情況下,會自動更新多媒體文件的信息,例如磁盤上是否增加了媒體文件,是否被刪除了媒體文件,有的媒體文件名稱是否發生了修改等等。
所以當任何應用想獲取這類文件相關的信息時,就可以向Media Provider
發起查詢的請求。Media Provider
幫我們完成了視頻文件信息的收集,因此,當我們要查詢磁盤上的多媒體信息時,就不用自己去遍歷磁盤上的文件進行視頻文件的收集和整理了。
確定向Media Provider
發出查詢請求的地址-uri,我們要查詢的視頻文件都是存放在外部存儲地址上的,就使用指向外部存儲的uri;
//uri就是:content://media/external/video/media"
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
確定要請求的視頻文件信息。我們需要查詢視頻的標題、創建時間,還需要播放它時使用的文件所在地址。這些信息在Media Provider
中都對應著查詢它們使用的字段名稱;
String[] searchKey = new String[] {
MediaStore.Video.Media.TITLE, -->對應文件的標題
MediaStore.Images.Media.DATA, -->對應文件的存放位置
MediaStore.Images.Media.DATE_ADDED -->對應文件的創建時間
};
確定查詢的條件。這個條件參數的寫法就和SQL
數據庫語言的語法一樣。這裡我們不打算講SQL
語法,需要各位自己去學習了;設置成空,表示查詢所有數據項,
String where = null;
設定查詢結果的排序方式,使用默認的排序方式就可以了,
String sortOrder = MediaStore.Video.Media.DEFAULT_SORT_ORDER;
獲取ContentResolver對象,讓它使用前面的參數向Media Provider
發起查詢請求;查詢的結果存放在Cursor
--指標當中;
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(
uri,
searchKey,
where,
null,
sortOrder);
遍歷Cursor
,得到它指向的每一條查詢到的信息;當Cursor
指向某條數據的時候,我們就獲取它攜帶的每個字段的值;
while(cursor.moveToNext())
{
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));
String createdTime = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED));
......
}
Cursor
使用完了之後要把它關閉掉,
cursor.close();
整理一下前面的各個步驟,獲取外部存儲上的視頻資源,方式如下,
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String[] searchKey = new String[] {
MediaStore.Video.Media.TITLE,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DATE_ADDED
};
String [] keywords = null;
String where = null;
String sortOrder = MediaStore.Video.Media.DEFAULT_SORT_ORDER;
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(
uri,
searchKey,
where,
keywords,
sortOrder);
if(cursor != null)
{
while(cursor.moveToNext())
{
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
String name = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));
String createdTime = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED));
......
}
cursor.close();
}
最後一點千萬不要忘記,因為視頻文件存放在外部存儲器中,所以要在應用的AndroidManifest.xml
文件中,添加讀取外部存儲器的權限,
......
今天看到一篇自定view 實現水波紋效果 覺得真心不錯 學習之後再次寫下筆記和心得.但是感覺原作者寫得有些晦澀難懂,也許是本人愚笨 所以重寫此作者教程.感覺他在自定義vi
這是對ListView上拉加載的一個簡單封裝繼承自ListView,同時提供加載接口原理就是通過對FooterView的控制實現上劃加載的效果public class L
?Android統計圖表之柱狀圖(條形圖)柱狀圖是統計圖表中經常用到的一種圖表,比如降雨量之類的統計展示。我之前寫了一些關於Android上的統計圖表庫MPAndroid
activity類處於android.app包中,繼承關系:extends ContextThemeWrapperimplements LayoutInflater.Fa