項(xiàng)目中許多時(shí)候需要選擇圖片、音視頻送爸,并有大小和時(shí)間限制铛嘱,沒有找到合適的庫,所以自己提供一個(gè)滿足需求的基礎(chǔ)版本袭厂。
一.可以選擇圖片墨吓、音頻、視頻
二.可以限制選擇數(shù)量纹磺、音視頻大小帖烘、時(shí)長
三.可以進(jìn)行圖片、音視頻的預(yù)覽播放橄杨,指定每列顯示item個(gè)數(shù)
四.可以自定義過濾條件秘症,只顯示符合要求item
最新0.1.6版本:
1.優(yōu)化完善自定義過濾器
一.實(shí)現(xiàn)效果
可以設(shè)置顯示主題,默認(rèn)為深色主題
二.引用
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.6'
}
三.使用
1.基礎(chǔ)使用
最簡單的使用式矫,全部為默認(rèn)配置選擇圖片
final ArrayList<String> list = new ArrayList<>();
list.add(MediaSuffixType.VideoSuffixType.TYPE_MP4);
tvTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MediaPicker.init(MainActivity.this)
// .setMediaPickerConfig(new MediaPickerConfig.Builder()
// .setThemeConfig(new MediaPickerThemeConfig.Builder()
// .buildDarkTheme())
// .setMediaPickerType(MediaPickerType.TYPE_VIDEO)
// .setLimitDuration(10 * 1000)
// .setLimitSize(10 * 1024 * 1024L)
// .setMaxSelectMediaCount(3)
// .setStartPreviewByThird(true)
// .setColumnCount(3)
// .setLimitSuffixTypeList(list)
// .setMediaPickerFilter(new MediaPickerFilter() {
// @Override
// public boolean filter(MediaInfo info) {
// if (info.getSize() > 10 * 1024 * 1024L) {
// return true;
// }
// return false;
// }
//
// @Override
// public String getFilteredHint() {
// return "測試";
// }
//
// @Override
// public boolean hideFiltered() {
// return false;
// }
// })
// .setFilterLimitSuffixType(true)
// .setFilterLimitMedia(true)
// .build())
.pick();
獲取到的結(jié)果在
@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());
}
}
}
結(jié)果存儲在MediaInfo中
public class MediaInfo:
private String title;//標(biāo)題
private String name;//名稱(帶擴(kuò)展名)
private MediaPickerType type;//多媒體類型
private String suffixType;//后綴名類型(例如:.mp4)
private String filePath;//視頻路徑
private String thumbnail;//縮略圖
private long addDate;//添加到Media Provider的時(shí)間
private long duration;//時(shí)長
private long size;//大小
private String bucketId;//多媒體所屬文件夾ID
private String bucketName;//多媒體所屬文件夾名稱
在MediaPicker主要是提供MediaPickerControlable接口實(shí)例乡摹,默認(rèn)提供的是MediaPickerControl子類
public class MediaPicker {
private static final MediaPicker INSTANCE;//單例
private MediaPickerControlable mControl;
private MediaPicker() {
}
static {
INSTANCE = new MediaPicker();
}
public static MediaPickerControlable init(@NonNull Activity activity) {
return init(activity, new MediaPickerStore(activity), null);
}
public static MediaPickerControlable init(@NonNull Activity activity, MediaPickerStoreable store,
MediaPickerInterceptable intercept) {
INSTANCE.mControl = new MediaPickerControl(activity, store, intercept);
return INSTANCE.mControl;
}
public static MediaPickerControlable init(@NonNull Fragment fragment) {
return init(fragment, new MediaPickerStore(fragment), null);
}
public static MediaPickerControlable init(@NonNull Fragment fragment, MediaPickerStoreable store,
MediaPickerInterceptable intercept) {
INSTANCE.mControl = new MediaPickerControl(fragment, store, intercept);
return INSTANCE.mControl;
}
public static MediaPicker getInstance() {
return INSTANCE;
}
public MediaPickerControlable getMediaPickerControl() {
return INSTANCE.mControl;
}
public static ImageEngine getImageEngine() {
return INSTANCE.mControl.getImageEngine();
}
public static MediaPickerFilter getMediaPickerFilter() {
return INSTANCE.mControl.getMediaPickerStore().getMediaPickerConfig().getMediaPickerFilter();
}
}
在拿到MediaPickerControlable后,設(shè)置相關(guān)配置采转,MediaPickerControlable里持有MediaPickerStoreable接口聪廉,默認(rèn)提供的子類實(shí)現(xiàn)是MediaPickerStore,MediaPickerStore主要是用來持有MediaPickerConfig,進(jìn)行配置設(shè)置板熊。
MediaPickerControlable包裹MediaPickerStoreable框全,使用與實(shí)現(xiàn)中間層攔截器,方便實(shí)現(xiàn)中間額外操作邻邮,所以提供MediaPickerInterceptable接口竣况,默認(rèn)提供了MediaPickerIntercept空實(shí)現(xiàn)子類,可以對所有方法進(jìn)行攔截監(jiān)聽
2.MediaPickerControlable
public interface MediaPickerControlable {
MediaPickerControlable setMediaPickerConfig(MediaPickerConfig config);
MediaPickerControlable setMediaPickerIntercept(MediaPickerInterceptable intercept);
ImageEngine getImageEngine();
MediaPickerFilter getMediaPickerFilter();
MediaPickerStoreable getMediaPickerStore();
void pick();
void release();
}
3.MediaPickerStoreable
public interface MediaPickerStoreable {
MediaPickerStoreable setMediaPickerConfig(MediaPickerConfig config);
MediaPickerConfig getMediaPickerConfig();
void pick();
void release();
}
4.MediaPickerConfig
MediaPickerStore實(shí)現(xiàn)類里會持有MediaPickerConfig
private MediaPickerType mediaPickerType;//多媒體選擇類型
private int maxSelectMediaCount;//最多可選擇多媒體個(gè)數(shù)
private long limitSize;//限制大型惭稀(單位B)
private long limitDuration;//限制時(shí)長(毫秒)
private List<String> limitSuffixTypeList;//限制只能顯示的多媒體后綴類型列表
private MediaPickerFilter mediaPickerFilter;//多媒體過濾器
private boolean filterLimitSuffixType;//是否過濾超出后綴名類型限制的多媒體
private boolean filterLimitMedia;//是否過濾超出限制的多媒體信息
private int columnCount;//一行列數(shù)
private int loadAnimation;//Item加載動畫
private boolean startPreviewByThird;//以第三方應(yīng)用方式打開預(yù)覽多媒體
private MediaPickerThemeConfig themeConfig;//主題配置
private ImageEngine engine;//圖片加載引擎
可以通過startPreviewByThird來設(shè)置是否通過調(diào)用第三方應(yīng)用來預(yù)覽丹泉,默認(rèn)是庫自帶的預(yù)覽效果,目前設(shè)置后只有視頻可以打開調(diào)用其他第三方應(yīng)用預(yù)覽鸭蛙。
在MediaPickerConfig里可以配置界面主題深色和淺色摹恨,默認(rèn)為深色,同時(shí)也可以自定義設(shè)置
filterLimitSuffixType是和limitSuffixTypeList配合使用娶视,filterLimitMedia和時(shí)長晒哄、大小與自定義配合使用
public class MediaPickerThemeConfig:
private int themeType;//主題類型(淺色或深色,請?jiān)O(shè)置此類時(shí)一定要配置涉及到狀態(tài)欄配置肪获,默認(rèn)為深色)
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默認(rèn)提供了buildLightTheme和buildDarkTheme
/**
* 創(chuàng)建默認(rèn)淺色主題配置信息
*
* @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;
}
/**
* 創(chuàng)建默認(rèn)深色主題配置信息
*
* @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;
}
自定義過濾器MediaPickerFilter
public interface MediaPickerFilter {
/**
* 設(shè)置條件過濾多媒體Item
*
* @param info 多媒體信息對象
* @return 滿足過濾條件的Item返回true寝凌,否則返回false
*/
boolean filter(MediaInfo info);
/**
* 獲取選擇過濾Item時(shí)的提示文本(在hideFiltered為false時(shí),使用才有效)
* 返回null或""無效孝赫,不設(shè)置時(shí)较木,默認(rèn)顯示"該項(xiàng)已被過濾,不能選擇"
* 可以使用MediaPickerFilterAdapter青柄,提供了默認(rèn)實(shí)現(xiàn)伐债,只重新自己需要的方法
*
* @return 返回提示字符串
*/
String getFilteredHint();
/**
* 隱藏被過濾的Item
*
* @return 返回true表示隱藏,否則返回false
*/
boolean hideFiltered();
}
同時(shí)可以直接使用MediaPickerFilterAdapter致开,它實(shí)現(xiàn)了MediaPickerFilter峰锁,提供默認(rèn)實(shí)現(xiàn)
public class MediaPickerFilterAdapter implements MediaPickerFilter {
@Override
public boolean filter(MediaInfo info) {
return false;
}
@Override
public String getFilteredHint() {
return null;
}
@Override
public boolean hideFiltered() {
return false;
}
}
庫同時(shí)還提供了MediaUtils工具類,里面有許多工具方法双戳,可以直接在任何地方直接調(diào)用
/**
* 啟動選擇本地圖片界面
*
* @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) {
}
/**
* 查詢系統(tǒng)數(shù)據(jù)庫地址中視頻信息
*
* @param resolver Android組件
* @param uri 視頻本地地址
* @return 如果成功獲取數(shù)據(jù)虹蒋,則返回MediaInfo,否則返回null
*/
@Nullable
public static MediaInfo queryVideoInfo(@NonNull ContentResolver resolver, @NonNull Uri uri) {
}
/**
* 根據(jù)縮略圖路徑獲取縮略圖
*
* @param path 縮略圖路徑
* @return 返回生成的縮略圖
*/
public static Bitmap getThumbnail(String path) {
}
/**
* 設(shè)置視頻播放聲音
*
* @param volume 聲音音量(0--1)
* @param o 播放的對象
*/
public static void setVolume(float volume, Object o) {
}
/**
* 獲取圖片資源
*
* @param context 上下文
* @param callback 瀏覽資源回調(diào)
*/
public static void getImages(final Context context, BrowseMediaInfoCallback callback) {
}
/**
* 獲取音頻資源
*
* @param context 上下文
* @param callback 瀏覽資源回調(diào)
*/
public static void getAudios(final Context context, BrowseMediaInfoCallback callback) {
}
/**
* 獲取視頻資源
*
* @param context 上下文
* @param callback 瀏覽資源回調(diào)
*/
public static void getVideos(final Context context, BrowseMediaInfoCallback callback) {
}
@NonNull
private static Intent getPickImageIntent() {
}
/**
* 獲取選擇視頻的啟動意圖
*
* @return 返回啟動意圖
*/
@NonNull
private static Intent getPickVideoIntent() {
}
/**
* 瀏覽多媒體信息回調(diào)
*/
public interface BrowseMediaInfoCallback {
/**
* 當(dāng)準(zhǔn)備瀏覽多媒體信息時(shí)調(diào)用
*/
void onPrepareBrowseMediaInfo();
/**
* 當(dāng)開始瀏覽多媒體信息時(shí)調(diào)用
*
* @param count 多媒體總數(shù)
*/
void onStartBrowseMediaInfo(int count);
/**
* 瀏覽多媒體資源信息時(shí)調(diào)用
*
* @param index 瀏覽的索引位置
* @param info 多媒體信息數(shù)據(jù)
*/
void onBrowseMediaInfo(int index, @NonNull MediaInfo info);
/**
* 當(dāng)結(jié)束瀏覽多媒體信息時(shí)回調(diào)
*/
void onEndBrowseMediaInfo();
}
5.圖片引擎
用戶可以設(shè)置ImageEngine
MediaPicker.init(MainActivity.this)
.setMediaPickerConfig(new MediaPickerConfig.Builder()
.setImageEngine(new GlideEngine())
.build())
.pick();
ImageEngine 接口如下飒货,默認(rèn)提供了GlideEngine千诬,如果和項(xiàng)目有沖突,可以用自己的圖片引擎替換
public interface ImageEngine {
/**
* 顯示圖片
*
* @param context 上下文
* @param file 顯示圖片
* @param placeholderId 占位圖資源
* @param errorId 錯(cuò)誤圖資源
* @param imageView 顯示控件
*/
void showImage(Context context, File file,
@DrawableRes int placeholderId, @DrawableRes int errorId, ImageView imageView);
/**
* 顯示圖片
*
* @param fragment 界面
* @param file 顯示圖片
* @param placeholderId 占位圖資源
* @param errorId 錯(cuò)誤圖資源
* @param imageView 顯示控件
*/
void showImage(Fragment fragment, File file,
@DrawableRes int placeholderId, @DrawableRes int errorId, ImageView imageView);
}
四.總結(jié)
目前用戶所需要使用的源碼都在上面膏斤,其他預(yù)覽相關(guān)代碼就暫不介紹,庫剛出來邪驮,如果有什么疑問或建議歡迎提出莫辨,Github地址:https://github.com/MingYueChunQiu/MediaPicker.git , 碼云地址:https://gitee.com/MingYueChunQiu/MediaPicker.git ,感謝你的支持沮榜,如果不介意請Github點(diǎn)個(gè)star盘榨,謝謝。