android多图选择器 图片/视频 单选or多选,以及视频录制。

PictureSelector

×î½üÏîÄ¿ÖÐÓõ½¶àͼѡÔñÉÏ´«µÄÐèÇ󣬿¼Âǵ½android»úÐÍÖÚ¶àÎÊÌâ¾Í×Ô¼º»¨Ê±¼äдÁËÒ»¸ö£¬²âÊÔÁË´ó¸Å60¿î»úÐÍ£¬³öÏÖ¹ýһЩÎÊÌâÒ²¶¼Ò»Ò»ÐÞ¸´ÁË£¬»ù±¾ÉÏÎȶ¨ÁËÌØ·ÖÏí³öÀ´£¬½çÃæUIÒ²ÊÇÉÌÓü¶µÄ¿ª·¢Õß²»ÓÃÔÚ×öÌ«¶àÐÞ¸ÄÁË£¬½çÃæ¸ß¶È×Ô¶¨Ò壬¿ÉÒÔÉèÖ÷ûºÏÄãÏîÄ¿Ö÷É«µ÷µÄ·ç¸ñ£¬¼¯³ÉÍê³Éºó¾Í¿ÉÒÔÄÃÀ´Óá£

ÏîÄ¿»áһֱά»¤£¬·¢ÏÖÎÊÌ⻶ӭÌá³ö»áµÚһʱ¼äÐÞ¸´£¬QQ½»Á÷Ⱥ 619458861£¬¸öÈËQQ [email protected]  Ï£ÍûÓõÃ×ŵÄÅóÓѵã¸östart¡£ 

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ѹËõµµ´ÎÉèÖÃ

ÄÇЩÓöµ½ÅÄÕÕÉÁÍËÎÊÌâµÄͬѧ£¬Çë¼ÇµÃ¿´ÇåÏÂÃæÊÊÅä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½Úµã£¬
\[Çë²Î¿¼ÎҵIJ©¿Í\](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%

image

ÑÝʾЧ¹û£º

image image image image image image image image image image