技術學習記錄

[Android]四大元件之Content Provider

關於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網站。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *