項目中許多時候需要選擇圖片、音視頻,並有大小和時間限制,沒有找到合適的庫,所以自己提供一個滿足需求的基礎版本。
一.可以選擇圖片、音頻、視頻
二.可以限制選擇數量、音視頻大小、時長
三.可以進行圖片、音視頻的預覽播放
一.實現效果
可以設置顯示主題,默認爲深色主題
二.引用
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,謝謝。