{"id":15029363,"url":"https://github.com/lucksiege/pictureselector","last_synced_at":"2025-05-13T00:12:17.379Z","repository":{"id":37359564,"uuid":"77993578","full_name":"LuckSiege/PictureSelector","owner":"LuckSiege","description":"Picture Selector Library for Android or 图片选择器","archived":false,"fork":false,"pushed_at":"2024-05-11T03:14:44.000Z","size":542078,"stargazers_count":13460,"open_issues_count":548,"forks_count":3054,"subscribers_count":196,"default_branch":"version_component","last_synced_at":"2025-05-13T00:12:06.211Z","etag":null,"topics":["android","android-image-selector","camera","compress","glide","image-compression","image-picker","images","multi-selector","photo","photoview","picker","picture-selector","video"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LuckSiege.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-01-04T07:47:39.000Z","updated_at":"2025-05-12T12:08:04.000Z","dependencies_parsed_at":"2023-02-19T04:45:45.341Z","dependency_job_id":"22aedc3f-1501-4a40-9f31-258c9a5030d8","html_url":"https://github.com/LuckSiege/PictureSelector","commit_stats":{"total_commits":3541,"total_committers":17,"mean_commits":208.2941176470588,"dds":0.6012425868398757,"last_synced_commit":"a880156bbd4df2ebe254858b9f5acec0a7ca54c3"},"previous_names":[],"tags_count":130,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuckSiege%2FPictureSelector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuckSiege%2FPictureSelector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuckSiege%2FPictureSelector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LuckSiege%2FPictureSelector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LuckSiege","download_url":"https://codeload.github.com/LuckSiege/PictureSelector/tar.gz/refs/heads/version_component","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253843219,"owners_count":21972874,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-image-selector","camera","compress","glide","image-compression","image-picker","images","multi-selector","photo","photoview","picker","picture-selector","video"],"created_at":"2024-09-24T20:10:25.814Z","updated_at":"2025-05-13T00:12:17.358Z","avatar_url":"https://github.com/LuckSiege.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PictureSelector 3.0 \n   A PictureSelector for Android platform, which supports obtaining pictures, videos, audio \u0026 photos from photo albums, cutting (single picture or multi picture cutting), compression, theme custom configuration and other functions, and supports dynamic access \u0026 an open source picture selection framework suitable for Android 5.0 + system\u003cbr\u003e \n   \n   [简体中文🇨🇳](README_CN.md)\n\n   [Download Demo Apk](https://github.com/LuckSiege/PictureSelector/raw/version_component/app/demo/demo_2023-12-17_060744_v3.11.2.apk)\u003cbr\u003e\n\n[![Maven Central](https://img.shields.io/badge/maven%20central-v3.11.2-yellow)](https://github.com/LuckSiege)\n[![PRs Welcome](https://img.shields.io/badge/PRs-Welcome-brightgreen.svg)](https://github.com/LuckSiege)\n[![Star](https://img.shields.io/github/stars/LuckSiege/PictureSelector.svg)](https://github.com/LuckSiege/PictureSelector)\n\n\n## Contents\n-[Latest version](https://github.com/LuckSiege/PictureSelector/releases/tag/v3.11.2)\u003cbr\u003e\n-[Download](#Download)\u003cbr\u003e\n-[Usage](#Usage)\u003cbr\u003e\n-[Permission](#Permission)\u003cbr\u003e\n-[Result description](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-LocalMedia%E8%AF%B4%E6%98%8E)\u003cbr\u003e\n-[Effect](#Effect)\u003cbr\u003e\n-[ProGuard](#ProGuard)\u003cbr\u003e\n-[Common errors](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%B8%B8%E8%A7%81%E9%94%99%E8%AF%AF)\u003cbr\u003e\n-[Issues](https://github.com/LuckSiege/PictureSelector/wiki/%E5%A6%82%E4%BD%95%E6%8F%90Issues%3F)\u003cbr\u003e\n-[License](#License)\u003cbr\u003e\n\n\n## Download\n\nUse Gradle\n\n```sh\nrepositories {\n  google()\n  mavenCentral()\n}\n\ndependencies {\n  // PictureSelector basic (Necessary)\n  implementation 'io.github.lucksiege:pictureselector:v3.11.2'\n\n  // image compress library (Not necessary)\n  implementation 'io.github.lucksiege:compress:v3.11.2'\n\n  // uCrop library (Not necessary)\n  implementation 'io.github.lucksiege:ucrop:v3.11.2'\n\n  // simple camerax library (Not necessary)\n  implementation 'io.github.lucksiege:camerax:v3.11.2'\n}\n```\n\nKotlin Version [Demo](https://github.com/LuckSiege/PictureSelector/tree/master)\n\n```sh\ndependencies {\n  // Please do not upgrade across versions, please check the Kotlin version demo first\n  implementation 'io.github.lucksiege:pictureselector:kotlin-v1.0.0-beta'\n}\n```\n\nOr Maven:\n\n```sh\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.lucksiege\u003c/groupId\u003e\n  \u003cartifactId\u003epictureselector\u003c/artifactId\u003e\n  \u003cversion\u003ev3.11.2\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.lucksiege\u003c/groupId\u003e\n  \u003cartifactId\u003ecompress\u003c/artifactId\u003e\n  \u003cversion\u003ev3.11.2\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.lucksiege\u003c/groupId\u003e\n  \u003cartifactId\u003eucrop\u003c/artifactId\u003e\n  \u003cversion\u003ev3.11.2\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.lucksiege\u003c/groupId\u003e\n  \u003cartifactId\u003ecamerax\u003c/artifactId\u003e\n  \u003cversion\u003ev3.11.2\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Permission  \n\nPermission describe，see [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E6%9D%83%E9%99%90%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)\n\n```sh\n\u003cuses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.WRITE_MEDIA_STORAGE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.WRITE_SETTINGS\" /\u003e\n\u003cuses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" /\u003e\n\u003cuses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.RECORD_AUDIO\" /\u003e\n\u003cuses-permission android:name=\"android.permission.CAMERA\" /\u003e\n\u003cuses-permission android:name=\"android.permission.VIBRATE\" /\u003e\n\nAndroid 13版本适配，细化存储权限\n\u003cuses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" /\u003e\n\u003cuses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" /\u003e\n\u003cuses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" /\u003e\n```\n\nAndroid 11 use camera，AndroidManifest.xm add the code：\n\n```sh\n\u003cqueries package=\"${applicationId}\"\u003e\n    \u003cintent\u003e\n        \u003caction android:name=\"android.media.action.IMAGE_CAPTURE\"\u003e\n\n        \u003c/action\u003e\n    \u003c/intent\u003e\n    \u003cintent\u003e\n        \u003caction android:name=\"android.media.action.ACTION_VIDEO_CAPTURE\"\u003e\n\n        \u003c/action\u003e\n    \u003c/intent\u003e\n\u003c/queries\u003e\n```\n\n## ImageEngine\n[GlideEngine](https://github.com/LuckSiege/PictureSelector/blob/version_component/app/src/main/java/com/luck/pictureselector/GlideEngine.java)\u003cbr\u003e \n[PicassoEngine](https://github.com/LuckSiege/PictureSelector/blob/version_component/app/src/main/java/com/luck/pictureselector/PicassoEngine.java)\u003cbr\u003e\n[CoilEngine](https://github.com/LuckSiege/PictureSelector/blob/version_component/app/src/main/java/com/luck/pictureselector/CoilEngine.java)\u003cbr\u003e\n\n## Usage\nFor more features, see [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%8A%9F%E8%83%BDapi%E8%AF%B4%E6%98%8E)\n\nA simple use case is shown below:\n\n1、Get picture \n\n```sh\nPictureSelector.create(this)\n   .openGallery(SelectMimeType.ofImage())\n   .setImageEngine(GlideEngine.createGlideEngine())\n   .forResult(new OnResultCallbackListener\u003cLocalMedia\u003e() {\n      @Override\n      public void onResult(ArrayList\u003cLocalMedia\u003e result) {\n\n      }\n\n      @Override\n      public void onCancel() {\n\n     }\n});\n```\n\nUsing system albums\n\n```sh\nPictureSelector.create(this)\n     .openSystemGallery(SelectMimeType.ofImage())\n     .forResult(new OnResultCallbackListener\u003cLocalMedia\u003e() {\n        @Override\n        public void onResult(ArrayList\u003cLocalMedia\u003e result) {\n\n        }\n\n        @Override\n        public void onCancel() {\n\n        }\n});\n```\n\n2、Only use camera\n\n```sh\nPictureSelector.create(this)\n     .openCamera(SelectMimeType.ofImage())\n     .forResult(new OnResultCallbackListener\u003cLocalMedia\u003e() {\n        @Override\n        public void onResult(ArrayList\u003cLocalMedia\u003e result) {\n\n        }\n\n        @Override\n        public void onCancel() {\n\n        }\n});\n```\n\nTo take photos separately in the Navigation Fragment scene, please use the following methods:\n\n```sh\nPictureSelector.create(this)\n     .openCamera(SelectMimeType.ofImage())\n     .forResultActivity(new OnResultCallbackListener\u003cLocalMedia\u003e() {\n        @Override\n        public void onResult(ArrayList\u003cLocalMedia\u003e result) {\n\n        }\n\n        @Override\n        public void onCancel() {\n\n        }\n});\n```\n\n3、You can also use the following example：\n\n(1)、Inject into any view fragment\n\n```sh\n\nPictureSelector.create(this)\n   .openGallery(SelectMimeType.ofAll())\n   .setImageEngine(GlideEngine.createGlideEngine())\n   .buildLaunch(R.id.fragment_container, new OnResultCallbackListener\u003cLocalMedia\u003e() {\n      @Override\n      public void onResult(ArrayList\u003cLocalMedia\u003e result) {\n      \n      }\n\n      @Override\n      public void onCancel() {\n      \n      }\n});\n\t\t\t\n```\n\n(2)、Custom Inject into any view fragment\n\n```sh\n\nPictureSelectorFragment selectorFragment = PictureSelector.create(this)\n     .openGallery(SelectMimeType.ofAll())\n     .setImageEngine(GlideEngine.createGlideEngine())\n     .build();\n     \ngetSupportFragmentManager().beginTransaction()\n     .add(R.id.fragment_container, selectorFragment, selectorFragment.getFragmentTag())\n     .addToBackStack(selectorFragment.getFragmentTag())\n     .commitAllowingStateLoss();\n\t\t\t\n```\n\n4、Only query data source\n\n(1)、get album data\n\n```sh\n\nPictureSelector.create(this)\n    .dataSource(SelectMimeType.ofAll())\n    .obtainAlbumData(new OnQueryDataSourceListener\u003cLocalMediaFolder\u003e() {\n        @Override\n        public void onComplete(List\u003cLocalMediaFolder\u003e result) {\n\n        }\n   );\n\n```\n\n(2)、get media data\n\n```sh\n\nPictureSelector.create(this)\n    .dataSource(SelectMimeType.ofAll())\n    .obtainMediaData(new OnQueryDataSourceListener\u003cLocalMedia\u003e() {\n        @Override\n        public void onComplete(List\u003cLocalMedia\u003e result) {\n\n        }\n   );\n\n```\n\n(3)、IBridgeMediaLoader get data \n\n```sh\n\nIBridgeMediaLoader loader = PictureSelector.create(this)\n    .dataSource(SelectMimeType.ofImage()).buildMediaLoader();\n    loader.loadAllAlbum(new OnQueryAllAlbumListener\u003cLocalMediaFolder\u003e() {\n        @Override\n        public void onComplete(List\u003cLocalMediaFolder\u003e result) {\n\n        }\n  });\n\n```\n\n5、Preview image、video、audio\n\nIf you preview the online video AndroidManifest XML add the following code\n\n```sh\nandroid:usesCleartextTraffic=\"true\"\n```\n\n```sh\n\nPictureSelector.create(this)\n    .openPreview()\n    .setImageEngine(GlideEngine.createGlideEngine())\n    .setExternalPreviewEventListener(new OnExternalPreviewEventListener() {\n       @Override\n       public void onPreviewDelete(int position) {\n\n       }\n\n        @Override\n       public boolean onLongPressDownload(LocalMedia media) {\n           return false;\n       }\n    }).startActivityPreview(position, true, \"data\");\n\n```\n\n\nSet theme，see [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E4%B8%BB%E9%A2%98api%E8%AF%B4%E6%98%8E)\n\n```sh\n.setSelectorUIStyle();\n```\nOr Overload layout，see [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%A6%82%E4%BD%95%E9%87%8D%E8%BD%BD%E5%B8%83%E5%B1%80%EF%BC%9F)\n\n```sh\n.setInjectLayoutResourceListener(new OnInjectLayoutResourceListener() {\n   @Override\n   public int getLayoutResourceId(Context context, int resourceSource) {\n\treturn 0;\n}\n```\n\nThe advanced use cases are as follow：\n\n1、Use the custom camera,See [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9B%B8%E6%9C%BA%EF%BC%9F)\n\n```sh\n.setCameraInterceptListener(new OnCameraInterceptListener() {\n    @Override\n    public void openCamera(Fragment fragment, int cameraMode, int requestCode){\n\n    }\n});\n```\n\n2、Use the image compress,See [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%A6%82%E4%BD%95%E5%8E%8B%E7%BC%A9%EF%BC%9F)\n\n```sh\n.setCompressEngine(new CompressFileEngine() {\n   @Override\n   public void onStartCompress(Context context, ArrayList\u003cUri\u003e source, OnKeyValueResultCallbackListener call){\n\n   }\n});\n```\n\n3、Use the image uCrop,See [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%A6%82%E4%BD%95%E8%A3%81%E5%89%AA%EF%BC%9F)\n\n```sh\n\n.setCropEngine(new CropFileEngine() {\n   @Override\n   public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayList\u003cString\u003e dataSource, int requestCode) {\n\n   }\n});\n```\n\n4、Use the image edit,See [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%A6%82%E4%BD%95%E7%BC%96%E8%BE%91%E5%9B%BE%E7%89%87%EF%BC%9F)\n\n```sh\n.setEditMediaInterceptListener(new OnMediaEditInterceptListener() {\n    @Override\n    public void onStartMediaEdit(Fragment fragment, LocalMedia currentLocalMedia, int requestCode) {\n\n    }\n});\n\n```\n\n5、Use the custom load data,See [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%A6%82%E4%BD%95%E5%8A%A0%E8%BD%BD%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E6%BA%90%EF%BC%9F)\n\n```sh\n.setExtendLoaderEngine(new ExtendLoaderEngine() {\n    @Override\n    public void loadAllAlbumData(Context context, OnQueryAllAlbumListener\u003cLocalMediaFolder\u003e query) {\n                                    \n    }\n\n    @Override\n    public void loadOnlyInAppDirAllMediaData(Context context, OnQueryAlbumListener\u003cLocalMediaFolder\u003e query) {\n\n    }\n\n    @Override\n    public void loadFirstPageMediaData(Context context, long bucketId, int page, int pageSize, OnQueryDataResultListener\u003cLocalMedia\u003e query) {\n\n    }\n\n    @Override\n    public void loadMoreMediaData(Context context, long bucketId, int page, int limit, int pageSize, OnQueryDataResultListener\u003cLocalMedia\u003e query) {\n\n    }\n });\n\n```\n\n6、Use the custom apply Permissions,See [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9D%83%E9%99%90%E7%94%B3%E8%AF%B7-%EF%BC%9F)\n\n```sh\n.setPermissionsInterceptListener(new OnPermissionsInterceptListener() {\n      @Override\n      public void requestPermission(Fragment fragment, String[] permissionArray, OnRequestPermissionListener call) {\n\n      }\n\n      @Override\n      public boolean hasPermissions(Fragment fragment, String[] permissionArray) {\n      return false;\n  }\n});\n\n```\n\n7、Android 10 and above, Sandbox mechanism, file processing，Permissions,See [documentation](https://github.com/LuckSiege/PictureSelector/wiki/PictureSelector-3.0-%E5%A6%82%E4%BD%95%E8%AE%BF%E9%97%AE%E6%B2%99%E7%9B%92%E5%A4%96%E8%B5%84%E6%BA%90%EF%BC%9F)\n\n```sh\n.setSandboxFileEngine(new UriToFileTransformEngine() {\n    @Override\n    public void onUriToFileAsyncTransform(Context context, String srcPath, String mineType, OnKeyValueResultCallbackListener call) {\n                                        \n    }\n});\n```\n\n## ProGuard\n```sh\n-keep class com.luck.picture.lib.** { *; }\n\n// use Camerax\n-keep class com.luck.lib.camerax.** { *; }\n\n// use uCrop\n-dontwarn com.yalantis.ucrop**\n-keep class com.yalantis.ucrop** { *; }\n-keep interface com.yalantis.ucrop** { *; }\n```\n## License\n```sh\nCopyright 2016 Luck\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n\n\n\n## Effect\n\n| Function list |\n|:-----------:|\n|![](image/home.jpg)|\n\n| Default Style | Preview | Multiple Crop |\n|:-----------:|:--------:|:---------:|\n|![](image/picture_default_style_1.jpg) | \u003cimg src=\"image/picture_default_style_2.jpg\"/\u003e | ![](image/picture_default_style_new_3.jpg)|\n\n| Digital Style | Preview | Multiple Crop |\n|:-----------:|:--------:|:---------:|\n|![](image/picture_num_style_new_1.jpg) | ![](image/picture_num_style_new_2.jpg) | ![](image/picture_num_style_new_3.jpg)|\n\n| White Style | Preview | Single Crop |\n|:-----------:|:--------:|:---------:|\n|![](image/picture_sina_style_1.jpg) | ![](image/picture_sina_style_new_2.jpg) | ![](image/picture_sina_style_new_3.jpg)|\n\n| New Style | Preview | Multiple Crop |\n|:-----------:|:--------:|:---------:|\n|![](image/picture_wechat_style_1.jpg) | ![](image/picture_wechat_style_2.jpg) | ![](image/picture_wechat_style_new_3.jpg)|\n\n| Photo Album Directory | Single Mode | Circular Crop|\n|:-----------:|:--------:|:--------:|\n|![](image/picture_wechat_album_style.jpg) |![](image/picture_wechat_single_style_3.jpg) | ![](image/picture_circular_crop_new_style.jpg)|\n\n| White Style | Video | Audio |\n|:-----------:|:-----------:|:--------:|\n|![](image/picture_white_style.jpeg) |![](image/picture_video.jpg) | ![](image/picture_audio.jpg)|\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucksiege%2Fpictureselector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flucksiege%2Fpictureselector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucksiege%2Fpictureselector/lists"}