1. 程式人生 > >Android多媒體圖片音訊視訊可限制大小時間自定義選擇器庫

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