├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── dictionaries │ └── lenovo.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── LICENSE ├── README.md ├── Screenshots ├── Screenshots1.png ├── Screenshots2.png ├── Screenshots3.png ├── Screenshots4.png ├── Screenshots5.png ├── Screenshots6.png └── ios.gif ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── dmc │ │ └── mediapickerpoject │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── dmc │ │ │ └── mediapickerpoject │ │ │ ├── ExampleApplication.java │ │ │ └── MainActivity.java │ └── res │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── dmc │ └── mediapickerpoject │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── mediapicker ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── dmcbig │ │ │ └── mediapicker │ │ │ ├── PickerActivity.java │ │ │ ├── PickerConfig.java │ │ │ ├── PreviewActivity.java │ │ │ ├── TakePhotoActivity.java │ │ │ ├── adapter │ │ │ ├── FolderAdapter.java │ │ │ ├── MediaGridAdapter.java │ │ │ └── SpacingDecoration.java │ │ │ ├── data │ │ │ ├── DataCallback.java │ │ │ ├── ImageLoader.java │ │ │ ├── LoaderM.java │ │ │ ├── MediaLoader.java │ │ │ └── VideoLoader.java │ │ │ ├── entity │ │ │ ├── Folder.java │ │ │ └── Media.java │ │ │ ├── utils │ │ │ ├── DmcFileProvider.java │ │ │ ├── FileUtils.java │ │ │ └── ScreenUtils.java │ │ │ └── view │ │ │ ├── HackyViewPager.java │ │ │ ├── PreviewFragment.java │ │ │ └── SquareFrameLayout.java │ └── res │ │ ├── color │ │ └── default_text_color.xml │ │ ├── drawable-xhdpi │ │ ├── default_check.png │ │ ├── default_image.png │ │ ├── text_indicator.png │ │ └── video.png │ │ ├── drawable │ │ ├── action_btn.xml │ │ ├── btn_selected.png │ │ ├── btn_unselected.png │ │ └── ic_back.png │ │ ├── layout │ │ ├── folders_view_item.xml │ │ ├── loading.xml │ │ ├── main.xml │ │ ├── media_view_item.xml │ │ ├── picker_actionbar.xml │ │ ├── preview_actionbar.xml │ │ ├── preview_bottombar.xml │ │ ├── preview_fragment_item.xml │ │ └── preview_main.xml │ │ ├── values-es │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ └── strings.xml │ │ ├── values-pt-rPT │ │ └── strings.xml │ │ ├── values-zh │ │ └── strings.xml │ │ ├── values │ │ └── strings.xml │ │ └── xml │ │ └── file_dmc_paths.xml │ └── test │ └── java │ └── com │ └── dmcbig │ └── mediapicker │ └── ExampleUnitTest.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/* 5 | .idea/ 6 | /.idea/workspace.xml 7 | /.idea/libraries 8 | .DS_Store 9 | /build 10 | /captures 11 | .idea 12 | .externalNativeBuild 13 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 23 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/dictionaries/lenovo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 DMC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![](https://jitpack.io/v/DmcSDK/MediaPickerPoject.svg)](https://jitpack.io/#DmcSDK/MediaPickerPoject) 2 | # MediaPickerProject 3 | 4 | 仿微信视频图片选择器,代码撸的非常简洁好改,支持cordova调用,联系QQ:3451927565。 5 | 6 | 同类的库很多很多,但都过于强大而笨重,代码不容易在特别短的时间里面改动扩展,所以我创建了这个简单而轻量的库。 7 | 8 | 非常欢迎有空的小伙伴一同 pull requests 改进优化项目 9 | 10 | 特别是UI,我想再增加几种UI样式,比如模仿知乎图片选择UI风格,个人觉得知乎图片选择UI很清爽,如果有空的人可以加上后提交给我或者其他风格的也行,感谢。 11 | 12 | 怎么使用? 13 | ------------------- 14 | [Cordova版](https://github.com/DmcSDK/cordova-plugin-mediaPicker) : https://github.com/DmcSDK/cordova-plugin-mediaPicker 15 | 16 | [IOS版](https://github.com/DmcSDK/IOSMediaPicker) : https://github.com/DmcSDK/IOSMediaPicker 17 | 18 | use Gradle: 19 | 20 | ```gradle 21 | dependencyResolutionManagement { 22 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 23 | repositories { 24 | mavenCentral() 25 | maven { url 'https://jitpack.io' } 26 | } 27 | } 28 | 29 | dependencies { 30 | implementation 'com.github.DmcSDK:MediaPickerPoject:Tag' 31 | } 32 | ``` 33 | 34 | code: 35 | ``` 36 | ArrayList select = new ArrayList<>();//装被选中的文件 37 | void go(){ 38 | Intent intent =new Intent(MainActivity.this, PickerActivity.class); 39 | intent.putExtra(PickerConfig.SELECT_MODE,PickerConfig.PICKER_IMAGE_VIDEO);//设置选择类型,默认是图片和视频可一起选择(非必填参数) 40 |        long maxSize=188743680L;//long long long long类型 41 | intent.putExtra(PickerConfig.MAX_SELECT_SIZE,maxSize); //最大选择大小,默认180M(非必填参数) 42 | intent.putExtra(PickerConfig.MAX_SELECT_COUNT,15); //最大选择数量,默认40(非必填参数) 43 | ArrayList defaultSelect = select;//可以设置默认选中的照片,比如把select刚刚选择的list设置成默认的。 44 | intent.putExtra(PickerConfig.DEFAULT_SELECTED_LIST,defaultSelect); //可以设置默认选中的照片(非必填参数) 45 | MainActivity.this.startActivityForResult(intent,200); 46 | } 47 | 48 | @Override 49 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 50 | super.onActivityResult(requestCode, resultCode, data); 51 | if(requestCode==200&&resultCode==PickerConfig.RESULT_CODE){ 52 | select=data.getParcelableArrayListExtra(PickerConfig.EXTRA_RESULT);//选择完后返回的list 53 | } 54 | } 55 | 56 | //拍照 57 | // Intent intent =new Intent(MainActivity.this, TakePhotoActivity.class); //Take a photo with a camera 58 | // MainActivity.this.startActivityForResult(intent,200); 59 | ``` 60 | 61 | # Screenshots 62 | ![](https://github.com/dmcBig/MediaPickerPoject/blob/master/Screenshots/Screenshots1.png) 63 | ![](https://github.com/dmcBig/MediaPickerPoject/blob/master/Screenshots/Screenshots2.png) 64 | ![](https://github.com/dmcBig/MediaPickerPoject/blob/master/Screenshots/Screenshots3.png) 65 | ![](https://github.com/dmcBig/MediaPickerPoject/blob/master/Screenshots/Screenshots4.png) 66 | ![](https://github.com/dmcBig/MediaPickerPoject/blob/master/Screenshots/Screenshots5.png) 67 | ![](https://github.com/dmcBig/MediaPickerPoject/blob/master/Screenshots/Screenshots6.png) 68 | -------------------------------------------------------------------------------- /Screenshots/Screenshots1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DmcSDK/MediaPickerPoject/cf768d7ffff5de6e86b58d41f8c3d0947f17160f/Screenshots/Screenshots1.png -------------------------------------------------------------------------------- /Screenshots/Screenshots2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DmcSDK/MediaPickerPoject/cf768d7ffff5de6e86b58d41f8c3d0947f17160f/Screenshots/Screenshots2.png -------------------------------------------------------------------------------- /Screenshots/Screenshots3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DmcSDK/MediaPickerPoject/cf768d7ffff5de6e86b58d41f8c3d0947f17160f/Screenshots/Screenshots3.png -------------------------------------------------------------------------------- /Screenshots/Screenshots4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DmcSDK/MediaPickerPoject/cf768d7ffff5de6e86b58d41f8c3d0947f17160f/Screenshots/Screenshots4.png -------------------------------------------------------------------------------- /Screenshots/Screenshots5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DmcSDK/MediaPickerPoject/cf768d7ffff5de6e86b58d41f8c3d0947f17160f/Screenshots/Screenshots5.png -------------------------------------------------------------------------------- /Screenshots/Screenshots6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DmcSDK/MediaPickerPoject/cf768d7ffff5de6e86b58d41f8c3d0947f17160f/Screenshots/Screenshots6.png -------------------------------------------------------------------------------- /Screenshots/ios.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DmcSDK/MediaPickerPoject/cf768d7ffff5de6e86b58d41f8c3d0947f17160f/Screenshots/ios.gif -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 33 5 | buildToolsVersion '29.0.3' 6 | defaultConfig { 7 | applicationId "dmc.mediapickerpoject" 8 | minSdkVersion 16 9 | targetSdkVersion 29 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' 13 | } 14 | compileOptions { 15 | sourceCompatibility JavaVersion.VERSION_1_8 16 | targetCompatibility JavaVersion.VERSION_1_8 17 | } 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | } 25 | 26 | dependencies { 27 | compile fileTree(include: ['*.jar'], dir: 'libs') 28 | androidTestCompile('androidx.test.espresso:espresso-core:3.1.0', { 29 | exclude group: 'com.android.support', module: 'support-annotations' 30 | }) 31 | compile 'androidx.appcompat:appcompat:1.0.0' 32 | compile 'androidx.constraintlayout:constraintlayout:1.1.3' 33 | testCompile 'junit:junit:4.12' 34 | compile project(':mediapicker') 35 | } 36 | -------------------------------------------------------------------------------- /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 E:\android_develop_tools\sdk1/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 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/androidTest/java/dmc/mediapickerpoject/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package dmc.mediapickerpoject; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("dmc.mediapickerpoject", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/java/dmc/mediapickerpoject/ExampleApplication.java: -------------------------------------------------------------------------------- 1 | package dmc.mediapickerpoject; 2 | 3 | import android.app.Application; 4 | 5 | 6 | /** 7 | * Created by dmcBig on 2017/7/25. 8 | */ 9 | 10 | public class ExampleApplication extends Application { 11 | 12 | @Override public void onCreate() { 13 | super.onCreate(); 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/dmc/mediapickerpoject/MainActivity.java: -------------------------------------------------------------------------------- 1 | package dmc.mediapickerpoject; 2 | 3 | import android.content.Intent; 4 | import android.net.Uri; 5 | import android.os.Bundle; 6 | import androidx.appcompat.app.AppCompatActivity; 7 | import android.util.Log; 8 | import android.view.View; 9 | import android.widget.ImageView; 10 | 11 | import com.dmcbig.mediapicker.PickerActivity; 12 | import com.dmcbig.mediapicker.PickerConfig; 13 | import com.dmcbig.mediapicker.TakePhotoActivity; 14 | import com.dmcbig.mediapicker.entity.Media; 15 | 16 | import java.net.URI; 17 | import java.util.ArrayList; 18 | 19 | public class MainActivity extends AppCompatActivity { 20 | 21 | ImageView imageView; 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.activity_main); 26 | imageView=(ImageView) findViewById(R.id.immmgg); 27 | findViewById(R.id.go).setOnClickListener(new View.OnClickListener() { 28 | @Override 29 | public void onClick(View v) { 30 | go(); 31 | } 32 | }); 33 | 34 | findViewById(R.id.take).setOnClickListener(new View.OnClickListener() { 35 | @Override 36 | public void onClick(View v) { 37 | Intent intent =new Intent(MainActivity.this, TakePhotoActivity.class); //Take a photo with a camera 38 | MainActivity.this.startActivityForResult(intent,200); 39 | } 40 | }); 41 | } 42 | 43 | ArrayList select; 44 | void go(){ 45 | Intent intent =new Intent(MainActivity.this, PickerActivity.class); 46 | intent.putExtra(PickerConfig.SELECT_MODE,PickerConfig.PICKER_IMAGE);//default image and video (Optional) 47 | long maxSize=188743680L;//long long long 48 | intent.putExtra(PickerConfig.MAX_SELECT_SIZE,maxSize); //default 180MB (Optional) 49 | intent.putExtra(PickerConfig.MAX_SELECT_COUNT,15); //default 40 (Optional) 50 | intent.putExtra(PickerConfig.DEFAULT_SELECTED_LIST,select); // (Optional) 51 | MainActivity.this.startActivityForResult(intent,200); 52 | } 53 | 54 | @Override 55 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 56 | super.onActivityResult(requestCode, resultCode, data); 57 | if(requestCode==200&&resultCode==PickerConfig.RESULT_CODE){ 58 | select=data.getParcelableArrayListExtra(PickerConfig.EXTRA_RESULT); 59 | Log.i("select","select.size"+select.size()); 60 | for(Media media:select){ 61 | Log.i("media",media.path); 62 | Log.e("media","s:"+media.size); 63 | imageView.setImageURI(Uri.parse(media.path)); 64 | } 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 |