Android多圖選擇器 圖片/視頻 單選or多選,以及視頻錄制
介紹
最近項目中用到多圖選擇上傳的需求,考慮到android機型眾多問題就自己花時間寫了一個,測試了大概60款機型,出現過一些問題也都一一修復了,基本上穩定了特分享出來,界面UI也是商用級的開發者不用在做太多修改了,界面高度自定義,可以設置符合你項目主色調的風格,集成完成后就可以拿來用。
功能特點:
1.適配android6.0+系統
2.解決部分機型裁剪閃退問題
3.解決圖片過大oom閃退問題
4.動態獲取系統權限,避免閃退
5.支持相片or視頻的單選和多選
6.支持裁剪比例設置,如常用的 1:1、3:4、3:2、16:9 默認為圖片大小
7.支持視頻預覽
8.支持gif圖片
9.支持.webp格式圖片
10.支持一些常用場景設置:如:是否裁剪、是否預覽圖片、是否顯示相機等
11.新增自定義主題設置
12.新增圖片勾選樣式設置
13.新增圖片裁剪寬高設置
14.新增圖片壓縮處理
15.新增錄視頻最大時間設置
16.新增視頻清晰度設置
17.新增QQ選擇風格,帶數字效果
18.新增自定義 文字顏色 背景色讓風格和項目更搭配
19.新增多圖裁剪功能
20.新增LuBan多圖壓縮
21.新增單獨拍照功能
22.新增壓縮大小設置
23.新增Luban壓縮檔次設置
那些遇到拍照閃退問題的同學,請記得看清下面適配6.0的配置~
重要的事情說三遍記得添加權限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
</code></pre>
注:適配android6.0以上拍照問題,請在AndroidManifest.xml中添加標簽
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</code></pre>
集成步驟
方式一 compile引入
dependencies {
compile 'com.github.LuckSiege.PictureSelector:picture_library:v1.4.2'
}
</code></pre>
方式二 maven引入
step 1.
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
step 2.
<dependency>
<groupId>com.github.LuckSiege.PictureSelector</groupId>
<artifactId>picture_library</artifactId>
<version>v1.4.2</version>
</dependency>
</code></pre>
項目根目錄
allprojects {
repositories {
jcenter()
maven { url 'https://jitpack.io' }
}
}
常見錯誤*
問題一:
rxjava沖突:在app build.gradle下添加
packagingOptions {
exclude 'META-INF/rxjava.properties'
}
問題二:
java.lang.NullPointerException:
Attempt to invoke virtual method 'android.content.res.XmlResourceParser
android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)'
on a null object reference
application下添加如下節點:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
注意:如已添加其他sdk或項目中已使用過provider節點,
請參考我的博客的解決方案
問題三:
PhotoView 庫沖突,可以刪除自己項目中引用的,Picture_library中已經引用過,或引用com.commit451:PhotoView:1.2.4版本
</code></pre>
相冊啟動構造方法
FunctionOptions options = new FunctionOptions.Builder()
.setType(selectType) // 圖片or視頻 FunctionConfig.TYPE_IMAGE TYPE_VIDEO
.setCropMode(copyMode) // 裁剪模式 默認、1:1、3:4、3:2、16:9
.setCompress(isCompress) //是否壓縮
.setEnablePixelCompress(true) //是否啟用像素壓縮
.setEnableQualityCompress(true) //是否啟質量壓縮
.setMaxSelectNum(maxSelectNum) // 可選擇圖片的數量
.setSelectMode(selectMode) // 單選 or 多選
.setShowCamera(isShow) //是否顯示拍照選項 這里自動根據type 啟動拍照或錄視頻
.setEnablePreview(enablePreview) // 是否打開預覽選項
.setEnableCrop(enableCrop) // 是否打開剪切選項
.setPreviewVideo(isPreviewVideo) // 是否預覽視頻(播放) mode or 多選有效
.setCheckedBoxDrawable(checkedBoxDrawable)
.setRecordVideoDefinition(FunctionConfig.HIGH) // 視頻清晰度
.setRecordVideoSecond(60) // 視頻秒數
.setGif(false)// 是否顯示gif圖片,默認不顯示
.setCropW(cropW) // cropW-->裁剪寬度 值不能小于100 如果值大于圖片原始寬高 將返回原圖大小
.setCropH(cropH) // cropH-->裁剪高度 值不能小于100 如果值大于圖片原始寬高 將返回原圖大小
.setMaxB(maxB) // 壓縮最大值 例如:200kb 就設置202400,202400 / 1024 = 200kb左右
.setPreviewColor(previewColor) //預覽字體顏色
.setCompleteColor(completeColor) //已完成字體顏色
.setPreviewBottomBgColor(previewBottomBgColor) //預覽底部背景色
.setBottomBgColor(bottomBgColor) //圖片列表底部背景色
.setGrade(Luban.THIRD_GEAR) // 壓縮檔次 默認三檔
.setCheckNumMode(isCheckNumMode)
.setCompressQuality(100) // 圖片裁剪質量,默認無損
.setImageSpanCount(4) // 每行個數
.setSelectMedia(selectMedia) // 已選圖片,傳入在次進去可選中,不能傳入網絡圖片
.setCompressFlag(compressFlag) // 1 系統自帶壓縮 2 luban壓縮
.setCompressW(compressW) // 壓縮寬 如果值大于圖片原始寬高無效
.setCompressH(compressH) // 壓縮高 如果值大于圖片原始寬高無效
.setThemeStyle(themeStyle) // 設置主題樣式
.create();
或在application進行初始化配置
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
// application 初始化
FunctionOptions options = new FunctionOptions.Builder().create();
options.setType(FunctionConfig.TYPE_IMAGE);
options.setCompress(true);
options.setGrade(Luban.THIRD_GEAR);
PictureConfig.getInstance().init(options);
}
}
</code></pre>
啟動相冊并拍照
PictureConfig.getInstance().init(options).openPhoto(mContext, resultCallback);
或默認配置
PictureConfig.getInstance().openPhoto(mContext, resultCallback);
</code></pre>
單獨啟動拍照或視頻 根據type自動識別
PictureConfig.getInstance().init(options).startOpenCamera(mContext, resultCallback);
或默認配置
PictureConfig.getInstance().startOpenCamera(mContext, resultCallback);
</code></pre>
預覽圖片
PictureConfig.getInstance().externalPicturePreview(mContext, position, selectMedia);
預覽視頻
PictureConfig.getInstance().externalPictureVideo(mContext, selectMedia.get(position).getPath());
圖片回調完成結果返回
private PictureConfig.OnSelectResultCallback resultCallback = new PictureConfig.OnSelectResultCallback() {
@Override
public void onSelectSuccess(List<LocalMedia> resultList) {
selectMedia = resultList;
Log.i("callBack_result", selectMedia.size() + "");
LocalMedia media = resultList.get(0);
if (media.isCut() && !media.isCompressed()) {
// 裁剪過
String path = media.getCutPath();
} else if (media.isCompressed() || (media.isCut() && media.isCompressed())) {
// 壓縮過,或者裁剪同時壓縮過,以最終壓縮過圖片為準
String path = media.getCompressPath();
} else {
// 原圖地址
String path = media.getPath();
}
if (selectMedia != null) {
adapter.setList(selectMedia);
adapter.notifyDataSetChanged();
}
}
};
更新日志
版本 v1.4.2
1.修復在application初始化第二次無效問題
========================================================
歷史版本:
版本 v1.4.1
1.修復單選快速點擊重復bug
2.重命名string資源文件
版本 v1.4.0
1.減小引入大小
版本 v1.3.9
1.修改相冊啟動方式
2.修復.webp格式圖片壓縮后后綴變為.jpg格式問題
3.修復多圖裁剪快速點擊,結果返回為空問題
4.修復快速點擊啟動相冊重復問題
5.將activity通信由廣播改為EventBus3.0
6.修復多圖裁剪壓縮bug
項目使用第三方庫:
1.裁剪使用ucrop庫
2.eventbus:3.0.0'
3.glide:3.7.0
4.rxjava:2.0.5
5.rxandroid:2.0.1
6.okhttp:3.2.0
7.PhotoView:1.2.4
8.Luban
兼容性測試:
騰訊優測-深度測試-通過率達到100%
演示效果: