android多圖選擇器 圖片/視頻 單選or多選,以及視頻錄制。


PictureSelector

最近項目中用到多圖選擇上傳的需求,考慮到android機型眾多問題就自己花時間寫了一個,測試了大概60款機型,出現過一些問題也都一一修復了,基本上穩定了特分享出來,界面UI也是商用級的開發者不用在做太多修改了,界面高度自定義,可以設置符合你項目主色調的風格,集成完成后就可以拿來用。

項目會一直維護,發現問題歡迎提出會第一時間修復,QQ交流群 619458861,個人QQ 893855882@qq.com  希望用得着的朋友點個start。 

github代碼地址

 PRs Welcome CSDN I Star

功能特點:

  1.   1.適配android6.0+系統
  2.   2.解決部分機型裁剪閃退問題
  3.   3.解決圖片過大oom閃退問題
  4.   4.動態獲取系統權限,避免閃退
  5.   5.支持相片or視頻的單選和多選
  6.   6.支持裁剪比例設置,如常用的 1:1343:216:9 默認為圖片大小
  7.   7.支持視頻預覽
  8.   8.支持gif圖片
  9.   9.支持.webp格式圖片
  10.   10.支持一些常用場景設置:如:是否裁剪、是否預覽圖片、是否顯示相機等
  11.   11.新增自定義主題設置
  12.   12.新增圖片勾選樣式設置
  13.   13.新增圖片裁剪寬高設置
  14.   14.新增圖片壓縮處理
  15.   15.新增錄視頻最大時間設置
  16.   16.新增視頻清晰度設置
  17.   17.新增QQ選擇風格,帶數字效果
  18.   18.新增自定義 文字顏色 背景色讓風格和項目更搭配
  19.   19.新增多圖裁剪功能
  20.   20.新增LuBan多圖壓縮
  21.   21.新增單獨拍照功能
  22.   22.新增壓縮大小設置
  23.   23.新增Luban壓縮檔次設置

那些遇到拍照閃退問題的同學,請記得看清下面適配6.0的配置~

重要的事情說三遍記得添加權限

  1.   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  2.   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3.   <uses-permission android:name="android.permission.CAMERA" />

注:適配android6.0以上拍照問題,請在AndroidManifest.xml中添加標簽

  1. <provider
  2.    android:name="android.support.v4.content.FileProvider"
  3.    android:authorities="${applicationId}.provider"
  4.    android:exported="false"
  5.    android:grantUriPermissions="true">
  6.      <meta-data
  7.          android:name="android.support.FILE_PROVIDER_PATHS"
  8.          android:resource="@xml/file_paths" />
  9. </provider>

集成步驟

方式一 compile引入

  1. dependencies {
  2.     compile 'com.github.LuckSiege.PictureSelector:picture_library:v1.4.1'
  3. }

方式二 maven引入

step 1.

  1. <repositories>
  2.        <repository>
  3.        <id>jitpack.io</id>
  4. <url>https://jitpack.io</url>
  5.        </repository>
  6.  </repositories>

step 2.

  1. <dependency>
  2.       <groupId>com.github.LuckSiege.PictureSelector</groupId>
  3.       <artifactId>picture_library</artifactId>
  4.       <version>v1.4.1</version>
  5. </dependency>

項目根目錄  

  1. allprojects {
  2.    repositories {
  3.       jcenter()
  4.       maven { url 'https://jitpack.io' }
  5.    }
  6. }

常見錯誤*

  1.  問題一:
  2.  rxjava沖突:在app build.gradle下添加
  3.  packagingOptions {
  4.    exclude 'META-INF/rxjava.properties'
  5.  }  
  6.  
  7.  問題二:
  8.  java.lang.NullPointerException: 
  9.  Attempt to invoke virtual method 'android.content.res.XmlResourceParser 
  10.  android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)'
  11.  on a null object reference
  12.  
  13.  application下添加如下節點:
  14.  
  15.  <provider
  16.       android:name="android.support.v4.content.FileProvider"
  17.       android:authorities="${applicationId}.provider"
  18.       android:exported="false"
  19.       android:grantUriPermissions="true">
  20.        <meta-data
  21.          android:name="android.support.FILE_PROVIDER_PATHS"
  22.          android:resource="@xml/file_paths" />
  23. </provider>
  24.  
  25. 注意:如已添加其他sdk或項目中已使用過provider節點,
  26. [請參考我的博客](http://blog.csdn.net/luck_mw/article/details/54970105)的解決方案
  27.  
  28. 問題三:
  29. PhotoView 庫沖突,可以刪除自己項目中引用的,Picture_library中已經引用過,或引用com.commit451:PhotoView:1.2.4版本

相冊啟動構造方法

  1. FunctionOptions options = new FunctionOptions.Builder()
  2.         .setType(selectType) // 圖片or視頻 FunctionConfig.TYPE_IMAGE  TYPE_VIDEO
  3.         .setCropMode(copyMode) // 裁剪模式 默認、1:1、3:4、3:2、16:9
  4.         .setCompress(isCompress) //是否壓縮
  5.         .setEnablePixelCompress(true) //是否啟用像素壓縮
  6.         .setEnableQualityCompress(true) //是否啟質量壓縮
  7.         .setMaxSelectNum(maxSelectNum) // 可選擇圖片的數量
  8.         .setSelectMode(selectMode) // 單選 or 多選
  9.         .setShowCamera(isShow) //是否顯示拍照選項 這里自動根據type 啟動拍照或錄視頻
  10.         .setEnablePreview(enablePreview) // 是否打開預覽選項
  11.         .setEnableCrop(enableCrop) // 是否打開剪切選項
  12.         .setPreviewVideo(isPreviewVideo) // 是否預覽視頻(播放) mode or 多選有效
  13.         .setCheckedBoxDrawable(checkedBoxDrawable)
  14.         .setRecordVideoDefinition(FunctionConfig.HIGH) // 視頻清晰度
  15.         .setRecordVideoSecond(60) // 視頻秒數
  16.         .setGif(false)// 是否顯示gif圖片,默認不顯示
  17.         .setCropW(cropW) // cropW-->裁剪寬度 值不能小於100  如果值大於圖片原始寬高 將返回原圖大小
  18.         .setCropH(cropH) // cropH-->裁剪高度 值不能小於100 如果值大於圖片原始寬高 將返回原圖大小
  19.         .setMaxB(maxB) // 壓縮最大值 例如:200kb  就設置202400,202400 / 1024 = 200kb左右
  20.         .setPreviewColor(previewColor) //預覽字體顏色
  21.         .setCompleteColor(completeColor) //已完成字體顏色
  22.         .setPreviewBottomBgColor(previewBottomBgColor) //預覽底部背景色
  23.         .setBottomBgColor(bottomBgColor) //圖片列表底部背景色
  24.         .setGrade(Luban.THIRD_GEAR) // 壓縮檔次 默認三檔
  25.         .setCheckNumMode(isCheckNumMode)
  26.         .setCompressQuality(100) // 圖片裁剪質量,默認無損
  27.         .setImageSpanCount(4) // 每行個數
  28.         .setSelectMedia(selectMedia) // 已選圖片,傳入在次進去可選中,不能傳入網絡圖片
  29.         .setCompressFlag(compressFlag) // 1 系統自帶壓縮 2 luban壓縮
  30.         .setCompressW(compressW) // 壓縮寬 如果值大於圖片原始寬高無效
  31.         .setCompressH(compressH) // 壓縮高 如果值大於圖片原始寬高無效
  32.         .setThemeStyle(themeStyle) // 設置主題樣式
  33.         .create();

啟動相冊並拍照      

  1.  PictureConfig.getInstance().init(options).openPhoto(mContext, resultCallback);
  2.  
  3.  或默認配置
  4.  PictureConfig.getInstance().openPhoto(mContext, resultCallback);

單獨啟動拍照或視頻 根據type自動識別      

  1.  PictureConfig.getInstance().init(options).startOpenCamera(mContext, resultCallback);
  2.  
  3.  或默認配置
  4.  PictureConfig.getInstance().startOpenCamera(mContext, resultCallback);

預覽圖片      

  1.  PictureConfig.getInstance().externalPicturePreview(mContext, position, selectMedia);

預覽視頻

  1. PictureConfig.getInstance().externalPictureVideo(mContext, selectMedia.get(position).getPath());

圖片回調完成結果返回

  1.   private PictureConfig.OnSelectResultCallback resultCallback = new PictureConfig.OnSelectResultCallback() {
  2.         @Override
  3.         public void onSelectSuccess(List<LocalMedia> resultList) {
  4.             selectMedia = resultList;
  5.             Log.i("callBack_result", selectMedia.size() + "");
  6.             LocalMedia media = resultList.get(0);
  7.             if (media.isCut() && !media.isCompressed()) {
  8.                 // 裁剪過
  9.                 String path = media.getCutPath();
  10.             } else if (media.isCompressed() || (media.isCut() && media.isCompressed())) {
  11.                 // 壓縮過,或者裁剪同時壓縮過,以最終壓縮過圖片為准
  12.                 String path = media.getCompressPath();
  13.             } else {
  14.                 // 原圖地址
  15.                 String path = media.getPath();
  16.             }
  17.             if (selectMedia != null) {
  18.                 adapter.setList(selectMedia);
  19.                 adapter.notifyDataSetChanged();
  20.             }
  21.         }
  22.     };

更新日志:

版本 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%

image

演示效果:

image image image image image image image image image image

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM