PictureSelector
最近項目中用到多圖選擇上傳的需求,考慮到android機型眾多問題就自己花時間寫了一個,測試了大概60款機型,出現過一些問題也都一一修復了,基本上穩定了特分享出來,界面UI也是商用級的開發者不用在做太多修改了,界面高度自定義,可以設置符合你項目主色調的風格,集成完成后就可以拿來用。
項目會一直維護,發現問題歡迎提出會第一時間修復,QQ交流群 619458861,個人QQ 893855882@qq.com 希望用得着的朋友點個start。
功能特點:
- 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" />
注:適配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>
集成步驟
方式一 compile引入
- dependencies {
- compile 'com.github.LuckSiege.PictureSelector:picture_library:v1.4.1'
- }
方式二 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.1</version>
- </dependency>
項目根目錄
- 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節點,
- [請參考我的博客](http://blog.csdn.net/luck_mw/article/details/54970105)的解決方案
- 問題三:
- PhotoView 庫沖突,可以刪除自己項目中引用的,Picture_library中已經引用過,或引用com.commit451:PhotoView:1.2.4版本
相冊啟動構造方法
- 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();
啟動相冊並拍照
- PictureConfig.getInstance().init(options).openPhoto(mContext, resultCallback);
- 或默認配置
- PictureConfig.getInstance().openPhoto(mContext, resultCallback);
單獨啟動拍照或視頻 根據type自動識別
- PictureConfig.getInstance().init(options).startOpenCamera(mContext, resultCallback);
- 或默認配置
- PictureConfig.getInstance().startOpenCamera(mContext, resultCallback);
預覽圖片
- 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.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%
演示效果:
















