在日常開發中,我們經常會使用MediaStore來獲取手機的音頻、圖片、視頻等相關信息。下面3個是常見的內部類:
MediaStore.Audio 獲取音頻信息的類
MediaStore.Images 獲取圖片信息
MediaStore.Video 獲取視頻信息
query和sql的插敘語句差不多 裏面有5個參數
getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, mediaColumns, null, null, null);
第一個參數,uri,rui是什麼呢?好吧,上面我們提到了Android提供內容的叫Provider,那麼在Android中怎麼區分各個Provider?有提供聯繫人的,有提供圖片的等等。所以就需要有一個唯一的標識來標識這個Provider,Uri就是這個標識,android.provider.ContactsContract.Contacts.CONTENT_URI就是提供聯繫人的內容提供者,可惜這個內容提供者提供的數據很少。
第二個參數,projection,真不知道爲什麼要用這個單詞,這個參數告訴Provider要返回的內容(列Column)
第三個參數,selection,設置條件,相當於SQL語句中的where。null表示不進行篩選。
第四個參數 selectionArgs,這個參數是要配合第三個參數使用的,如果你在第三個參數裏面有?,那麼你在selectionArgs寫的數據就會替換掉?
第五個參數,sortOrder,按照什麼進行排序,相當於SQL語句中的Order by
我已經寫好幾個用來經常查詢的方法 直接粘貼使用
/** * 查找視頻文件 * * @param context * @return */ public static ArrayList<VideoBeam> getVideoList(Context context) { ArrayList<VideoBeam> sysVideoList = new ArrayList<>(); // MediaStore.Video.Thumbnails.DATA:視頻縮略圖的文件路徑 String[] thumbColumns = {MediaStore.Video.Thumbnails.DATA, MediaStore.Video.Thumbnails.VIDEO_ID}; // 視頻其他信息的查詢條件 String[] mediaColumns = {MediaStore.Video.Media._ID, MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DATA, MediaStore.Video.Media.TITLE, MediaStore.Video.Media.MIME_TYPE, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.DATE_TAKEN,}; Cursor cursor = context.getContentResolver().query(MediaStore.Video.Media .EXTERNAL_CONTENT_URI, mediaColumns, null, null, null); if (cursor == null) { return sysVideoList; } if (cursor.moveToFirst()) { do { VideoBeam info = new VideoBeam(); int id = cursor.getInt(cursor .getColumnIndex(MediaStore.Video.Media._ID)); Cursor thumbCursor = context.getContentResolver().query( MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, thumbColumns, MediaStore.Video.Thumbnails.VIDEO_ID + "=" + id, null, null); if (thumbCursor.moveToFirst()) { info.setThumbPath(thumbCursor.getString(thumbCursor .getColumnIndex(MediaStore.Video.Thumbnails.DATA))); } info.setFilePath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media .DATA))); info.setMimeType(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE))); info.setTitle(cursor.getString(cursor .getColumnIndexOrThrow(MediaStore.Downloads.TITLE))); info.setDuration(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Downloads.DURATION))); info.setTakeTime(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Downloads.DATE_TAKEN))); info.setVideoSize(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Downloads.SIZE))); sysVideoList.add(info); } while (cursor.moveToNext()); } return sysVideoList; } /** * 查找圖片 * * @param context * @return */ public static ArrayList<FileImgBean> getImgList(Context context) { ArrayList<FileImgBean> ImagesList = new ArrayList<>(); // MediaStore.Images.Thumbnails.DATA:視頻縮略圖的文件路徑 String[] thumbColumns = {MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails._ID}; // 視頻其他信息的查詢條件 String[] mediaColumns = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE, MediaStore.Images.Media.MIME_TYPE, MediaStore.Images.Media.DATE_TAKEN, MediaStore.Images.Media.SIZE}; // String[] projection = new String[]{MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.DISPLAY_NAME}; Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media .EXTERNAL_CONTENT_URI, mediaColumns, null, null, null); if (cursor == null) { return ImagesList; } if (cursor.moveToFirst()) { do { FileImgBean info = new FileImgBean(); int id = cursor.getInt(cursor .getColumnIndex(MediaStore.Images.Media._ID)); Cursor thumbCursor = context.getContentResolver().query( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, thumbColumns, MediaStore.Images.Thumbnails.IMAGE_ID + "=" + id, null, null); if (thumbCursor.moveToFirst()) { info.setThumbPath(thumbCursor.getString(thumbCursor .getColumnIndex(MediaStore.Images.Thumbnails.DATA))); } info.setFilePath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media .DATA))); info.setMimeType(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.MIME_TYPE))); info.setTitle(cursor.getString(cursor .getColumnIndexOrThrow(MediaStore.Images.Media.TITLE))); info.setTakeTime(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images .Media.DATE_TAKEN))); int columnIndexOrThrow = cursor.getColumnIndex(MediaStore.Images .Media.SIZE); int anInt = cursor.getInt(columnIndexOrThrow); info.setImgSize(anInt + ""); ImagesList.add(info); } while (cursor.moveToNext()); } return ImagesList; } /** * 查找文件 * * @return */ public static ArrayList<FileItemBean> getAllText(Context context) { ArrayList<FileItemBean> texts = new ArrayList<>(); String[] projection = new String[]{MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.TITLE, MediaStore.Files.FileColumns.MIME_TYPE, MediaStore.Files.FileColumns.SIZE , MediaStore.Files.FileColumns.DATE_MODIFIED, MediaStore.Files.FileColumns.MIME_TYPE}; //相當於我們常用sql where 後面的寫法 String selection = MediaStore.Files.FileColumns.MIME_TYPE + "= ? " + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? " + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? " + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? " + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "; String[] selectionArgs = new String[]{"application/msword", "text/plain", "application/pdf", "application/vnd.ms-powerpoint", "application/vnd.ms-excel"}; Cursor cursor = context.getContentResolver().query(MediaStore.Files.getContentUri("external"), projection, selection, selectionArgs, MediaStore.Files.FileColumns.DATE_ADDED + " DESC"); FileItemBean fileItem = new FileItemBean(); while (cursor.moveToNext()) { fileItem.setFileId(cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID))); fileItem.setFileName(cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.TITLE))); fileItem.setFilePath(cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA))); fileItem.setFileSize(cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.SIZE))); fileItem.setFileTime(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_MODIFIED))); fileItem.setFileType(cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.MIME_TYPE))); texts.add(fileItem); } cursor.close(); return texts; } /** * 查找音頻 * * @param context * @return */ public static ArrayList<FileAudioBean> getAudioList(Context context) { ArrayList<FileAudioBean> audioList = new ArrayList<>(); // MediaStore.Images.Thumbnails.DATA:視頻縮略圖的文件路徑 String[] thumbColumns = {MediaStore.Audio.Media.DATA, MediaStore.Audio.Media._ID}; // 視頻其他信息的查詢條件 String[] mediaColumns = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.SIZE}; Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media .EXTERNAL_CONTENT_URI, mediaColumns, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); if (cursor == null) { return audioList; } if (cursor.moveToFirst()) { do { FileAudioBean info = new FileAudioBean(); int id = cursor.getInt(cursor .getColumnIndex(MediaStore.Audio.Media._ID)); Cursor thumbCursor = context.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, thumbColumns, MediaStore.Audio.Media._ID + "=" + id, null, null); if (thumbCursor.moveToFirst()) { info.setThumbPath(thumbCursor.getString(thumbCursor .getColumnIndex(MediaStore.Audio.Media.DATA))); } info.setAudioTitle(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE))); info.setAudioAlbum(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM))); info.setAudioSinger(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST))); info.setAudioPath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA))); info.setAudioDuration(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION))); info.setAudioSize(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE))); audioList.add(info); } while (cursor.moveToNext()); } return audioList; } /** * 獲取已經安裝的應用 * @param context * @return */ public static ArrayList<AppInfo> getAppList(Context context) { ArrayList<AppInfo> appList = new ArrayList<>(); List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0); for (int i = 0; i < packages.size(); i++) { PackageInfo packageInfo = packages.get(i); AppInfo tmpInfo = new AppInfo(); tmpInfo.setAppName(packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString()); tmpInfo.setPackageName(packageInfo.packageName); tmpInfo.setVersionName(packageInfo.versionName); tmpInfo.setVersionCode(packageInfo.versionCode); tmpInfo.setAppIcon(packageInfo.applicationInfo.loadIcon(context.getPackageManager())); if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { appList.add(tmpInfo);//如果非系統應用,則添加至appList } } return appList; } /** * 壓縮包和 zip的共用功法 * @param context * @param keyword * @return */ public static ArrayList<FileApkBean> searchKeyWord(Context context, String keyword) { ArrayList<FileApkBean> fileList = new ArrayList<>(); ContentResolver resolver = context.getContentResolver(); Uri uri = MediaStore.Files.getContentUri("external"); Cursor cursor = resolver.query(uri, new String[]{MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.SIZE ,MediaStore.Files.FileColumns.DATE_MODIFIED}, MediaStore.Files.FileColumns.DATA + " LIKE '%" + keyword + "%'", null, MediaStore.Files.FileColumns.DATE_ADDED + " DESC"); if (cursor != null) { while (cursor.moveToNext()) { FileApkBean bean = new FileApkBean(); String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA)); bean.setName(path.substring(path.lastIndexOf("/") + 1)); bean.setSize(cursor.getLong(cursor.getColumnIndexOrThrow( MediaStore.Files.FileColumns.SIZE))+""); bean.setTime(cursor.getString(cursor.getColumnIndexOrThrow( MediaStore.Files.FileColumns.DATE_MODIFIED))); fileList.add(bean); } } cursor.close(); return fileList; }
最後還有個小技巧告訴大家,(也不知道有耐心能翻閱到這麼 哈哈哈)
好了 廢話不多說 一定到開啓 線程 來獲取這些文件
因爲獲取的數據量都挺大的 爲了不 出現ANR 影響用戶體驗 一定要開啓線程
直接使用線程池來完成整個操作
// AsyncTask線程池 private class MyTask extends AsyncTask<String, Integer, String> { @Override protected String doInBackground(String... strings) { //這裏來進行 獲取數據 看不懂的看這個方法的名字 do in backgroung (are you ok ?) videoList = FindFileHelper.getVideoList(getActivity()); zipList = FindFileHelper.searchKeyWord(getActivity(), ".zip"); return null; } @Override protected void onPostExecute(String s) { //這裏來刷新UI set.text()/setadapter()/等等 } }
怎麼來使用這個線程池呢?(你猜下)
// 線程變量 MyTask mTask;
mTask = new MyTask(); mTask.execute();
好了以上就是完整的 MediaStore 使用 裏面還有各種屬性,請猿們自行琢磨,自行理解。