Android中多媒體檔案、文件以及各類檔案的獲取
阿新 • • 發佈:2019-02-19
最近專案中需要對好友進行傳送檔案需求,在android中對檔案以及其它文件的獲取一直沒有找到一個好的案例,自己在分析“仿小米資料夾管理”時感覺自己非常的菜B,看不懂原始碼。我也問了他人的思路,但是他們給我遞迴方法去掃描感覺很2B,想想在android中就QQ的檔案目錄都大得嚇尿,所以還是安安靜靜的用內容提供者吧。看到有很多的同行也在找想關的資料,希望我的分享對大家有幫助,謝謝!
在android中其實系統已經給我們提供了一個數據庫,裡面包含了sd卡中所有檔案的資訊(大小、位置、建立時間等),所以我們只需要得到內容提供者的URI以及引數列表就O了,多媒體資料庫存放的位置data/data/com.android.provider.media/databases/external.db與data/data/com.android.provider.media/databases/internal.db中,目錄無法開啟的同學可以安裝一個模擬器進行檢視。下面是程式碼:
注意:因為這兩個資料庫裡面的資料是非常的多,所以建議大家開子執行緒獲取資料。子執行緒獲取後推送到主執行緒這個就不用說了吧。
首先是搜尋文件的:
下面是獲取視訊檔案的
下面是獲取視訊檔案的public List<Document> getDocumentListData() { String[] columns = new String[] {MediaStore.Files.FileColumns._ID,MediaStore.Files.FileColumns.MIME_TYPE,MediaStore.Files.FileColumns.SIZE,MediaStore.Files.FileColumns.DATE_MODIFIED,MediaStore.Files.FileColumns.DATA }; String select = "(" + FileColumns.DATA + " LIKE '%.doc'" + " or " + FileColumns.DATA + " LIKE '%.docx'" + " or " + FileColumns.DATA + " LIKE '%.xls'" + " or " + FileColumns.DATA + " LIKE '%.ppt'" + " or " + FileColumns.DATA + " LIKE '%.txt'" + ")"; List<Document> dataList = new ArrayList<Document>(); ContentResolver contentResolver = mContext.getContentResolver(); Cursor cursor = contentResolver.query(MediaStore.Files.getContentUri("external"), columns, select,null, null); int columnIndexOrThrow_ID = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID); int columnIndexOrThrow_MIME_TYPE = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE); int columnIndexOrThrow_DATA = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA); int columnIndexOrThrow_SIZE = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE); int columnIndexOrThrow_DATE_MODIFIED = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_MODIFIED); // 建立時間,更改時間 if (cursor != null) { while (cursor.moveToNext()) { String path = cursor.getString(columnIndexOrThrow_DATA); int position_do = path.lastIndexOf("."); if( position_do == -1 ) continue; String type = path.substring( position_do+1, path.length() ); int doc_type = 0; if( type.contains("doc") ) { doc_type = FileTypeConfig.DOC; } else if( type.contains("xls") ) { doc_type = FileTypeConfig.XLS; } else if( type.contains("ppt") ) { doc_type = FileTypeConfig.PPT; } else if( type.contains("txt") ) { doc_type = FileTypeConfig.TXT; } else { continue; } int position_x = path.lastIndexOf( File.separator ); if( position_x == -1 ) continue; String displayName = path.substring( position_x + 1 , path.length() ); int id = cursor.getInt( columnIndexOrThrow_ID ); String mimeType = cursor.getString(columnIndexOrThrow_MIME_TYPE); long size = cursor.getLong(columnIndexOrThrow_SIZE); long modified_date = cursor.getLong(columnIndexOrThrow_DATE_MODIFIED); Document document = new Document( id ,displayName,mimeType,path, size,modified_date, doc_type ); document.setSelected( false ); dataList.add(document); } } return dataList; }
/** * 獲取視訊檔案 * @return */ public List<Video> getVedioListData() { List<Video> dataList = new ArrayList<Video>(); ContentResolver contentResolver = mContext.getContentResolver(); String[] columns = new String[] { MediaStore.Video.Media._ID, MediaStore.Video.Media.MIME_TYPE, MediaStore.Video.Media.ALBUM, MediaStore.Video.Media.ARTIST, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.DATA, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DATE_MODIFIED }; Cursor cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, columns, null,null, null); int columnIndexOrThrow_ID = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID); int columnIndexOrThrow_ALBUM = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ALBUM); int columnIndexOrThrow_ARTIST = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST); int columnIndexOrThrow_DISPLAY_NAME = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME); int columnIndexOrThrow_MIME_TYPE = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE); int columnIndexOrThrow_DATA = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); int columnIndexOrThrow_DURATION = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION); int columnIndexOrThrow_SIZE = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE); int columnIndexOrThrow_DATE_MODIFIED = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_MODIFIED); // 建立時間,更改時間 BitmapFactory.Options options = new BitmapFactory.Options(); options.inDither = false; options.inPreferredConfig = Bitmap.Config.ARGB_8888; if (cursor != null) { while (cursor.moveToNext()) { int id = cursor.getInt( columnIndexOrThrow_ID ); String album = cursor.getString(columnIndexOrThrow_ALBUM); String artist = cursor.getString(columnIndexOrThrow_ARTIST); String displayName = cursor.getString(columnIndexOrThrow_DISPLAY_NAME); String mimeType = cursor.getString(columnIndexOrThrow_MIME_TYPE); String path = cursor.getString(columnIndexOrThrow_DATA); long duration = cursor.getInt(columnIndexOrThrow_DURATION); long size = cursor.getLong(columnIndexOrThrow_SIZE); long modified_date = cursor.getLong(columnIndexOrThrow_DATE_MODIFIED); // icon 視訊縮圖 Bitmap bitmap = MediaStore.Video.Thumbnails.getThumbnail(contentResolver,id,Images.Thumbnails.MICRO_KIND, options); Video video = new Video(id, displayName, album, artist, displayName, mimeType, path, size, duration,modified_date,bitmap, FileTypeConfig.VIO); dataList.add(video); } } return dataList; }
音樂檔案的獲取URI:MediaStore.Audio.Media.getContentUri("external");
如果各位有更好的方法或者說更改的優化,歡迎sao擾。
如果感興趣的可以加QQ群:486302449