亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android讀取本地照片和視頻相冊(cè)實(shí)例代碼

 更新時(shí)間:2017年06月06日 09:40:58   作者:匿名吃豆人  
本篇文章主要介紹了Android讀取本地照片和視頻相冊(cè)實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

項(xiàng)目中經(jīng)常要選擇本地照片或者視頻的需求,如果去掃描整個(gè)SD卡就太耗時(shí)間,其實(shí)Android系統(tǒng)在啟動(dòng)時(shí)就已經(jīng)把整個(gè)設(shè)備中的多媒體文件信息(文件名,類型,大小等)都存到了數(shù)據(jù)庫,然后提供了ContentPrivider這個(gè)API來管理這個(gè)數(shù)據(jù)庫,我們可以利用ContentPrivider來獲取所有的照片和視頻。

ContentPrivider初識(shí)

先看下管理的的數(shù)據(jù)庫在哪

data/data/目錄下:有很多這種文件夾(日歷,聯(lián)系人,下載管理,多媒體等)


我們需要的照片和視頻就在media下面,進(jìn)去看看。進(jìn)去找到database然后打開external.db,就可以看到多張表(音頻,文件,Log,圖像,視頻等)

照片相冊(cè)

那么獲取照片直接通過 ContentProvider讀取Images這個(gè)數(shù)據(jù)庫就OK了,這里開啟工作線程讀取所有.jpeg和.png的圖片,附上代碼段:

 /**
  * 讀取手機(jī)中所有圖片信息
  */
 private void getAllPhotoInfo() {
  new Thread(new Runnable() {
   @Override
   public void run() {
    List<MediaBean> mediaBeen = new ArrayList<>();
    HashMap<String,List<MediaBean>> allPhotosTemp = new HashMap<>();//所有照片
    Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    String[] projImage = { MediaStore.Images.Media._ID
      , MediaStore.Images.Media.DATA
      ,MediaStore.Images.Media.SIZE
      ,MediaStore.Images.Media.DISPLAY_NAME};
    Cursor mCursor = getContentResolver().query(mImageUri,
      projImage,
      MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?",
      new String[]{"image/jpeg", "image/png"},
      MediaStore.Images.Media.DATE_MODIFIED+" desc");

    if(mCursor!=null){
     while (mCursor.moveToNext()) {
      // 獲取圖片的路徑
      String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA));
      int size = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Images.Media.SIZE))/1024;
      String displayName = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
      //用于展示相冊(cè)初始化界面
      mediaBeen.add(new MediaBean(MediaBean.Type.Image,path,size,displayName));
      // 獲取該圖片的父路徑名
      String dirPath = new File(path).getParentFile().getAbsolutePath();
      //存儲(chǔ)對(duì)應(yīng)關(guān)系
      if (allPhotosTemp.containsKey(dirPath)) {
       List<MediaBean> data = allPhotosTemp.get(dirPath);
       data.add(new MediaBean(MediaBean.Type.Image,path,size,displayName));
       continue;
      } else {
       List<MediaBean> data = new ArrayList<>();
       data.add(new MediaBean(MediaBean.Type.Image,path,size,displayName));
       allPhotosTemp.put(dirPath,data);
      }
     }
     mCursor.close();
    }
    //更新界面
    runOnUiThread(new Runnable() {
     @Override
     public void run() {
      //...
     }
    });
   }
  }).start();
 }

有四點(diǎn)需要注意:

  1. MediaBean是文件實(shí)體類,代碼就不貼了
  2. 照片集合不是放在List<MediaBean>這樣存儲(chǔ)的,而是HashMap<String,List<MediaBean>>,這樣把圖片已文件夾(也就是父目錄)分類,更節(jié)省內(nèi)存,其次支持相冊(cè)展示不同文件夾的照片
  3. 貌似沒辦法獲取當(dāng)前設(shè)備的拍照默認(rèn)路徑,有的設(shè)備是/DCIM,有的是/100andro還有/camera,那相冊(cè)就默認(rèn)展示最近所有照片吧。然后給用戶列出一個(gè)文件夾列表讓他選,這時(shí)可以把這幾個(gè)文件夾放到最前面展示,算是小優(yōu)化吧。
  4. 系統(tǒng)會(huì)時(shí)刻檢測(cè)數(shù)據(jù)變化,有新的照片這個(gè)數(shù)據(jù)庫會(huì)自動(dòng)更新,不需干預(yù)。

視頻相冊(cè)

獲取視頻文件和上面基本一樣,不過改下查詢條件就行了,實(shí)際中有個(gè)問題:視頻封面的獲取。

首先視頻封面縮略圖在這個(gè)videothumbnails數(shù)據(jù)庫,照片縮略圖在thumbnails,對(duì)應(yīng)到本地SD卡就是在sdcard/DCIM/.thumbnails/文件夾(有的設(shè)備可能不同)

PS:這個(gè)文件夾是隱藏的,so你知道你的手機(jī)為何存儲(chǔ)空間越來越小了吧,拍的照片縮略圖全在這兒。。。非常非常多


實(shí)際中發(fā)現(xiàn)讀取不到新錄制的視頻封面,需要手動(dòng)調(diào)用一個(gè)方法,來生成這個(gè)封面然后才能在videothumbnails讀取到:

參考:http://stackoverflow.com/questions/27903264/how-to-get-the-video-thumbnail-path-and-not-the-bitmap

//videoId是這個(gè)視頻文件在數(shù)據(jù)庫的ID
MediaStore.Video.Thumbnails.getThumbnail(getContentResolver(), videoId, MediaStore.Video.Thumbnails.MICRO_KIND, null);

并且這里封面和視頻不在一個(gè)數(shù)據(jù)庫,需要在兩個(gè)cursor來讀取

我這里獲取整個(gè)SD的mp4格式視頻,代碼段如下:

 /**
  * 獲取手機(jī)中所有視頻的信息
  */
 private void getAllVideoInfos(){
  new Thread(new Runnable() {
   @Override
   public void run() {
    HashMap<String,List<MediaBean>> allPhotosTemp = new HashMap<>();//所有照片
    Uri mImageUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    String[] proj = { MediaStore.Video.Thumbnails._ID
      , MediaStore.Video.Thumbnails.DATA
      ,MediaStore.Video.Media.DURATION
      ,MediaStore.Video.Media.SIZE
      ,MediaStore.Video.Media.DISPLAY_NAME
      ,MediaStore.Video.Media.DATE_MODIFIED};
    Cursor mCursor = getContentResolver().query(mImageUri,
      proj,
      MediaStore.Video.Media.MIME_TYPE + "=?",
      new String[]{"video/mp4"},
      MediaStore.Video.Media.DATE_MODIFIED+" desc");
    if(mCursor!=null){
     while (mCursor.moveToNext()) {
      // 獲取視頻的路徑
      int videoId = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Video.Media._ID));
      String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Video.Media.DATA));
      int duration = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Video.Media.DURATION));
      long size = mCursor.getLong(mCursor.getColumnIndex(MediaStore.Video.Media.SIZE))/1024; //單位kb
      if(size<0){
       //某些設(shè)備獲取size<0,直接計(jì)算
       Log.e("dml","this video size < 0 " + path);
       size = new File(path).length()/1024;
      }
      String displayName = mCursor.getString(mCursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME));
      long modifyTime = mCursor.getLong(mCursor.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED));//暫未用到

      //提前生成縮略圖,再獲?。篽ttp://stackoverflow.com/questions/27903264/how-to-get-the-video-thumbnail-path-and-not-the-bitmap
      MediaStore.Video.Thumbnails.getThumbnail(getContentResolver(), videoId, MediaStore.Video.Thumbnails.MICRO_KIND, null);
      String[] projection = { MediaStore.Video.Thumbnails._ID, MediaStore.Video.Thumbnails.DATA};
      Cursor cursor = getContentResolver().query(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI
        , projection
        , MediaStore.Video.Thumbnails.VIDEO_ID + "=?"
        , new String[]{videoId+""}
        , null);
      String thumbPath = "";
      while (cursor.moveToNext()){
       thumbPath = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Thumbnails.DATA));
      }
      cursor.close();
      // 獲取該視頻的父路徑名
      String dirPath = new File(path).getParentFile().getAbsolutePath();
      //存儲(chǔ)對(duì)應(yīng)關(guān)系
      if (allPhotosTemp.containsKey(dirPath)) {
       List<MediaBean> data = allPhotosTemp.get(dirPath);
       data.add(new MediaBean(MediaBean.Type.Video,path,thumbPath,duration,size,displayName));
       continue;
      } else {
       List<MediaBean> data = new ArrayList<>();
       data.add(new MediaBean(MediaBean.Type.Video,path,thumbPath,duration,size,displayName));
       allPhotosTemp.put(dirPath,data);
      }
     }
     mCursor.close();
    }
    //更新界面
    runOnUiThread(new Runnable() {
     @Override
     public void run() {
      //...
     }
    });
   }
  }).start();
 }

后記

其實(shí)Android已經(jīng)提供叫做CursorLoader的API做這個(gè)事情,不需要手動(dòng)new 工作線程,使用起來很簡單有需要可以對(duì)上面代碼改造。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 8.0安裝apk的實(shí)例代碼

    Android 8.0安裝apk的實(shí)例代碼

    本文給大家分享了Android 8.0安裝apk的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-03-03
  • Android中Service(后臺(tái)服務(wù))詳解

    Android中Service(后臺(tái)服務(wù))詳解

    這篇文章主要介紹了Android中Service(后臺(tái)服務(wù))詳解,本文講解了Service的概念、作用、生命周期、啟動(dòng)方式和代碼實(shí)例等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • Android自定義控制條效果

    Android自定義控制條效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義控制條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Android EditText 實(shí)現(xiàn)監(jiān)聽實(shí)例

    Android EditText 實(shí)現(xiàn)監(jiān)聽實(shí)例

    本文主要介紹Android EditText 組件 實(shí)現(xiàn)監(jiān)聽事件,并附有代碼實(shí)例,在Android開發(fā)過程中如果能用到可以參考下
    2016-07-07
  • Android實(shí)現(xiàn)同頻共幀動(dòng)畫效果

    Android實(shí)現(xiàn)同頻共幀動(dòng)畫效果

    我們聽過“同頻共振”,其原理是多個(gè)物體物體以同樣的頻率振動(dòng),但是本篇實(shí)現(xiàn)的效果是“同頻共幀”,含義是:動(dòng)畫以同樣的頻率和同樣的幀展示在多個(gè)不同View上,文中通過代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以自己動(dòng)手嘗試一下
    2024-01-01
  • Android 開發(fā)使用Activity實(shí)現(xiàn)加載等待界面功能示例

    Android 開發(fā)使用Activity實(shí)現(xiàn)加載等待界面功能示例

    這篇文章主要介紹了Android 開發(fā)使用Activity實(shí)現(xiàn)加載等待界面功能,結(jié)合實(shí)例形式詳細(xì)分析了Android基于Activity實(shí)現(xiàn)加載等待界面布局與功能操作技巧,需要的朋友可以參考下
    2020-05-05
  • Android流式布局FlowLayout詳解

    Android流式布局FlowLayout詳解

    這篇文章主要為大家詳細(xì)介紹了Android流式布局FlowLayout的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android自定義ViewGroup打造各種風(fēng)格的SlidingMenu

    Android自定義ViewGroup打造各種風(fēng)格的SlidingMenu

    這篇文章主要介紹了Android自定義ViewGroup打造各種風(fēng)格的SlidingMenu的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Android插件化之資源動(dòng)態(tài)加載

    Android插件化之資源動(dòng)態(tài)加載

    這篇文章主要介紹了Android插件化之資源動(dòng)態(tài)加載的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android實(shí)現(xiàn)時(shí)鐘特效

    Android實(shí)現(xiàn)時(shí)鐘特效

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)時(shí)鐘特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評(píng)論