1. 程式人生 > >android中的ContentResolver獲取手機本地圖片

android中的ContentResolver獲取手機本地圖片

獲取手機的本地圖片就是使用ContentResolver類查詢本地的資料庫,只不過需要使用該類進行查詢,並且該類中提供了增刪改查的響應的方法。本篇博文並不對ContentResolver進行詳細的介紹,相比大家在書上面已經瞭解到了ContentResolver的用法,所以本篇博文主要對ContentResolver獲取本地圖片“解惑“。
本人在學習ContentResolver的時候一直很困惑的是ContentResolver查詢的時候欄位是如何設定的?不明白為什麼是這樣的欄位,程式碼如下:

String[] projection = {
                MediaStore.Images
.Media._ID }; Uri ext_uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; String where = MediaStore.Images. + ">=?"; Cursor c = MediaStore.Images.Media.query( mContentResolver, ext_uri, projection, where, new String[]{1
* 100 * 1024 + ""}, MediaStore.Images.Media.DATE_ADDED+" desc"); int columnIndex = c.getColumnIndexOrThrow(MediaStore.Images.Media._ID);

這部分程式碼查詢的是圖片的ID值。一直不明白Media._ID、Media.DATE_ADDED、Media.SIZE這些欄位很困惑,不明百為什麼是這樣的欄位?後來查看了官方android sdk之後才明白,這些欄位都是定義好的。
官方的文件連線:http://www.androidcommunitydocs.com/reference/android/provider/package-summary.html


在官方文件中可以很清楚的看到到底可以查詢哪些欄位,以及這些欄位代表了什麼含義。那麼,舉一反三,可以知道查詢手機本地的視訊、音訊等完全可以參考官方文件即可,不用臨摹別人的程式碼了^_^!
關於獲取手機本地的圖片,android中提供了有四個類:MediaStore.Images.Media、MediaStore.Images.ImageColumns 、MediaStore.Images、MediaStore.Images.Thumbnails。通過這四個類即可實現獲取本地圖片的功能。

  1. MediaStore.Images.Thumbnails獲取手機圖片縮圖,該類中定義了可以獲取的各個欄位:

    String DATA                                圖片資料流
    String DEFAULT_SORT_ORDER   預設排序 該值為”image_id ASC”
    String HEIGHT                             圖片的高度
    String IMAGE_ID                         圖片的ID
    String KIND                                 圖片的型別 支援如下兩個種類值
    int MICRO_KIND                         512 x 384 thumbnail
    int MINI_KIND                             96 x 96 thumbnail
    String THUMB_DATA                  縮圖資料
    String WIDTH                              圖片寬度
    這些欄位可以在查詢得到。

  2. MediaStore.Images.ImageColumns這是一個介面,該介面中包含一下欄位:
    String BUCKET_DISPLAY_NAME
    String BUCKET_ID
    String DATE_TAKEN
    String DESCRIPTION
    String IS_PRIVATE
    String LATITUDE
    String LONGITUDE
    String MINI_THUMB_MAGIC .
    String ORIENTATION
    String PICASA_ID

  3. MediaStore.Images 提供了一個構造器
    public MediaStore.Images () ,自身沒有什麼方法,不過interface MediaStore.Images.ImageColumns
    class MediaStore.Images.Media
    class MediaStore.Images.Thumbnails
    這三個是它的內部類或內部介面

  4. MediaStore.Images.Media 給類是進行本地圖片獲取的實現類,繼承了android.provider.BaseColumns 、android.provider.MediaStore.Images.ImageColumns 、android.provider.MediaStore.MediaColumns 包含以上介紹的全部欄位。
    通過查閱這四個類基本就可以完成對本地圖片獲取的功能。

/**
* 獲取本地圖片的非同步執行緒類
*/
public class LoadLoacalPhotoCursorTask extends AsyncTask<Object, Object, Object> {
    private Context mContext;
    private final ContentResolver mContentResolver;
    private boolean mExitTasksEarly = false;//退出任務執行緒的標誌位
    private OnLoadPhotoCursor onLoadPhotoCursor;//定義回撥介面,獲取解析到的資料

    private ArrayList<Uri> uriArray = new ArrayList<Uri>();//存放圖片URI
    private ArrayList<Long> origIdArray = new ArrayList<Long>();//存放圖片ID

    public LoadLoacalPhotoCursorTask(Context mContext) {
        this.mContext = mContext;
        mContentResolver = mContext.getContentResolver();
    }

    @Override
    protected Object doInBackground(Object... params) {
        String[] projection = {
                MediaStore.Images.Media._ID
        };
        Uri ext_uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String where = MediaStore.Images.Media.SIZE + ">=?";
        /**
        * 這個查詢操作完成圖片大小大於100K的圖片的ID查詢。
        * 大家可能疑惑為什麼不查詢得到圖片DATA呢?
        * 這樣是為了節省記憶體。通過圖片的ID可以查詢得到指定的圖片
        * 如果這裡就把圖片資料查詢得到,手機中的圖片大量的情況下
        * 記憶體消耗嚴重。那麼,什麼時候查詢圖片呢?應該是在Adapter
        * 中完成指定的ID的圖片的查詢,並不一次性載入全部圖片資料
        */
        Cursor c = MediaStore.Images.Media.query(
                mContentResolver,
                ext_uri,
                projection,
                where,
                new String[]{1 * 100 * 1024 + ""},
                MediaStore.Images.Media.DATE_ADDED+" desc");

        int columnIndex = c.getColumnIndexOrThrow(MediaStore.Images.Media._ID);

        int i = 0;
        while (c.moveToNext() && i < c.getCount() && !mExitTasksEarly) {   //移到指定的位置,遍歷資料庫
            long origId = c.getLong(columnIndex);
            uriArray.add(
                    Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            origId + "")
            );

            origIdArray.add(origId);
            c.moveToPosition(i);
            i++;
        }
        c.close();//關閉資料庫
        if (mExitTasksEarly) {
            uriArray = new ArrayList<Uri>();
            origIdArray = new ArrayList<Long>();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        if (onLoadPhotoCursor != null && !mExitTasksEarly) {
        /**
        * 查詢完成之後,設定回撥介面中的資料,把資料傳遞到Activity中
        */          onLoadPhotoCursor.onLoadPhotoSursorResult(uriArray, origIdArray);
        }
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();    //To change body of overridden methods use File | Settings | File Templates.
        mExitTasksEarly = true;
    }

    public void setExitTasksEarly(boolean exitTasksEarly) {
        this.mExitTasksEarly = exitTasksEarly;
    }

    public void setOnLoadPhotoCursor(OnLoadPhotoCursor onLoadPhotoCursor) {
        this.onLoadPhotoCursor = onLoadPhotoCursor;
    }

    public interface OnLoadPhotoCursor {
        public void onLoadPhotoSursorResult(ArrayList<Uri> uriArray, ArrayList<Long> origIdArray);
    }
}

通過上面這個程式碼示例基本瞭解瞭如何獲取本地圖片的過程。隨後我會把獲取本地圖片的Demo放進來,方便大家交流學習。大家如果還有什麼疑問或者建議,都可以留言評論。謝謝~!

相關推薦

androidContentResolver獲取手機本地圖片

獲取手機的本地圖片就是使用ContentResolver類查詢本地的資料庫,只不過需要使用該類進行查詢,並且該類中提供了增刪改查的響應的方法。本篇博文並不對ContentResolver進行詳細的介紹,相比大家在書上面已經瞭解到了ContentResolver的

Android 獲取手機本地圖片所在的位置

道友們在做需求的時候、可能會需要展示圖片的拍攝地點、 android已經有這類的方法、上程式碼、親測可用 exifInterface = new ExifInterface(photoPath1); Str

Android之通過ContentResolver獲取手機圖片和視訊的路徑和生成縮圖和縮圖路徑

1 問題 獲取手機所有圖片和視訊的路徑和生成圖片和視訊的縮圖和縮圖路徑 生成縮圖我們用的系統函式 public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind, Opti

android如何獲取指定目錄下的圖片

圖片文件 tor 註意 plain mage 限制 asto tco 語句 需要對指定目錄的圖片文件進行列表,借鑒了網上的方法,發現列表出來是所有的文件,這樣用起來很不方便,在這裏也沒找到解決的辦法,經過自己的進一步研究終於搞定,發上來給有用的同學。用下面這種方式能實現查詢

Android如何獲取視訊的第一幀圖片並顯示在一個ImageView

String path  = Environment.getExternalStorageDirectory().getPath();MediaMetadataRetriever media = new MediaMetadataRetriever();media.setD

android獲取手機所有圖片

public ImageFilesBean returnImageFiles() { List<String> parentsPthe = new ArrayLis

獲取手機本地IP地址

() asm eth try except 手機 ace brush exceptio public String getLocalIpAddress() { try { for (Enumeration<Netwo

Android使用Universal-Image-Loader圖片快取

ImageLoader 是最早開源的 Android 圖片快取庫, 強大的快取機制, 早期被廣泛 Android 應用使用, 至今仍然有很多 Android 開發者在使用。 GitHub地址:

Android具有動畫效果的圖片資源

在一些場景下,圖片需要具有動畫效果。當你想顯示一個由多張圖片組成的loading動畫,或者一個圖示切換過程,就需要到具有動畫效果的圖片了。Android提供了幾種方式實現動畫圖片。 下面的是個示例: 第一種方式是使用Animation Drawable,這是通過建立多張靜態

Android開發之獲取手機硬體狀態資訊(CPU資訊/頻率/使用率、DDR頻率/使用率、電池瞬時電流/電壓/庫倫counter)

有時候我們想要知道當前手機的一些狀態資訊,可以使用app(root 或者系統簽名 )來顯示獲取。 OK,接下來看一下一些關鍵的程式碼。 我這裡使用的是高通的手機,不同硬體平臺的機型,其獲取資訊的節點可能不一樣。 /** * 獲取當前瞬時電流

Android全域性獲取Context

在日常開發中,很多情景都需要用到Context,例如:Toast,啟動活動,傳送廣播,操作資料庫,使用通知等等。如果在活動中進行這些操作倒是沒有什麼難點,活動本身就是Context。當架構複雜,程式碼邏輯脫離Activity時,就需要自定義一個全域性Context以供呼叫。 Android提

Android的AsyncTask非同步載入圖片

AsyncTask簡介: AsyncTask的特點是任務在主執行緒之外執行,而回調方法是在主執行緒中執行,這就有效地避免了使用Handler帶來的麻煩。 閱讀 AsyncTask的原始碼可知,AsyncTask是使用java.util.concurrent 框架來管理執行緒

AndroidRecyclerView實現瀑布流圖片顯示

效果圖: 具體程式碼如下:(註釋很詳細,基本每句都要註釋) MainActivity.java package com.zhiyuan3g.recyclerviewwaterfall; import android.content.Intent; import an

Android如何獲取視訊檔案的截圖、縮圖

背景 公司最近要求給我負責的APP加上視訊錄製和釋出的功能,我簡單的完成了基本的錄製和視訊壓縮功能,後來發現釋出介面需要上傳視訊的截圖,網上搜索了一下資料,在這裡整理一下。 程式碼實現 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Android如何獲取GPS資料

作者:高天辰          GPS是Android系統中重要的組成部分,通過它可以衍生出眾多的與位置相關的應用。 Android的GPS有一個專門的管理類,稱為LocationManager,所有的GPS定位服務都由其物件產生並進行控制。 首先需要明確的是,Locati

Android基礎:獲取手機聯絡人工具類

Bean: public class ContactInfo { public String id; public String name; public String phone; } Co

Android攝像頭獲取的YUV資料轉Opencv的Mat

背景 在onPreviewFrame方法中獲取的byte[] data資料為420sp格式,排列順序為width*height個Y(亮度資訊,就是我們常見的灰度影象),後面是UV(顏色資訊),4個Y共享一個U和V,故byte陣列的總大小是width*height

AndroidfindViewById()獲取控制元件後 報 空指標 錯誤

今天再做一個程式時,發現我使用findViewById(R.id.edit)獲取EditText時總是報空指標錯誤,我想不可能啊!! 最後從findViewById()下手,才發現原來此方法中的R.id.edit是從當前Activity或者Dialog的主佈局檔案xml中獲

AndroidSpanner獲取選中內容和選中位置,根據位置選擇物件

作為一名菜鳥,關於spanner獲取選中的內容文字程式碼,網上後很多 但是根據給出的位置來自動選擇物件,這個程式碼一直沒找到 後來找人問了問,才知道就一句話的事,特意在這裡記錄下 array.xml

使用ZXing掃碼實現掃手機本地圖片的二維碼內容

ZXing這個第三方是我用的第三方,用來掃描二維碼的,之前沒有看到ZXing還提供了掃描本地圖片二維碼的功能,現在整理如下。跳轉到選取本地圖片的頁面Intent intent = new Intent(Intent.ACTION_GET_CONTENT); i