[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-4030":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":40,"readmeContent":41,"aiSummary":42,"trendingCount":16,"starSnapshotCount":16,"syncStatus":43,"lastSyncTime":44,"discoverSource":45},4030,"PictureSelector","LuckSiege\u002FPictureSelector","LuckSiege","Picture Selector Library for Android or 图片选择器","",null,"Java",13587,3117,198,552,0,1,5,3,45,"Apache License 2.0",false,"version_component",true,[26,27,28,29,30,31,32,33,34,35,36,37,38,39],"android","android-image-selector","camera","compress","glide","image-compression","image-picker","images","multi-selector","photo","photoview","picker","picture-selector","video","2026-06-12 02:00:57","# PictureSelector 3.0 \n   A PictureSelector for Android platform, which supports obtaining pictures, videos, audio & photos from photo albums, cutting (single picture or multi picture cutting), compression, theme custom configuration and other functions, and supports dynamic access & an open source picture selection framework suitable for Android 5.0 + system\u003Cbr> \n   \n   [简体中文🇨🇳](README_CN.md)\n\n   [Download Demo Apk](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fraw\u002Fversion_component\u002Fapp\u002Fdemo\u002Fdemo_2023-12-17_060744_v3.11.2.apk)\u003Cbr>\n\n[![Maven Central](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fmaven%20central-v3.11.2-yellow)](https:\u002F\u002Fgithub.com\u002FLuckSiege)\n[![PRs Welcome](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPRs-Welcome-brightgreen.svg)](https:\u002F\u002Fgithub.com\u002FLuckSiege)\n[![Star](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FLuckSiege\u002FPictureSelector.svg)](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector)\n\n\n## Contents\n-[Latest version](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Freleases\u002Ftag\u002Fv3.11.2)\u003Cbr>\n-[Download](#Download)\u003Cbr>\n-[Usage](#Usage)\u003Cbr>\n-[Permission](#Permission)\u003Cbr>\n-[Result description](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-3.0-LocalMedia%E8%AF%B4%E6%98%8E)\u003Cbr>\n-[Effect](#Effect)\u003Cbr>\n-[ProGuard](#ProGuard)\u003Cbr>\n-[Common errors](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-3.0-%E5%B8%B8%E8%A7%81%E9%94%99%E8%AF%AF)\u003Cbr>\n-[Issues](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002F%E5%A6%82%E4%BD%95%E6%8F%90Issues%3F)\u003Cbr>\n-[License](#License)\u003Cbr>\n\n\n## Download\n\nUse Gradle\n\n```sh\nrepositories {\n  google()\n  mavenCentral()\n}\n\ndependencies {\n  \u002F\u002F PictureSelector basic (Necessary)\n  implementation 'io.github.lucksiege:pictureselector:v3.11.2'\n\n  \u002F\u002F image compress library (Not necessary)\n  implementation 'io.github.lucksiege:compress:v3.11.2'\n\n  \u002F\u002F uCrop library (Not necessary)\n  implementation 'io.github.lucksiege:ucrop:v3.11.2'\n\n  \u002F\u002F simple camerax library (Not necessary)\n  implementation 'io.github.lucksiege:camerax:v3.11.2'\n}\n```\n\nKotlin Version [Demo](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Ftree\u002Fmaster)\n\n```sh\ndependencies {\n  \u002F\u002F 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>\n  \u003CgroupId>io.github.lucksiege\u003C\u002FgroupId>\n  \u003CartifactId>pictureselector\u003C\u002FartifactId>\n  \u003Cversion>v3.11.2\u003C\u002Fversion>\n\u003C\u002Fdependency>\n\n\u003Cdependency>\n  \u003CgroupId>io.github.lucksiege\u003C\u002FgroupId>\n  \u003CartifactId>compress\u003C\u002FartifactId>\n  \u003Cversion>v3.11.2\u003C\u002Fversion>\n\u003C\u002Fdependency>\n\n\u003Cdependency>\n  \u003CgroupId>io.github.lucksiege\u003C\u002FgroupId>\n  \u003CartifactId>ucrop\u003C\u002FartifactId>\n  \u003Cversion>v3.11.2\u003C\u002Fversion>\n\u003C\u002Fdependency>\n\n\u003Cdependency>\n  \u003CgroupId>io.github.lucksiege\u003C\u002FgroupId>\n  \u003CartifactId>camerax\u003C\u002FartifactId>\n  \u003Cversion>v3.11.2\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Permission  \n\nPermission describe，see [documentation](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.WRITE_MEDIA_STORAGE\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.WRITE_SETTINGS\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.RECORD_AUDIO\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.CAMERA\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.VIBRATE\" \u002F>\n\nAndroid 13版本适配，细化存储权限\n\u003Cuses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" \u002F>\n```\n\nAndroid 11 use camera，AndroidManifest.xm add the code：\n\n```sh\n\u003Cqueries package=\"${applicationId}\">\n    \u003Cintent>\n        \u003Caction android:name=\"android.media.action.IMAGE_CAPTURE\">\n\n        \u003C\u002Faction>\n    \u003C\u002Fintent>\n    \u003Cintent>\n        \u003Caction android:name=\"android.media.action.ACTION_VIDEO_CAPTURE\">\n\n        \u003C\u002Faction>\n    \u003C\u002Fintent>\n\u003C\u002Fqueries>\n```\n\n## ImageEngine\n[GlideEngine](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fblob\u002Fversion_component\u002Fapp\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fluck\u002Fpictureselector\u002FGlideEngine.java)\u003Cbr> \n[PicassoEngine](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fblob\u002Fversion_component\u002Fapp\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fluck\u002Fpictureselector\u002FPicassoEngine.java)\u003Cbr>\n[CoilEngine](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fblob\u002Fversion_component\u002Fapp\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fluck\u002Fpictureselector\u002FCoilEngine.java)\u003Cbr>\n\n## Usage\nFor more features, see [documentation](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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>() {\n      @Override\n      public void onResult(ArrayList\u003CLocalMedia> 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>() {\n        @Override\n        public void onResult(ArrayList\u003CLocalMedia> 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>() {\n        @Override\n        public void onResult(ArrayList\u003CLocalMedia> 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>() {\n        @Override\n        public void onResult(ArrayList\u003CLocalMedia> 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>() {\n      @Override\n      public void onResult(ArrayList\u003CLocalMedia> 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>() {\n        @Override\n        public void onComplete(List\u003CLocalMediaFolder> 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>() {\n        @Override\n        public void onComplete(List\u003CLocalMedia> 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>() {\n        @Override\n        public void onComplete(List\u003CLocalMediaFolder> 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:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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> source, OnKeyValueResultCallbackListener call){\n\n   }\n});\n```\n\n3、Use the image uCrop,See [documentation](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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> dataSource, int requestCode) {\n\n   }\n});\n```\n\n4、Use the image edit,See [documentation](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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> query) {\n                                    \n    }\n\n    @Override\n    public void loadOnlyInAppDirAllMediaData(Context context, OnQueryAlbumListener\u003CLocalMediaFolder> query) {\n\n    }\n\n    @Override\n    public void loadFirstPageMediaData(Context context, long bucketId, int page, int pageSize, OnQueryDataResultListener\u003CLocalMedia> query) {\n\n    }\n\n    @Override\n    public void loadMoreMediaData(Context context, long bucketId, int page, int limit, int pageSize, OnQueryDataResultListener\u003CLocalMedia> query) {\n\n    }\n });\n\n```\n\n6、Use the custom apply Permissions,See [documentation](https:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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:\u002F\u002Fgithub.com\u002FLuckSiege\u002FPictureSelector\u002Fwiki\u002FPictureSelector-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\u002F\u002F use Camerax\n-keep class com.luck.lib.camerax.** { *; }\n\n\u002F\u002F 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:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-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\u002Fhome.jpg)|\n\n| Default Style | Preview | Multiple Crop |\n|:-----------:|:--------:|:---------:|\n|![](image\u002Fpicture_default_style_1.jpg) | \u003Cimg src=\"image\u002Fpicture_default_style_2.jpg\"\u002F> | ![](image\u002Fpicture_default_style_new_3.jpg)|\n\n| Digital Style | Preview | Multiple Crop |\n|:-----------:|:--------:|:---------:|\n|![](image\u002Fpicture_num_style_new_1.jpg) | ![](image\u002Fpicture_num_style_new_2.jpg) | ![](image\u002Fpicture_num_style_new_3.jpg)|\n\n| White Style | Preview | Single Crop |\n|:-----------:|:--------:|:---------:|\n|![](image\u002Fpicture_sina_style_1.jpg) | ![](image\u002Fpicture_sina_style_new_2.jpg) | ![](image\u002Fpicture_sina_style_new_3.jpg)|\n\n| New Style | Preview | Multiple Crop |\n|:-----------:|:--------:|:---------:|\n|![](image\u002Fpicture_wechat_style_1.jpg) | ![](image\u002Fpicture_wechat_style_2.jpg) | ![](image\u002Fpicture_wechat_style_new_3.jpg)|\n\n| Photo Album Directory | Single Mode | Circular Crop|\n|:-----------:|:--------:|:--------:|\n|![](image\u002Fpicture_wechat_album_style.jpg) |![](image\u002Fpicture_wechat_single_style_3.jpg) | ![](image\u002Fpicture_circular_crop_new_style.jpg)|\n\n| White Style | Video | Audio |\n|:-----------:|:-----------:|:--------:|\n|![](image\u002Fpicture_white_style.jpeg) |![](image\u002Fpicture_video.jpg) | ![](image\u002Fpicture_audio.jpg)|\n\n","PictureSelector 是一个适用于 Android 平台的图片选择库，支持从相册中获取图片、视频和音频，并提供裁剪（单图或多图）、压缩、主题自定义配置等功能。项目使用 Java 语言编写，具有强大的图像处理能力，如基于 Glide 的图片加载和多种格式的媒体文件支持。它特别适合需要在应用内实现复杂多媒体选择与处理的应用场景，例如社交软件中的图片上传功能或新闻客户端里的图文编辑模块。此外，该库还提供了灵活的动态接入方式以及详细的文档说明，方便开发者快速集成到自己的项目中。",2,"2026-06-11 02:58:00","top_language"]