1. 程式人生 > >android多圖選擇

android多圖選擇

PictureSelector

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

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

 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

相關推薦

android選擇器 圖片/視訊 單選or選,以及視訊錄製。The is Android Image Selector。

PictureSelector 最近專案中用到多圖選擇上傳的需求,考慮到android機型眾多問題就自己花時間寫了一個,測試了大概60款機型,出現過一些問題也都一一修復了,基本上穩定了特分享出來,介面UI也是商用級的開發者不用在做太多修改了,介面高度自定義,可

android選擇

PictureSelector 最近專案中用到多圖選擇上傳的需求,考慮到android機型眾多問題就自己花時間寫了一個,測試了大概60款機型,出現過一些問題也都一一修復了,基本上穩定了特分享出來,介面UI也是商用級的開發者不用在做太多修改了,介面高度自定義,可以設定符

android選擇 圖片/視訊 單選or選,以及視訊錄製

最近專案中用到多圖選擇上傳的需求,隨後百度了一下用了別人寫的demo,發現在很多機型上各種不適,閃退等問題,嚴重影響使用,後面我自己寫了一個,公司20幾款手機全部通過,在騰訊雲測中也使用了4,50款手機測試,沒有發現問題,特分享出來。 功能特點: 1.適配android7

理解Android影象處理-拍照、單/選擇器及影象優化

如以上DEMO截圖所示效果,我們對於這種類似的功能肯定不算陌生,因為這可以說是實際開發中一類非常常見的功能需求了。而關於它們的實現,其實主要涉及到的知識面應該就是 Android當中的影象處理了。簡單來說就比如:影象獲取(例如常見的設定頭像(獲取單

android 仿微信選擇器(帶預覽、照相功能)

實現了單選、多選 、拍照 、預覽 等功能;先上圖:      程式碼結構  下面不如正題: 一、新增依賴、許可權 1)新增以下依賴 dependencies { compile fileTree(dir: 'libs', include: ['*.jar'])

Android MultiPhotoContainer選擇容器 快速釋出動態,意見反饋

   這是我第一次在CSDN上發表部落格,11年註冊過CSDN,不過基本都是copy他人的資源。在這裡發現很多牛人,也學到很多知識,近來不忙,常常思緒萬千,其中不乏關於Android開發的想法。  我認為優秀的程式設計師應該是想方設法讓自己越來越懶,或者讓團隊更閒,這樣就有

004-React-Native--選擇上傳

conf ack 資料 multiple spa pac .get end ext 參考資料:http://www.jianshu.com/p/488e62ed9656 一:使用react-native-image-crop-picker進行圖片選擇時,並沒有提供

react-native選擇、圖片裁剪(支持ad/ios圖片個數控制)

多圖片 reac 顯示 async object zimage ram 步驟 技術 扯淡:   目前關於rn比較知名並且封裝好的圖片選擇控件很多,不過能同時支持多圖片上傳,個數控制兼容iOS/Ad的卻寥寥無幾,而今天介紹的這款框架可以實現:圖片裁剪、最大圖片個數限制、拍照

OC 使用TZImagePickerController實現簡單的選擇檢視

1.使用pod在專案中匯入TZImagePickerController: pod 'TZImagePickerController' 2.建立檢視ImagePickView: @protocol ImagePickerViewDelegate <NSO

Android 上傳伺服器_At_Swim

圖片我就不上傳了沒有好的圖片 MainActivity,佈局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a

淺談Android(包括大)上傳時的記憶體處理,防止記憶體溢位。

Android多圖上傳時,為了防止記憶體溢位,基本只要做好兩點就好了,一是及時釋放已經上傳完的圖片,以及在對圖片處理時,必須是一張一張來,因為對圖片的處理過程是最容易OOM的。 下面有簡單的程式碼說明下, 1、首先,圖片的model, ImageBean model中

react-native選擇、圖片裁剪(支援ad/ios圖片個數控制)

前言:   目前關於rn比較知名並且封裝好的圖片選擇控制元件很多,不過能同時支援多圖片上傳,個數控制相容iOS/Ad的卻寥寥無幾,而今天介紹的這款框架可以實現:圖片裁剪、最大圖片個數限制、拍照、本地相簿等功能。 效果:        使用簡介: 核心程式碼: import ImageP

Android線程分析之中的一個:使用Thread異步下載

htm .net ins ace tca inside 分享 sdi 集中 Android多線程分析之中的一個:使用Thread異步下載圖像羅朝輝 (http://blog.csdn.net/kesalin)CC 許可。轉載請註明出處打算整理一下對 Android Fr

微信JSSDK上傳預覽,ios/Android。點選檢視大,支援滑動。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=dev

android日期時間選擇,有多少天?少年?以及設定時間選擇範圍(即最大值和最小值)

DatePickerDialog.OnDateSetListener bbrContactsBirthDateListener = new DatePickerDialog.OnDateSetListener() { @Override public void on

Android 仿朋友圈之九宮格顯示(二)

一個仿微信朋友圈和QQ空間的九宮格圖片展示自定義控制元件效果: 一.介紹: 1、當只有1張圖時,可以自己定製圖片寬高,也可以使用預設九宮格的寬高; 2、當只有4張圖時,以2*2的方式顯示; 3、除以上兩種情況下,都是按照3列方式顯示

【教程】【詳解】如何在Eclipse中離線安裝ADT(Android Development Tools)

1. 背景 本來正常情況的話,去下載整合好ADT的Eclipse,就可以直接使用了: 但是呢,(有人)有時候,是本身已經有了Eclipse了,是需要(通過Eclipse)線上下載和安裝ADT的。 結果就遇到了這種問題: 即,在輸入了: 結果死掉了,處

Android高效載入大解決方案,有效避免程式OOM

本篇文章主要內容來自於Android Doc,我翻譯之後又做了些加工,英文好的朋友也可以直接去讀原文。高效載入大圖片我們在編寫Android程式的時候經常要用到許多圖片,不同圖片總是會有不同的形狀、不同的大小,但在大多數情況下,這些圖片都會大於我們程式所需要的大小。比如說系統

Android維商品屬性SKU選擇

前言: 最近又做到這一塊的需求,以前也做過類似仿淘寶的屬性選擇,當時在網上下載的demo參考,最多也支援兩組商品屬性,用的兩個gridview結合,擴充套件性很差,這次不打算用之前的程式碼,所以重新自己寫了一個demo**(文末附上專案地址)** 如圖所

android webview 載入本地html並且解決卡頓問題

使用webview載入本地html,因為本地html使用多張圖片,滑動起來卡頓,解決方法如下: 把資料夾放入assets資料夾下 Activity載入: WebView wView = (