android多圖選擇

PictureSelector

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

項目會一直維護,有bug請描述清楚,並請Issues會第一時間修復,Android開發QQ交流羣 619458861,個人QQ [email protected]  希望用得着的朋友點個start。 

 PictureSelector無裁剪功能版

 我的博客地址

github下載地址

 PRs Welcome CSDN I Star

功能特點:

  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壓縮檔次設置
  24.新增圓形頭像裁剪

那些遇到拍照閃退問題的同學,請記得看清下面適配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.5.5'
}

項目根目錄build.gradle加入

allprojects {
   repositories {
      jcenter()
      maven { url 'https://jitpack.io' }
   }
}

方式二 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.5.5</version>
</dependency>

常見錯誤*

 問題一:
 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() // 圖片or視頻 FunctionConfig.TYPE_IMAGE  TYPE_VIDEO
        .setCropMode() // 裁剪模式 默認、1:1、3:4、3:2、16:9
        .setCompress() //是否壓縮
        .setEnablePixelCompress() //是否啓用像素壓縮
        .setEnableQualityCompress() //是否啓質量壓縮
        .setMaxSelectNum() // 可選擇圖片的數量
	.setMinSelectNum()// 圖片或視頻最低選擇數量,默認代表無限制
        .setSelectMode() // 單選 or 多選 FunctionConfig.MODE_SINGLE FunctionConfig.MODE_MULTIPLE
	.setVideoS(0)// 查詢多少秒內的視頻 單位:秒
        .setShowCamera() //是否顯示拍照選項 這裏自動根據type 啓動拍照或錄視頻
        .setEnablePreview() // 是否打開預覽選項
        .setEnableCrop() // 是否打開剪切選項
	.setCircularCut()// 是否採用圓形裁剪
        .setPreviewVideo() // 是否預覽視頻(播放) mode or 多選有效
        .setCheckedBoxDrawable() // 選擇圖片樣式
        .setRecordVideoDefinition() // 視頻清晰度
        .setRecordVideoSecond() // 視頻秒數
	.setCustomQQ_theme()// 可自定義QQ數字風格,不傳就默認是藍色風格
        .setGif()// 是否顯示gif圖片,默認不顯示
        .setCropW() // cropW-->裁剪寬度 值不能小於100  如果值大於圖片原始寬高 將返回原圖大小
        .setCropH() // cropH-->裁剪高度 值不能小於100 如果值大於圖片原始寬高 將返回原圖大小
        .setMaxB() // 壓縮最大值 例如:200kb  就設置202400,202400 / 1024 = 200kb左右
        .setPreviewColor() //預覽字體顏色
        .setCompleteColor() //已完成字體顏色
	.setPreviewTopBgColor()//預覽圖片標題背景色
        .setPreviewBottomBgColor() //預覽底部背景色
        .setBottomBgColor() //圖片列表底部背景色
        .setGrade() // 壓縮檔次 默認三檔
        .setCheckNumMode() //QQ選擇風格
        .setCompressQuality() // 圖片裁剪質量,默認無損
        .setImageSpanCount() // 每行個數
        .setSelectMedia() // 已選圖片,傳入在次進去可選中,不能傳入網絡圖片
        .setCompressFlag() // 1 系統自帶壓縮 2 luban壓縮
        .setCompressW() // 壓縮寬 如果值大於圖片原始寬高無效
        .setCompressH() // 壓縮高 如果值大於圖片原始寬高無效
        .setThemeStyle() // 設置主題樣式
	.setPicture_title_color() // 設置標題字體顏色
        .setPicture_right_color() // 設置標題右邊字體顏色
        .setLeftBackDrawable() // 設置返回鍵圖標
        .setStatusBar() // 設置狀態欄顏色,默認是和標題欄一致
        .setImmersive(false)// 是否改變狀態欄字體顏色(黑色) 
	.setNumComplete(false) // 0/9 完成  樣式
	.setClickVideo()// 點擊聲音
        .create();     
或在application進行初始化配置

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // application 初始化
        FunctionOptions options = new FunctionOptions.Builder()
	.setType(FunctionConfig.TYPE_IMAGE);
        .setCompress(true);
        .setGrade(Luban.THIRD_GEAR);
	.create();
        PictureConfig.getInstance().init(options);
    }
}

啓動相冊並拍照      

 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(MainActivity.this, "/custom_file", position, selectMedia);
 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();
            }
        }
	
	 @Override
        public void onSelectSuccess(LocalMedia media) {
            // 單選回調
            selectMedia.add(media);
            if (selectMedia != null) {
                adapter.setList(selectMedia);
                adapter.notifyDataSetChanged();
            }
        }
    };
    

更新日誌:

版本 v1.5.5
1.修復QQ選擇風格不同相冊下選擇數字下標不刷新問題
2.修復拍照和截屏時圖片列表圖片錯亂問題

歷史版本:

版本 v1.5.4
移除多餘代碼,刪除多餘資源文件
新增圖片裁剪框是否可滑動設置
版本 v1.5.3
修復多圖裁剪壓縮模式下頁面不關閉問題
版本 v1.5.2
修復6.0手機單獨拍照無權限閃退問題
修復SoundPool在低於sdk21閃退問題
修復中興手機單獨拍照閃退問題
修復三星SM A9100單獨拍照閃退問題
移除eventbus 3.0
版本 v1.5.0
修復三星s6標題欄遮擋問題

項目使用第三方庫:

1.裁剪使用ucrop庫
3.glide:3.7.0
4.rxjava:2.0.5
5.rxandroid:2.0.1
6.photoView
7.luban

混淆配置

-keep class com.luck.picture.lib.** { *; }

-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }
   
 #rxjava
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
 long producerIndex;
 long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
 rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
 rx.internal.util.atomic.LinkedQueueNode consumerNode;
}

#rxandroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}

#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

兼容性測試:

騰訊優測-深度測試-通過率達到100%

image

演示效果:

image imageimageimageimage imageimage image image image image image image


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章