├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── cncoderx │ │ └── test │ │ └── photopicker │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── cncoderx │ │ │ └── test │ │ │ └── photopicker │ │ │ └── MainActivity.java │ └── res │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── file_paths.xml │ └── test │ └── java │ └── com │ └── cncoderx │ └── test │ └── photopicker │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── cncoderx │ │ └── photopicker │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── cncoderx │ │ │ └── photopicker │ │ │ ├── Configuration.java │ │ │ ├── PhotoPicker.java │ │ │ ├── adapter │ │ │ ├── AlbumListAdapter.java │ │ │ ├── PhotoGridAdapter.java │ │ │ └── PhotoPreviewAdapter.java │ │ │ ├── anim │ │ │ ├── Animation.java │ │ │ ├── AnimationListener.java │ │ │ ├── Combinable.java │ │ │ ├── SlideInUnderneathAnimation.java │ │ │ └── SlideOutUnderneathAnimation.java │ │ │ ├── bean │ │ │ ├── Album.java │ │ │ └── Photo.java │ │ │ ├── core │ │ │ ├── BitmapLoader.java │ │ │ ├── IImage.java │ │ │ ├── ImageCacheService.java │ │ │ └── Result.java │ │ │ ├── graphics │ │ │ ├── BitmapDrawable.java │ │ │ └── RotateBitmap.java │ │ │ ├── io │ │ │ ├── BlobCache.java │ │ │ ├── BytesBufferPool.java │ │ │ ├── CacheManager.java │ │ │ ├── GalleryBitmapPool.java │ │ │ ├── Pools.java │ │ │ └── SparseArrayBitmapPool.java │ │ │ ├── ui │ │ │ ├── CropPhotoActivity.java │ │ │ ├── GalleryActivity.java │ │ │ ├── MultiPreviewFragment.java │ │ │ ├── PhotoGridFragment.java │ │ │ └── SinglePreviewFragment.java │ │ │ ├── utils │ │ │ ├── BitmapUtils.java │ │ │ ├── BucketHelper.java │ │ │ ├── IOUtils.java │ │ │ ├── Logger.java │ │ │ ├── MathUtils.java │ │ │ └── Thumbnail.java │ │ │ └── widget │ │ │ ├── CropImageView.java │ │ │ ├── HackyViewPager.java │ │ │ ├── HighlightView.java │ │ │ ├── ImageViewTouchBase.java │ │ │ ├── SquareImageView.java │ │ │ └── ToolbarActionButton.java │ └── res │ │ ├── anim │ │ ├── bottom_bar_push_in.xml │ │ └── bottom_bar_push_out.xml │ │ ├── color │ │ └── gallery_text_color_selector.xml │ │ ├── drawable-hdpi │ │ ├── camera_crop_height.png │ │ ├── camera_crop_width.png │ │ ├── ic_launcher.png │ │ └── indicator_autocrop.png │ │ ├── drawable-xhdpi │ │ ├── gallery_ic_camera.png │ │ ├── gallery_ic_close.png │ │ └── gallery_ic_corner_gray.png │ │ ├── drawable │ │ ├── bottom_bar_divider.xml │ │ ├── gallery_bg_bucket.9.png │ │ ├── gallery_bucket_item_selector.xml │ │ └── gallery_button_selector.xml │ │ ├── layout │ │ ├── activity_crop_photo.xml │ │ ├── activity_gallery.xml │ │ ├── fragment_multi_photo_preview.xml │ │ ├── fragment_photo_grid.xml │ │ ├── fragment_single_photo_preview.xml │ │ ├── item_album_list.xml │ │ ├── item_camera_grid.xml │ │ ├── item_photo_grid.xml │ │ ├── item_photo_preview.xml │ │ ├── layout_bottom_bar.xml │ │ └── toolbar_button.xml │ │ ├── menu │ │ └── main.xml │ │ └── values │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── cncoderx │ └── photopicker │ └── ExampleUnitTest.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | PhotoPicker -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 1.7 38 | 39 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PhotoPicker 2 | ### 添加依赖关系 3 | ```gradle 4 | compile 'com.github.CNCoderX:PhotoPicker:1.0.1' 5 | ``` 6 | ### 使用方法 7 | ##### 添加权限 8 | ```xml 9 | 10 | ``` 11 | ##### 在Android7.0上添加FileProvider 12 | ```xml 13 | // 在AndroidManifest.xml中添加 14 | 19 | 20 | 23 | 24 | 25 | // 新建xml/file_paths.xml 26 | 27 | 28 | 29 | 30 | ``` 31 | 32 | ##### 注册activity 33 | ```java 34 | 38 | 39 | 43 | ``` 44 | ##### 在代码中添加 45 | ```java 46 | new PhotoPicker.Builder(this) 47 | .setMaxCount(maxCount) 48 | .setAspect(1, 1) 49 | .hideCamera(true) 50 | .circleCrop(true) 51 | .create(1); 52 | ``` 53 | ```java 54 | @Override 55 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 56 | if (resultCode == RESULT_OK) { 57 | ArrayList images = data.getParcelableArrayListExtra(PhotoPicker.EXTRA_DATA); 58 | ...... 59 | } 60 | } 61 | ``` 62 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | 6 | defaultConfig { 7 | applicationId "com.cncoderx.test.photopicker" 8 | minSdkVersion 15 9 | targetSdkVersion 28 10 | versionCode 1 11 | versionName "1.0" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | compile fileTree(dir: 'libs', include: ['*.jar']) 23 | testCompile 'junit:junit:4.12' 24 | compile project(':library') 25 | } 26 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\wujie\AndroidStudio_SDK/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/cncoderx/test/photopicker/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.cncoderx.test.photopicker; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 28 | 29 | 33 | 34 | 39 | 40 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/cncoderx/test/photopicker/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.cncoderx.test.photopicker; 2 | 3 | import android.Manifest; 4 | import android.content.Intent; 5 | import android.content.pm.PackageManager; 6 | import android.graphics.Bitmap; 7 | import android.graphics.BitmapFactory; 8 | import android.os.Bundle; 9 | import android.support.annotation.NonNull; 10 | import android.support.v4.app.ActivityCompat; 11 | import android.support.v7.app.AppCompatActivity; 12 | import android.view.View; 13 | import android.view.ViewGroup; 14 | import android.widget.BaseAdapter; 15 | import android.widget.CheckBox; 16 | import android.widget.GridView; 17 | import android.widget.ImageView; 18 | import android.widget.Spinner; 19 | import android.widget.Toast; 20 | 21 | import com.cncoderx.photopicker.PhotoPicker; 22 | import com.cncoderx.photopicker.core.IImage; 23 | import com.cncoderx.photopicker.widget.SquareImageView; 24 | 25 | import java.util.ArrayList; 26 | import java.util.List; 27 | 28 | public class MainActivity extends AppCompatActivity { 29 | Spinner spCount, spAspect; 30 | CheckBox cbCamera, cbCrop, cbCircle; 31 | GridView gridView; 32 | 33 | @Override 34 | protected void onCreate(Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | requestPermissions(); 37 | 38 | setContentView(R.layout.activity_main); 39 | spCount = (Spinner) findViewById(R.id.sp_photo_picker_count); 40 | spAspect = (Spinner) findViewById(R.id.sp_photo_picker_aspect); 41 | cbCamera = (CheckBox) findViewById(R.id.cb_photo_picker_camera); 42 | cbCrop = (CheckBox) findViewById(R.id.cb_photo_picker_crop); 43 | cbCircle = (CheckBox) findViewById(R.id.cb_photo_picker_circle_crop); 44 | gridView = (GridView) findViewById(R.id.gv_photo_picker_photos); 45 | } 46 | 47 | private void requestPermissions() { 48 | ActivityCompat.requestPermissions(this, new String[] { 49 | Manifest.permission.WRITE_EXTERNAL_STORAGE 50 | }, 1); 51 | } 52 | 53 | public void onSelect(View view) { 54 | String[] ss = spAspect.getSelectedItem().toString().split(":"); 55 | int aspectX = Integer.parseInt(ss[0].trim()); 56 | int aspectY = Integer.parseInt(ss[1].trim()); 57 | int maxCount = spCount.getSelectedItemPosition() + 1; 58 | new PhotoPicker.Builder(this) 59 | .setMaxCount(maxCount) 60 | .setAspect(aspectX, aspectY) 61 | .hideCamera(cbCamera.isChecked()) 62 | .circleCrop(cbCircle.isChecked()) 63 | // .setCrop(cbCrop.isChecked()) 64 | .create(1); 65 | } 66 | 67 | @Override 68 | public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 69 | super.onRequestPermissionsResult(requestCode, permissions, grantResults); 70 | if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ 71 | // Todo 72 | }else { 73 | Toast.makeText(MainActivity.this, "拒绝授权", Toast.LENGTH_SHORT).show(); 74 | finish(); 75 | } 76 | } 77 | 78 | @Override 79 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 80 | if (resultCode == RESULT_OK) { 81 | ArrayList images = data.getParcelableArrayListExtra("data"); 82 | if (images.size() > 0) { 83 | gridView.setAdapter(new PhotoAdapter(images)); 84 | } 85 | } 86 | } 87 | 88 | class PhotoAdapter extends BaseAdapter { 89 | final List images; 90 | 91 | PhotoAdapter(List images) { 92 | this.images = images; 93 | } 94 | 95 | @Override 96 | public int getCount() { 97 | return images.size(); 98 | } 99 | 100 | @Override 101 | public IImage getItem(int position) { 102 | return images.get(position); 103 | } 104 | 105 | @Override 106 | public long getItemId(int position) { 107 | return position; 108 | } 109 | 110 | @Override 111 | public View getView(int position, View convertView, ViewGroup parent) { 112 | ImageView view = new SquareImageView(MainActivity.this); 113 | Bitmap bitmap = BitmapFactory.decodeFile(images.get(position).getPath()); 114 | view.setImageBitmap(bitmap); 115 | view.setBackgroundColor(0xfff0f0f0); 116 | return view; 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 20 | 21 | 27 | 28 | 33 | 34 | 35 | 39 | 40 | 46 | 47 | 52 | 53 | 54 | 60 | 61 | 66 | 67 | 72 | 73 |