Android多媒體圖片音頻視頻可限制大小時間自定義選擇器庫

項目中許多時候需要選擇圖片、音視頻,並有大小和時間限制,沒有找到合適的庫,所以自己提供一個滿足需求的基礎版本。
一.可以選擇圖片、音頻、視頻
二.可以限制選擇數量、音視頻大小、時長
三.可以進行圖片、音視頻的預覽播放

一.實現效果

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
可以設置顯示主題,默認爲深色主題

二.引用

1.Add it in your root build.gradle at the end of repositories

allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

2.Add the dependency

dependencies {
	        implementation 'com.github.MingYueChunQiu:MediaPicker:0.1'
	}

三.使用

1.基礎使用

最簡單的使用,全部爲默認配置選擇圖片

MediaPicker.init(MainActivity.this)
                        	.pick();

獲取到的結果在

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null && requestCode == MP_REQUEST_START_MEDIA_PICKER && resultCode == RESULT_OK) {
            ArrayList<MediaInfo> list = data.getParcelableArrayListExtra(EXTRA_PICKED_MEDIA_LIST);
            for (MediaInfo info : list) {
                Log.d("份", info.getTitle() + "   fds    " + info.getName() + " " + info.getFilePath() + " " +
                        info.getSize() + " " + info.getDuration() + " " + info.getBucketId() + " "
                        + info.getBucketName());
            }
        }
    }

結果存儲在MediaInfo中

public class MediaInfo:
    private String title;//標題
    private String name;//名稱(帶擴展名)
    private MediaPickerType type;//多媒體類型
    private String filePath;//視頻路徑
    private String thumbnail;//縮略圖
    private long addDate;//添加到Media Provider的時間
    private long duration;//時長
    private long size;//大小
    private String bucketId;//多媒體所屬文件夾ID
    private String bucketName;//多媒體所屬文件夾名稱

在MediaPicker主要是提供MediaPickerControlable接口實例,默認提供的是MediaPickerControl子類

public class MediaPicker {

    public static final MediaPicker INSTANCE;//單例
    private MediaPickerControlable mControl;

    private MediaPicker() {
    }

    static {
        INSTANCE = new MediaPicker();
    }

    public static MediaPickerControlable init(@NonNull Context context) {
        return init(context, new MediaPickerStore(context), null);
    }

    public static MediaPickerControlable init(@NonNull Context context, MediaPickerStoreable store, MediaPickerInterceptable intercept) {
        INSTANCE.mControl = new MediaPickerControl(context, store, intercept);
        return INSTANCE.mControl;
    }

    public MediaPickerControlable getMediaPickerControl() {
        return INSTANCE.mControl;
    }

    public static ImageEngine getImageEngine() {
        return INSTANCE.mControl.getImageEngine();
    }
}

在拿到MediaPickerControlable後,設置相關配置,MediaPickerControlable裏持有MediaPickerStoreable接口,默認提供的子類實現是MediaPickerStore。

MediaPickerStore主要是用來持有MediaPickerConfig,進行配置設置,提供MediaPickerControlable和MediaPickerStoreable主要是既可以通過傳入MediaPickerConfig配置,也可以直接調用MediaPickerControlable進行配置,最終都轉換爲MediaPickerConfig。

MediaPickerControlable包裹MediaPickerStoreable,使用與實現中間層攔截器,方便實現中間額外操作,所以提供MediaPickerInterceptable接口,默認提供了MediaPickerIntercept空實現子類,可以對所有方法進行攔截監聽

2.MediaPickerControlable

public interface MediaPickerControlable {

    MediaPickerControlable setMediaPickerConfig(MediaPickerConfig config);

    MediaPickerControlable setMediaPickerIntercept(MediaPickerInterceptable intercept);

    MediaPickerControlable setMediaPickerType(MediaPickerType mediaPickerType);

    MediaPickerControlable setMaxSelectMediaCount(int maxSelectMediaCount);

    MediaPickerControlable setLimitSize(long limitSize);

    MediaPickerControlable setLimitDuration(long limitDuration);

    MediaPickerControlable setFilterLimitMedia(boolean filterLimitMedia);

    MediaPickerControlable setColumnCount(int columnCount);

    MediaPickerControlable setStartPreviewByThird(boolean startPreviewByThird);

    MediaPickerControlable setThemeConfig(MediaPickerThemeConfig config);

    MediaPickerControlable setImageEngine(ImageEngine engine);

    ImageEngine getImageEngine();

    MediaPickerStoreable getMediaPickerStore();

    void pick();

    void release();
}

3.MediaPickerStoreable

public interface MediaPickerStoreable {

    MediaPickerStoreable setMediaPickerConfig(MediaPickerConfig config);

    MediaPickerStoreable setMediaPickerType(MediaPickerType mediaPickerType);

    MediaPickerStoreable setMaxSelectMediaCount(int maxSelectMediaCount);

    MediaPickerStoreable setLimitSize(long limitSize);

    MediaPickerStoreable setLimitDuration(long limitDuration);

    MediaPickerStoreable setFilterLimitMedia(boolean filterLimitMedia);

    MediaPickerStoreable setColumnCount(int columnCount);

    MediaPickerStoreable setStartPreviewByThird(boolean startPreviewByThird);

    MediaPickerStoreable setThemeConfig(MediaPickerThemeConfig config);

    MediaPickerStoreable setImageEngine(ImageEngine engine);

    MediaPickerConfig getMediaPickerConfig();

    void pick();

    void release();
}

4.MediaPickerConfig

MediaPickerStore實現類裏會持有MediaPickerConfig

private MediaPickerType mediaPickerType;//多媒體選擇類型

    private int maxSelectMediaCount;//最多可選擇多媒體個數

    private long limitSize;//限制大小(單位B)

    private long limitDuration;//限制時長(毫秒)

    private boolean filterLimitMedia;//是否過濾超出限制的多媒體信息

    private int columnCount;//一行列數

    private int loadAnimation;//Item加載動畫

    private boolean startPreviewByThird;//以第三方應用方式打開預覽多媒體

    private MediaPickerThemeConfig themeConfig;//主題配置

    private ImageEngine engine;//圖片加載引擎

可以通過startPreviewByThird來設置是否通過調用第三方應用來預覽,默認是庫自帶的預覽效果,目前設置後只有視頻可以打開調用其他第三方應用預覽。

在MediaPickerConfig裏可以配置界面主題深色和淺色,默認爲深色,同時也可以自定義設置

public class MediaPickerThemeConfig:

	private int themeType;//主題類型(淺色或深色,請設置此類時一定要配置涉及到狀態欄配置,默認爲深色)

    private @ColorInt
    int topBackgroundColor;//頂部背景顏色

    private @ColorInt
    int bottomBackgroundColor;//底部背景顏色

    private @ColorInt
    int topTextColor;//頂部文字顏色

    private @ColorInt
    int bottomTextColor;//底部文字顏色

    private @DrawableRes
    int backIconResId;//返回Icon資源ID

    private @DrawableRes
    int upTriangleIconResId;//向上三角Icon資源ID

    private @DrawableRes
    int downTriangleIconResId;//向下三角Icon資源ID

MediaPickerThemeConfig默認提供了buildLightTheme和buildDarkTheme

/**
         * 創建默認淺色主題配置信息
         *
         * @return 返回淺色主題配置信息對象
         */
        public MediaPickerThemeConfig buildLightTheme() {
            mConfig.topBackgroundColor = Color.WHITE;
            mConfig.bottomBackgroundColor = Color.parseColor("#33000000");
            mConfig.topTextColor = Color.BLACK;
            mConfig.bottomTextColor = Color.BLACK;
            mConfig.backIconResId = R.drawable.mp_back_dark;
            mConfig.upTriangleIconResId = R.drawable.mp_up_triangle_dark;
            mConfig.downTriangleIconResId = R.drawable.mp_down_triangle_dark;
            mConfig.themeType = Constants.ThemeTypeConstants.TYPE_LIGHT;
            return mConfig;
        }

        /**
         * 創建默認深色主題配置信息
         *
         * @return 返回深色主題配置信息對象
         */
        public MediaPickerThemeConfig buildDarkTheme() {
            mConfig.topBackgroundColor = Color.parseColor("#2C2C34");
            mConfig.bottomBackgroundColor = Color.parseColor("#2C2C34");
            mConfig.topTextColor = Color.WHITE;
            mConfig.bottomTextColor = Color.WHITE;
            mConfig.backIconResId = R.drawable.mp_back_light;
            mConfig.upTriangleIconResId = R.drawable.mp_up_triangle_light;
            mConfig.downTriangleIconResId = R.drawable.mp_down_triangle_light;
            mConfig.themeType = Constants.ThemeTypeConstants.TYPE_DARK;
            return mConfig;
        }

庫同時還提供了MediaUtils工具類,裏面有許多工具方法,可以直接在任何地方直接調用

/**
     * 啓動選擇本地圖片界面
     *
     * @param activity    啓動界面
     * @param requestCode 啓動請求碼
     */
    public static void startPickImage(@NonNull Activity activity, int requestCode) {
    }

    /**
     * 啓動選擇本地圖片界面
     *
     * @param fragment    啓動界面
     * @param requestCode 啓動請求碼
     */
    public static void startPickImage(@NonNull Fragment fragment, int requestCode) {
    }

    /**
     * 啓動選擇本地視頻界面
     *
     * @param activity    啓動界面
     * @param requestCode 啓動請求碼
     */
    public static void startPickVideo(@NonNull Activity activity, int requestCode) {
    }

    /**
     * 啓動選擇本地視頻界面
     *
     * @param fragment    啓動界面
     * @param requestCode 啓動請求碼
     */
    public static void startPickVideo(@NonNull Fragment fragment, int requestCode) {
    }

/**
     * 查詢系統數據庫地址中視頻信息
     *
     * @param resolver Android組件
     * @param uri      視頻本地地址
     * @return 如果成功獲取數據,則返回MediaInfo,否則返回null
     */
    @Nullable
    public static MediaInfo queryVideoInfo(@NonNull ContentResolver resolver, @NonNull Uri uri) {
    }

    /**
     * 根據縮略圖路徑獲取縮略圖
     *
     * @param path 縮略圖路徑
     * @return 返回生成的縮略圖
     */
    public static Bitmap getThumbnail(String path) {
    }

    /**
     * 設置視頻播放聲音
     *
     * @param volume 聲音音量(0--1)
     * @param o      播放的對象
     */
    public static void setVolume(float volume, Object o) {
    }

    /**
     * 獲取圖片資源
     *
     * @param context  上下文
     * @param callback 瀏覽資源回調
     */
    public static void getImages(final Context context, BrowseMediaInfoCallback callback) {
    }

/**
     * 獲取音頻資源
     *
     * @param context  上下文
     * @param callback 瀏覽資源回調
     */
    public static void getAudios(final Context context, BrowseMediaInfoCallback callback) {
    }

/**
     * 獲取視頻資源
     *
     * @param context  上下文
     * @param callback 瀏覽資源回調
     */
    public static void getVideos(final Context context, BrowseMediaInfoCallback callback) {
    }

@NonNull
    private static Intent getPickImageIntent() {
    }

    /**
     * 獲取選擇視頻的啓動意圖
     *
     * @return 返回啓動意圖
     */
    @NonNull
    private static Intent getPickVideoIntent() {
    }

 /**
     * 瀏覽多媒體信息回調
     */
    public interface BrowseMediaInfoCallback {

        /**
         * 當準備瀏覽多媒體信息時調用
         */
        void onPrepareBrowseMediaInfo();

        /**
         * 當開始瀏覽多媒體信息時調用
         *
         * @param count 多媒體總數
         */
        void onStartBrowseMediaInfo(int count);

        /**
         * 瀏覽多媒體資源信息時調用
         *
         * @param index 瀏覽的索引位置
         * @param info  多媒體信息數據
         */
        void onBrowseMediaInfo(int index, @NonNull MediaInfo info);

        /**
         * 當結束瀏覽多媒體信息時回調
         */
        void onEndBrowseMediaInfo();
    }

5.圖片引擎

用戶可以設置ImageEngine

 MediaPicker.init(MainActivity.this)
                        .setImageEngine()
                        .pick();

ImageEngine 接口如下,默認提供了GlideEngine,如果和項目有衝突,可以用自己的圖片引擎替換

public interface ImageEngine {

    /**
     * 顯示圖片
     *
     * @param context       上下文
     * @param file          顯示圖片
     * @param placeholderId 佔位圖資源
     * @param errorId       錯誤圖資源
     * @param imageView     顯示控件
     */
    void showImage(Context context, File file,
                   @DrawableRes int placeholderId, @DrawableRes int errorId, ImageView imageView);

    /**
     * 顯示圖片
     *
     * @param fragment      界面
     * @param file          顯示圖片
     * @param placeholderId 佔位圖資源
     * @param errorId       錯誤圖資源
     * @param imageView     顯示控件
     */
    void showImage(Fragment fragment, File file,
                   @DrawableRes int placeholderId, @DrawableRes int errorId, ImageView imageView);
}

四.總結

目前用戶所需要使用的源碼都在上面,其他預覽相關代碼就暫不介紹,庫剛出來,如果有什麼疑問或建議歡迎提出,Github地址:https://github.com/MingYueChunQiu/MediaPicker.git , 碼雲地址:https://gitee.com/MingYueChunQiu/MediaPicker.git ,感謝你的支持,如果不介意請Github點個star,謝謝。

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