關於Content Provider
Content Provider是Android提供給應用程式間共享資料的一個介面。
目前Android內建了幾個可以提供給外部應用程式使用的內容:
- 聯絡人
- 電話紀錄
- 影片、音樂、圖片等多媒體
- 瀏覽器
- 系統設定
這些分享資料的基本格式是使用URI當成資料傳遞的媒介,格式如下:
content://[path]/id
關於Content Resolver
前面提到Content Provider是負責將手機中共享資料提供給應用程式使用的元件,而Content Resolver則是用來取得或是修改這些共享資料的元件。
但有一點必須先提到,若需要寫入或是修改資料,則要看目標的Content Provider是否允許使用者對資料存取的動作,如果沒有此權限,則Content Resolver方法就會失敗。
以下用取得手機中的音樂檔為實際操作例子:
ContentResolver resolver = getContentResolver();
// 設定查詢的 URI 為 MediaStore.Audio
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] projection = new String[]{
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DURATION
};
// 指定查詢的音樂時間長度大於 1 分鐘
String selection = MediaStore.Audio.Media.DURATION + " >= ?";
String[] selectionArgs = new String[]{
String.valueOf(TimeUnit.MILLISECONDS.convert(1, TimeUnit.MINUTES))
};
// 由新到舊排序
String sortOrder = MediaStore.Audio.Media.DATE_ADDED + " DESC";
// 透過 Cursor 查詢
Cursor cursor = resolver.query(uri, projection, selection, selectionArgs, sortOrder);
// 如果查詢條件成立,則遍歷 cursor 中的結果,取出資料
if (cursor != null && cursor.moveToFirst()) {
int idColumn = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
int titleColumn = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
int artistColumn = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
do {
Long thisId = cursor.getLong(idColumn);
String thisTitle = cursor.getString(titleColumn);
String thisArtist = cursor.getString(artistColumn);
// TODO: Do something....
} while (cursor.moveToNext());
cursor.close();
}
以上是 Content Provider的一些說明及簡單的用法。
Android提供了Content Provider元件讓我們可以很以簡單的方式來取得手機中的共享資料,如上面的使用範例。
如果日後有更進階的用法,會額外再補充上去。
如果對於Content Provider想要更深入研究,可以參考Android Developers網站。