Android 手機視頻選擇器---快速開發系列

Android 手機視頻選擇器—快速開發系列

  • 分析別人的代碼
  • 找到解決問題的關鍵點
  • 視頻選擇跟圖片選擇的區別
  • 如何閱讀別人的無註釋代碼
  • 把圖片選擇器改編成視頻選擇器

說在前面的話

本案例是基於開源項目http://p.codekk.com/detail/Android/glassLake/PhotoPicker圖片選擇器修改而來

這裏寫圖片描述

分析方法

1.先把demo下載下來仔細研究分析一樣,如果讓自己實現這個功能,大概的業務邏輯是什麼樣的
2.把源碼的入口位置找準,分析一樣,猜測一下這些參數都有什麼作用。
3.大致瀏覽一下整個工程的代碼分包結構,並把跟自己想法不一致的地方着重閱讀分析
3.接下來需要思考的問題就是?如何把圖片選擇器變成視頻選擇器。
歸納如下:
(1)獲取視頻地址,cursor,替換掉圖片地址的獲取
(2)獲取視頻縮略圖顯示的圖,然後顯示、

代碼修改:

這段代碼就是我們獲取圖片目錄的地方了,PhotoPickerFragment.java

        MediaStoreHelper.getPhotoDirs(getActivity(), mediaStoreArgs,
                new MediaStoreHelper.PhotosResultCallback() {
                    @Override
                    public void onResultCallback(List<PhotoDirectory> dirs) {
                        directories.clear();
                        directories.addAll(dirs);
                        photoGridAdapter.notifyDataSetChanged();
                        listAdapter.notifyDataSetChanged();
                        adjustHeight();
                    }
                });

這段代碼就是我們獲取圖片的地方了,我們再跳入MediaStoreHelper.java


import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

import me.iwf.photopicker.PhotoPicker;
import me.iwf.photopicker.R;
import me.iwf.photopicker.entity.PhotoDirectory;

import static android.provider.BaseColumns._ID;
import static android.provider.MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME;
import static android.provider.MediaStore.Images.ImageColumns.BUCKET_ID;
import static android.provider.MediaStore.MediaColumns.DATA;
import static android.provider.MediaStore.MediaColumns.DATE_ADDED;

/**
 * Created by donglua on 15/5/31.
 */
public class MediaStoreHelper {

    public final static int INDEX_ALL_PHOTOS = 0;


    public static void getPhotoDirs(FragmentActivity activity, Bundle args, PhotosResultCallback resultCallback) {
        activity.getSupportLoaderManager().initLoader(0, args, new PhotoDirLoaderCallbacks(activity, resultCallback));
    }

    static class PhotoDirLoaderCallbacks implements LoaderManager.LoaderCallbacks<Cursor> {

        private WeakReference<Context> context;
        private PhotosResultCallback resultCallback;

        public PhotoDirLoaderCallbacks(Context context, PhotosResultCallback resultCallback) {
            this.context = new WeakReference<>(context);
            this.resultCallback = resultCallback;
        }

        @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
            return new PhotoDirectoryLoader(context.get(), args.getBoolean(PhotoPicker.EXTRA_SHOW_GIF, false));//控制篩選那種資源
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

            if (data == null) return;
            List<PhotoDirectory> directories = new ArrayList<>();
            PhotoDirectory photoDirectoryAll = new PhotoDirectory();
            photoDirectoryAll.setName(context.get().getString(R.string.__picker_all_image));
            photoDirectoryAll.setId("ALL");

            while (data.moveToNext()) {

                int imageId = data.getInt(data.getColumnIndexOrThrow(_ID));
                String bucketId = data.getString(data.getColumnIndexOrThrow(BUCKET_ID));
                String name = data.getString(data.getColumnIndexOrThrow(BUCKET_DISPLAY_NAME));
                String path = data.getString(data.getColumnIndexOrThrow(DATA));

                PhotoDirectory photoDirectory = new PhotoDirectory();
                photoDirectory.setId(bucketId);
                photoDirectory.setName(name);

                if (!directories.contains(photoDirectory)) {
                    photoDirectory.setCoverPath(path);
                    photoDirectory.addPhoto(imageId, path);
                    photoDirectory.setDateAdded(data.getLong(data.getColumnIndexOrThrow(DATE_ADDED)));
                    directories.add(photoDirectory);
                } else {
                    directories.get(directories.indexOf(photoDirectory)).addPhoto(imageId, path);
                }

                photoDirectoryAll.addPhoto(imageId, path);
            }
            if (photoDirectoryAll.getPhotoPaths().size() > 0) {
                photoDirectoryAll.setCoverPath(photoDirectoryAll.getPhotoPaths().get(0));
            }
            directories.add(INDEX_ALL_PHOTOS, photoDirectoryAll);
            if (resultCallback != null) {
                resultCallback.onResultCallback(directories);
            }
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {

        }
    }


    public interface PhotosResultCallback {
        void onResultCallback(List<PhotoDirectory> directories);
    }

}


需要替換的文件:


package me.iwf.photopicker.utils;

import android.content.Context;
import android.net.Uri;
import android.provider.MediaStore;
import android.provider.MediaStore.Images.Media;
import android.support.v4.content.CursorLoader;

import static android.provider.MediaStore.MediaColumns.MIME_TYPE;

/**
 * Created by 黃東魯 on 15/6/28.
 */
public class PhotoDirectoryLoader extends CursorLoader {

    final String[] IMAGE_PROJECTION = {
            MediaStore.Video.Media._ID,
            MediaStore.Video.Media.DATA,
            MediaStore.Video.Media.BUCKET_ID,
            MediaStore.Video.Media.BUCKET_DISPLAY_NAME,
            MediaStore.Video.Media.DATE_ADDED
    };

    public PhotoDirectoryLoader(Context context, boolean showGif) {
        super(context);

        setProjection(IMAGE_PROJECTION);
        //setUri(Media.EXTERNAL_CONTENT_URI);//原來的代碼
        setUri(MediaStore.Video.Media.EXTERNAL_CONTENT_URI);//修改後的代碼
        setSortOrder(Media.DATE_ADDED + " DESC");

        setSelection(
                MIME_TYPE + "=? or " + MIME_TYPE + "=? or " + MIME_TYPE + "=? " + (showGif ? ("or " + MIME_TYPE + "=?") : ""));
        String[] selectionArgs;
        //原來的代碼
//        if (showGif) {
//            selectionArgs = new String[]{"image/jpeg", "image/png", "image/jpg", "image/gif"};
//        } else {
//            selectionArgs = new String[]{"image/jpeg", "image/png", "image/jpg"};
//        }

//修改後的代碼
        if (showGif) {
            selectionArgs = new String[]{"video/mpeg", "video/mp4", "video/3gpp", "video/avi"};
        } else {
            selectionArgs = new String[]{"video/mpeg", "video/mp4", "video/3gpp"};
        }

        setSelectionArgs(selectionArgs);
    }


    private PhotoDirectoryLoader(Context context, Uri uri, String[] projection, String selection,
                                 String[] selectionArgs, String sortOrder) {
        super(context, uri, projection, selection, selectionArgs, sortOrder);
    }


}

縮略圖的顯示:
PhotoGridAdapter.java

//            glide.load(new File(photo.getPath()))
//                    .centerCrop()
//                    .dontAnimate()
//                    .thumbnail(0.5f)
//                    .override(imageSize, imageSize)
//                    .placeholder(R.drawable.__picker_default_weixin)
//                    .error(R.drawable.__picker_ic_broken_image_black_48dp)
//                    .into(holder.ivPhoto);

            glide.load(Uri.fromFile(new File(photo.getPath())))//修改位置
                    .centerCrop()
                    .dontAnimate()
                    .thumbnail(0.5f)
                    .override(imageSize, imageSize)
                    .placeholder(R.drawable.__picker_default_weixin)
                    .error(R.drawable.__picker_ic_broken_image_black_48dp)
                    .into(holder.ivPhoto);

大功告成

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