Android之MediaStore使用 (查找 音樂/視頻/文檔/自定義類型文件.apk .zip 等)

在日常開發中,我們經常會使用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 使用 裏面還有各種屬性,請猿們自行琢磨,自行理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章