1. 程式人生 > >Android中多媒體檔案、文件以及各類檔案的獲取

Android中多媒體檔案、文件以及各類檔案的獲取

最近專案中需要對好友進行傳送檔案需求,在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