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