{"id":28377135,"url":"https://github.com/donkingliang/imageselector","last_synced_at":"2025-06-26T08:31:32.515Z","repository":{"id":43054928,"uuid":"88046208","full_name":"donkingliang/ImageSelector","owner":"donkingliang","description":"Android图片选择器，仿微信的图片选择器的样式和效果。支持图片的单选、限数量的多选和不限数量的多选，支持图片剪切。支持图片预览和图片文件夹的切换。支持在选择图片时调用相机拍照，也支持不用打开相册直接调用相机拍照。","archived":false,"fork":false,"pushed_at":"2022-01-12T07:55:43.000Z","size":599,"stargazers_count":790,"open_issues_count":24,"forks_count":168,"subscribers_count":17,"default_branch":"master","last_synced_at":"2025-05-30T00:42:09.588Z","etag":null,"topics":["android","android-library","canera","imageselector","imageselector-android"],"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/donkingliang.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}},"created_at":"2017-04-12T11:52:40.000Z","updated_at":"2025-05-23T02:49:05.000Z","dependencies_parsed_at":"2022-09-04T09:52:09.048Z","dependency_job_id":null,"html_url":"https://github.com/donkingliang/ImageSelector","commit_stats":null,"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"purl":"pkg:github/donkingliang/ImageSelector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FImageSelector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FImageSelector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FImageSelector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FImageSelector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/donkingliang","download_url":"https://codeload.github.com/donkingliang/ImageSelector/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FImageSelector/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262029924,"owners_count":23247556,"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-library","canera","imageselector","imageselector-android"],"created_at":"2025-05-30T00:39:54.717Z","updated_at":"2025-06-26T08:31:32.502Z","avatar_url":"https://github.com/donkingliang.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ImageSelector\nAndroid图片选择器，仿微信的图片选择器的样式和效果。支持图片的单选、限数量的多选和不限数量的多选。支持图片预览和图片文件夹的切换。支持在选择图片时调用相机拍照，也支持不用打开相册直接调用相机拍照。\n\n先上效果图：\n\n![相册](https://github.com/donkingliang/ImageSelector/blob/master/%E6%95%88%E6%9E%9C%E5%9B%BE/%E7%9B%B8%E5%86%8C.jpg)  ![文件夹](https://github.com/donkingliang/ImageSelector/blob/master/%E6%95%88%E6%9E%9C%E5%9B%BE/%E6%96%87%E4%BB%B6%E5%A4%B9.jpg)  ![预览](https://github.com/donkingliang/ImageSelector/blob/master/%E6%95%88%E6%9E%9C%E5%9B%BE/%E9%A2%84%E8%A7%88.jpg)\n\n**1、引入依赖**\n\n在Project的build.gradle在添加以下代码\n\n```\n\tallprojects {\n\t\trepositories {\n\t\t\t...\n\t\t\tmaven { url 'https://jitpack.io' }\n\t\t}\n\t}\n```\n在Module的build.gradle在添加以下代码\n\n```\n\timplementation 'com.github.donkingliang:ImageSelector:2.2.1'\n```\n从2.0.0版本开始，库迁移androidx。没有使用androidx的项目可以使用1.9.3版本。\n\n**2、配置AndroidManifest.xml**\n\n***注意：*** 1.7.0版本后，不需要再配置FileProvider，ImageSelector内部已经配置了。\n```xml\n//储存卡的读写权限\n\u003cuses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" /\u003e\n//调用相机权限\n\u003cuses-permission android:name=\"android.permission.CAMERA\" /\u003e\n\n//图片选择Activity\n\u003cactivity android:name=\"com.donkingliang.imageselector.ImageSelectorActivity\"\n\t//去掉Activity的ActionBar。\n\t//使用者可以根据自己的项目去配置，不一定要这样写，只要让Activity的ActionBar去掉就可以了。\n    android:theme=\"@style/Theme.AppCompat.Light.NoActionBar\"\n    //横竖屏切换处理。\n    //如果要支持横竖屏切换，一定要加上这句，否则在切换横竖屏的时候会发生异常。\n    android:configChanges=\"orientation|keyboardHidden|screenSize\"/\u003e\n    \n//图片预览Activity\n\u003cactivity android:name=\"com.donkingliang.imageselector.PreviewActivity\"\n    android:theme=\"@style/Theme.AppCompat.Light.NoActionBar\"\n    android:configChanges=\"orientation|keyboardHidden|screenSize\"/\u003e\n\n//图片剪切Activity\n\u003cactivity\n    android:name=\"com.donkingliang.imageselector.ClipImageActivity\"\n    android:theme=\"@style/Theme.AppCompat.Light.NoActionBar\" /\u003e\n\n\u003c!-- Android 7.0 文件共享配置，1.7.0之前必须配置，1.7.0后不需要 --\u003e\n\u003cprovider\n    android:name=\"android.support.v4.content.FileProvider\"\n    android:authorities=\"${applicationId}.fileprovider\"\n    android:exported=\"false\"\n    android:grantUriPermissions=\"true\"\u003e\n    \u003cmeta-data\n        android:name=\"android.support.FILE_PROVIDER_PATHS\"\n        android:resource=\"@xml/file_paths\" /\u003e\n\u003c/provider\u003e\n```\n在res/xml文件夹下创建file_paths.xml文件(名字可以自己定义)\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cpaths\u003e\n\n    \u003c!-- 这个是保存拍照图片的路径,必须配置。 --\u003e\n    \u003cexternal-path\n        name=\"images\"\n        path=\"Pictures\" /\u003e\n\u003c/paths\u003e\n```\n\n**3、调起图片选择器**\n\nImageSelector支持图片的单选、限数量的多选和不限数量的多选。还可以设置是否使用相机、是否剪切图片等配置。ImageSelector提供了统一的调起相册的方法。\n```java\n //单选\n ImageSelector.builder()\n     .useCamera(true) // 设置是否使用拍照\n     .setSingle(true)  //设置是否单选\n     .canPreview(true) //是否可以预览图片，默认为true\n     .start(this, REQUEST_CODE); // 打开相册\n\n//限数量的多选(比如最多9张)\nImageSelector.builder()\n    .useCamera(true) // 设置是否使用拍照\n    .setSingle(false)  //设置是否单选\n    .setMaxSelectCount(9) // 图片的最大选择数量，小于等于0时，不限数量。\n    .setSelected(selected) // 把已选的图片传入默认选中。\n    .canPreview(true) //是否可以预览图片，默认为true\n    .start(this, REQUEST_CODE); // 打开相册\n\n//不限数量的多选\nImageSelector.builder()\n    .useCamera(true) // 设置是否使用拍照\n    .setSingle(false)  //设置是否单选\n    .setMaxSelectCount(0) // 图片的最大选择数量，小于等于0时，不限数量。\n    .setSelected(selected) // 把已选的图片传入默认选中。\n    .canPreview(true) //是否可以预览图片，默认为true\n    .start(this, REQUEST_CODE); // 打开相册\n\n//单选并剪裁\nImageSelector.builder()\n    .useCamera(true) // 设置是否使用拍照\n    .setCrop(true)  // 设置是否使用图片剪切功能。\n    .setCropRatio(1.0f) // 图片剪切的宽高比,默认1.0f。宽固定为手机屏幕的宽。\n    .setSingle(true)  //设置是否单选\n    .canPreview(true) //是否可以预览图片，默认为true\n    .start(this, REQUEST_CODE); // 打开相册\n       \n//仅拍照\nImageSelector.builder()\n    .onlyTakePhoto(true)  // 仅拍照，不打开相册\n    .start(this, REQUEST_CODE);\n    \n//拍照并剪裁\nImageSelector.builder()\n    .setCrop(true) // 设置是否使用图片剪切功能。\n    .setCropRatio(1.0f) // 图片剪切的宽高比,默认1.0f。宽固定为手机屏幕的宽。\n    .onlyTakePhoto(true)  // 仅拍照，不打开相册\n    .start(this, REQUEST_CODE);\n    \n```\nREQUEST_CODE就是调用者自己定义的启动Activity时的requestCode，这个相信大家都能明白。selected可以在再次打开选择器时，把原来已经选择过的图片传入，使这些图片默认为选中状态。\n\n如果是仅拍照模式(onlyTakePhoto = true)时，useCamera无论设置什么，都是为true。\n\n**4、接收选择器返回的数据**\n\n在Activity的onActivityResult方法中接收选择器返回的数据。\n```java\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (requestCode == REQUEST_CODE \u0026\u0026 data != null) {\n\t    //获取选择器返回的数据\n            ArrayList\u003cString\u003e images = data.getStringArrayListExtra(\n            ImageSelector.SELECT_RESULT);\n\t    \n\t    \t/**\n     \t\t* 是否是来自于相机拍照的图片，\n     \t\t* 只有本次调用相机拍出来的照片，返回时才为true。\n     \t\t* 当为true时，图片返回的结果有且只有一张图片。\n\t\t*/\n\t    boolean isCameraImage = data.getBooleanExtra(ImageSelector.IS_CAMERA_IMAGE, false);\n        }\n    }\n```\nImageSelector.SELECT_RESULT是接收数据的key。数据是以ArrayList的字符串数组返回的，就算是单选，返回的也是ArrayList数组，只不过这时候ArrayList只有一条数据而已。ArrayList里面的数据就是选中的图片的文件路径。\n\n**适配android 10**\n\n兼容android 10的手机请使用1.7.0版本。\n\n由于android 10不允许应用直接访问外部文件，所以在android 10及以上的手机，ImageSelect返回的图片链接可能无法直接加载,因为ImageSelector返回的是图片在手机里的地址。但是可以通过uri进行加载，ImageSelector内部提供了一些方法可以供外部使用，用于适配android 10。\n\n如何在Android 10加载手机本地图片，请看我的[这篇博客](https://juejin.im/post/5d80ef726fb9a06aeb10f223)。\n```\n//是否是android 10及以上\nVersionUtils.isAndroidQ();\n\n// android 10可以通过图片uri加载手机本地图片。\n\n//图片链接转uri\nUri uri = UriUtils.getImageContentUri(Context context, String path);\n\n//通过uri加载图片\n Glide.with(mContext).load(uri).into(ivImage);\n ivImage.setImageURI(uri);\n // 或者\nBitmap bitmap = ImageUtil.getBitmapFromUri(Context context, Uri uri);\n```\n\n***注意：*** 剪切返回的图片的图片链接是放在应用的私有目录的，所以剪切返回的图片可以直接用path加载，不需要转成uri再加载。ImageSelector提供了判断图片链接是否是剪切的图片的方法。\n```\n// 是否是剪切返回的图片\nImageUtil.isCutImage(mContext, path);\n```\n\n**图片预加载和缓存**\n\n由于从手机中加载图库是个耗时操作，图片太多时，打开图库可能等待时间过长，用户体验不好。所以在2.1.0版本和1.9.0版本开始，提供了预加载手机图片并缓存的功能。你可以在用户打开图片选择器前，预先加载手机图片，这样在用户打开图片选择器时，会直接从缓存中读取图片列表，大大提升选择器的加载速度。\n\n选择器默认不开启预加载并缓存功能，如果需要预加载，请调用下面的方法：\n```java\nImageSelector.preload(context);\n```\n调用这个方法的时机没有特殊的要求，只要是在打开选择器前调用就可以了。\n\n***注意：*** 由于加载手机图片需要申请WRITE_EXTERNAL_STORAGE权限，所以在调用该方法前，请确保权限已申请。\n\n在选择器使用完毕，不再需要时，可以调用下面方法清空缓存：\n```java\nImageSelector.clearCache(context);\n```\n清空缓存的操作不是必须的，如果不清空，缓存会一直保留，直到app被回收。因为缓存的是图片的路径，所以不会占用太多的内存。\n\n**版本节点**\n\n这里记录的是重要的版本更新节点，全部的版本及更新内容请看[这里](https://github.com/donkingliang/ImageSelector/releases)。\n\n***2.1.0版本\u00261.9.0版本***\n\n添加图片预加载和缓存功能。\n\n***2.0.0版本***\n\n迁移androidx。没有使用androidx的项目可以使用1.9.2版本。\n\n***1.8.0版本***\n\n1、添加直接打开相机拍照功能。\n\n2、优化图片预览页，适配刘海屏。\n\n***1.7.0版本***\n\n1、适配android 10。\n\n2、添加自定义FileProvider，从1.7.0开始，使用者不需要再配置FileProvider。\n\n***1.5.0版本***\n\n1、更新Glide版本到4.x。\n\n2、修改targetSdkVersion为27。\n\nImageSelector从1.5.0版本开始使用了Glide 4.x的版本，由于Glide 3.x版本和4.x版本在使用上有所差异，如果你的项目使用了Glide 3.x版本，而又不想升级到4.x,那么你也可以使用ImageSelector:1.4.0版本，它和新的版本在使用和功能上都会有所差异。[ImageSelector 1.4.0](https://github.com/donkingliang/ImageSelector/blob/master/README1.4.0.md)\n\n想要了解ImageSelector的实现思路和核心代码的同学请看这里：[Android 实现一个仿微信的图片选择器](https://juejin.im/post/5919086244d904006c692abb)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdonkingliang%2Fimageselector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdonkingliang%2Fimageselector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdonkingliang%2Fimageselector/lists"}