{"id":13551230,"url":"https://github.com/fluttercandies/flutter_photo_manager","last_synced_at":"2025-11-17T03:36:07.697Z","repository":{"id":36971752,"uuid":"148135345","full_name":"fluttercandies/flutter_photo_manager","owner":"fluttercandies","description":"A Flutter plugin that provides images, videos, and audio abstraction management APIs without interface integration, available on Android, iOS, macOS and OpenHarmony.","archived":false,"fork":false,"pushed_at":"2025-04-23T09:05:43.000Z","size":3058,"stargazers_count":723,"open_issues_count":66,"forks_count":344,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-05-08T01:17:35.714Z","etag":null,"topics":["dart","flutter","flutter-plugin","image","photo","photos","plugin","video"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/photo_manager","language":"Dart","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/fluttercandies.png","metadata":{"files":{"readme":"README-ZH.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-10T09:59:38.000Z","updated_at":"2025-05-07T20:47:25.000Z","dependencies_parsed_at":"2022-07-12T16:12:55.287Z","dependency_job_id":"5ca8a240-e0c5-4226-83c9-6560bcf5e5fc","html_url":"https://github.com/fluttercandies/flutter_photo_manager","commit_stats":{"total_commits":1064,"total_committers":48,"mean_commits":"22.166666666666668","dds":"0.40883458646616544","last_synced_commit":"b1217fb1b7c420108a2ad17fe85053a1859ee02c"},"previous_names":["caijinglong/flutter_photo_manager"],"tags_count":148,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2Fflutter_photo_manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2Fflutter_photo_manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2Fflutter_photo_manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2Fflutter_photo_manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fluttercandies","download_url":"https://codeload.github.com/fluttercandies/flutter_photo_manager/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254092656,"owners_count":22013290,"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":["dart","flutter","flutter-plugin","image","photo","photos","plugin","video"],"created_at":"2024-08-01T12:01:44.504Z","updated_at":"2025-11-17T03:36:07.690Z","avatar_url":"https://github.com/fluttercandies.png","language":"Dart","readme":"\u003c!-- Copyright 2018 The FlutterCandies author. All rights reserved.\nUse of this source code is governed by an Apache license\nthat can be found in the LICENSE file. --\u003e\n\n# photo_manager\n\n[English](README.md) | 中文\n\n[![pub package](https://img.shields.io/pub/v/photo_manager?label=%E7%A8%B3%E5%AE%9A%E7%89%88\u0026style=flat)][pub package]\n[![pub pre-release package](https://img.shields.io/pub/v/photo_manager?color=9d00ff\u0026include_prereleases\u0026label=%E6%B5%8B%E8%AF%95%E7%89%88\u0026style=flat)][pub package]\n[![Build status](https://img.shields.io/github/actions/workflow/status/fluttercandies/flutter_photo_manager/runnable.yml?branch=main\u0026label=CI\u0026logo=github\u0026style=flat)](https://github.com/fluttercandies/flutter_photo_manager/actions/workflows/runnable.yml)\n[![GitHub license](https://img.shields.io/github/license/fluttercandies/flutter_photo_manager?style=flat)](https://github.com/fluttercandies/flutter_photo_manager/blob/main/LICENSE)\n\n[![GitHub stars](https://img.shields.io/github/stars/fluttercandies/flutter_photo_manager?logo=github\u0026style=flat)](https://github.com/fluttercandies/flutter_photo_manager/stargazers)\n[![GitHub forks](https://img.shields.io/github/forks/fluttercandies/flutter_photo_manager?logo=github\u0026style=flat)](https://github.com/fluttercandies/flutter_photo_manager/network)\n[![Awesome Flutter](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/Solido/awesome-flutter)\n\u003ca href=\"https://qm.qq.com/q/ZyJbSVjfSU\"\u003e\u003cimg src=\"https://img.shields.io/badge/dynamic/yaml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffluttercandies%2F.github%2Frefs%2Fheads%2Fmain%2Fdata.yml\u0026query=%24.qq_group_number\u0026label=QQ%E7%BE%A4\u0026logo=qq\u0026style=flat\u0026color=1DACE8\" /\u003e\u003c/a\u003e\n\n通过相册的抽象 API 对设备中的资源（图片、视频、音频）进行管理，不需要集成 UI。\n在 Android、iOS、macOS and OpenHarmony上可用。\n\n## 集成此插件的推荐项目\n\n| name                 | pub                                                                                                                          | github                                                                                                                                                                  |\n|:---------------------|:-----------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| wechat_assets_picker | [![pub package](https://img.shields.io/pub/v/wechat_assets_picker)](https://pub.flutter-io.cn/packages/wechat_assets_picker) | [![star](https://img.shields.io/github/stars/fluttercandies/flutter_wechat_assets_picker?style=social)](https://github.com/fluttercandies/flutter_wechat_assets_picker) |\n| wechat_camera_picker | [![pub package](https://img.shields.io/pub/v/wechat_camera_picker)](https://pub.flutter-io.cn/packages/wechat_camera_picker) | [![star](https://img.shields.io/github/stars/fluttercandies/flutter_wechat_camera_picker?style=social)](https://github.com/fluttercandies/flutter_wechat_camera_picker) |\n\n## 关于此插件的文章\n\n- [Hard to manage media with Flutter? Try photo_manager, the all-in-one solution](https://medium.flutter.cn/hard-to-manage-media-with-flutter-try-photo-manager-the-all-in-one-solution-5188599e4cf)\n\n## 破坏性改动迁移指南\n\n查看 [迁移指南](MIGRATION_GUIDE.md) 了解如何在破坏性改动之间迁移。\n\n\u003cdetails\u003e\n  \u003csummary\u003e目录列表\u003c/summary\u003e\n\n\u003c!-- TOC --\u003e\n* [photo_manager](#photo_manager)\n  * [集成此插件的推荐项目](#集成此插件的推荐项目)\n  * [关于此插件的文章](#关于此插件的文章)\n  * [破坏性改动迁移指南](#破坏性改动迁移指南)\n  * [常见问题](#常见问题)\n  * [使用前准备](#使用前准备)\n    * [添加依赖](#添加依赖)\n    * [导入到你的项目中：](#导入到你的项目中)\n    * [原生平台的配置](#原生平台的配置)\n      * [Android 配置准备](#android-配置准备)\n        * [Kotlin, Gradle, AGP](#kotlin-gradle-agp)\n        * [Android 10 (Q, 29)](#android-10-q-29)\n        * [Glide](#glide)\n      * [iOS 配置准备](#ios-配置准备)\n  * [使用方法](#使用方法)\n    * [请求权限](#请求权限)\n      * [受限的资源权限](#受限的资源权限)\n        * [iOS 受限的资源权限](#ios-受限的资源权限)\n        * [Android 受限的资源权限](#android-受限的资源权限)\n    * [获取相簿或图集 (`AssetPathEntity`)](#获取相簿或图集-assetpathentity)\n      * [`getAssetPathList` 方法的参数](#getassetpathlist-方法的参数)\n      * [PMPathFilterOption (2.7.0 新增)](#pmpathfilteroption-270-新增)\n    * [获取资源 (`AssetEntity`)](#获取资源-assetentity)\n      * [通过 `AssetPathEntity` 获取](#通过-assetpathentity-获取)\n      * [通过 `PhotoManager` 方法 (2.6.0+) 获取](#通过-photomanager-方法-260-获取)\n      * [通过 ID 获取](#通过-id-获取)\n      * [通过原始数据获取](#通过原始数据获取)\n      * [通过 iCloud 获取](#通过-icloud-获取)\n      * [取消加载 (3.8.0 新增)](#取消加载-380-新增)\n      * [展示资源](#展示资源)\n      * [获取文件](#获取文件)\n      * [获取「实况照片」](#获取实况照片)\n        * [仅过滤「实况照片」](#仅过滤实况照片)\n        * [获取「实况照片」的视频](#获取实况照片的视频)\n      * [包含隐藏资源（仅 iOS 平台有效）](#包含隐藏资源仅-ios-平台有效)\n        * [与 FilterOptionGroup 一起使用](#与-filteroptiongroup-一起使用)\n        * [与 CustomFilter 一起使用](#与-customfilter-一起使用)\n      * [限制](#限制)\n        * [Android 10 媒体位置权限](#android-10-媒体位置权限)\n        * [原始数据的使用](#原始数据的使用)\n        * [iOS 上文件检索时间过长](#ios-上文件检索时间过长)\n    * [资源变动的通知回调](#资源变动的通知回调)\n  * [过滤资源](#过滤资源)\n    * [FilterOptionGroup](#filteroptiongroup)\n    * [CustomFilter](#customfilter)\n      * [更高级的 CustomFilter](#更高级的-customfilter)\n      * [相关类定义解释](#相关类定义解释)\n  * [缓存机制](#缓存机制)\n    * [Android 缓存](#android-缓存)\n    * [iOS 缓存](#ios-缓存)\n    * [清除缓存](#清除缓存)\n  * [原生额外配置](#原生额外配置)\n    * [Android 额外配置](#android-额外配置)\n      * [Glide 相关问题](#glide-相关问题)\n      * [Android 14 (API level 34) 额外配置](#android-14-api-level-34-额外配置)\n      * [Android 13 (API level 33) 额外配置](#android-13-api-level-33-额外配置)\n    * [iOS 额外配置](#ios-额外配置)\n      * [配置系统相册名称的国际化](#配置系统相册名称的国际化)\n    * [实验性功能](#实验性功能)\n      * [预加载缩略图](#预加载缩略图)\n      * [删除资源](#删除资源)\n      * [复制资源](#复制资源)\n      * [仅适用于 Android 的功能](#仅适用于-android-的功能)\n        * [将资源移动到另一个相册](#将资源移动到另一个相册)\n        * [将资源移动到废纸篓](#将资源移动到废纸篓)\n        * [移除所有不存在的资源](#移除所有不存在的资源)\n      * [适用于 iOS 或 macOS 的功能](#适用于-ios-或-macos-的功能)\n        * [创建一个文件夹](#创建一个文件夹)\n        * [创建一个相簿](#创建一个相簿)\n        * [从相册中移除资源](#从相册中移除资源)\n        * [删除 `AssetPathEntity`](#删除-assetpathentity)\n      * [适用于 OpenHarmony 的功能](#适用于-openharmony-的功能)\n\u003c!-- TOC --\u003e\n\n\u003c/details\u003e\n\n## 常见问题\n\n你可以在 [GitHub issues][] 上搜索到经常遇到的问题，比如构建错误，运行时异常等等。\n\n## 使用前准备\n\n### 添加依赖\n\n有两种方式可以把依赖添加到你的项目中:\n\n- **(推荐)** 运行  `flutter pub add photo_manager`.\n- 或者直接添加到项目的 `pubspec.yaml` 中的 `dependencies` 部分:\n\n```yaml\ndependencies:\n  photo_manager: $latest_version\n```\n\n目前最新的版本是:\n[![pub package](https://img.shields.io/pub/v/photo_manager.svg)][pub package]\n\n### 导入到你的项目中：\n\n```dart\nimport 'package:photo_manager/photo_manager.dart';\n```\n\n### 原生平台的配置\n\n最低的平台版本:\n**Android API 16, iOS 9.0, macOS 10.15**.\n\n- Android：[Android 配置准备](#android-配置准备).\n- iOS：[iOS 配置准备](#ios-配置准备).\n- macOS：与 iOS 几乎一致。\n\n#### Android 配置准备\n\n##### Kotlin, Gradle, AGP\n\n该插件使用 **Kotlin `1.7.22`** 来构建。\n如果你的项目使用了低于此版本的 Kotlin/Gradle/AGP，请升级到大于或等于指定版本。\n\n更具体的做法:\n\n- 更新你的 Gradle version (`gradle-wrapper.properties`)\n  到 `7.5.1` 或者最新版本。\n- 更新你的 Kotlin version (`ext.kotlin_version`)\n  到 `1.7.22` 或者最新版本。\n- 更新你的 AGP version (`com.android.tools.build:gradle`)\n  或者 `7.2.2` 或者最新版本。\n\n##### Android 10 (Q, 29)\n\n_如果你没有设置 `compileSdkVersion` 或 `targetSdkVersion` 为 `29`，你可以跳过本节。_\n\nAndroid 10 引入了 **Scoped Storage**，导致原始资源文件不能通过其文件路径直接访问。\n\n如果你的 `compileSdkVersion` 或 `targetSdkVersion` 为 29,\n为了能够成功获取到媒体资源，你可以考虑通过在 `AndroidManifest.xml`\n中添加 `android:requestLegacyExternalStorage=\"true\"`，如下所示:\n\n```xml\n\u003cmanifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.fluttercandies.photo_manager_example\"\u003e\n\n    \u003capplication\n        android:label=\"photo_manager_example\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:requestLegacyExternalStorage=\"true\"\u003e\n    \u003c/application\u003e\n\u003c/manifest\u003e\n```\n\n**注意: 这样设置的应用无法上架 Google Play。**\n\n这不是必须的，插件缓存文件的时候还是可以正常工作的。\n但是开发者需要主动清理缓存，最佳实践是启动应用时调用\n`PhotoManager.clearFileCache` 清理缓存文件。\n\n##### Glide\n\n本插件使用 [Glide][] 在 Android 平台上创建缩略图。\n\n如果你发现 [Glide][] 出现了一些警告日志，说明主项目需要实现 `AppGlideModule`。\n请查看 [Generated API][] 的相关文档说明。\n\n#### iOS 配置准备\n\n添加 `NSPhotoLibraryUsageDescription` 到你的项目的 `ios/Runner/Info.plist` 中：\n\n```plist\n\u003ckey\u003eNSPhotoLibraryUsageDescription\u003c/key\u003e\n\u003cstring\u003eIn order to access your photo library\u003c/string\u003e\n```\n\n在 iOS 11 或者更高版本中，如果你只需要请求相册的写入权限，\n仅需要添加 `NSPhotoLibraryAddUsageDescription` 到你的项目的 `ios/Runner/Info.plist`。\n\n![permissions in Xcode](https://raw.githubusercontent.com/CaiJingLong/some_asset/master/flutter_photo2.png)\n\n## 使用方法\n\n### 请求权限\n\n大部分的 API 只在获取到权限后才能正常使用。\n\n```dart\nfinal PermissionState ps = await PhotoManager.requestPermissionExtend();\nif (ps.isAuth) {\n  // 已获取到权限\n} else if (ps.hasAccess) {\n  // 已获取到权限（哪怕只是有限的访问权限）。\n  // iOS Android 目前都已经有了部分权限的概念。\n} else {\n  // 权限受限制（iOS）或者被拒绝，使用 `==` 能够更准确的判断是受限还是拒绝。\n  // 你可以使用 `PhotoManager.openSetting()` 打开系统设置页面进行进一步的逻辑定制。\n}\n```\n\n如果你确定你的应用已经授予了权限，你也可以忽略权限的检查：\n```dart\nPhotoManager.setIgnorePermissionCheck(true);\n```\n\n对于一些后台操作（应用未启动等）而言，忽略检查是比较合适的做法。\n\n同时你还可以调用 `PhotoManager.getPermissionState` 来获取权限状态。\n请确保调用该方法使用的权限设置与调用其他方法的权限设置相同。\n\n#### 受限的资源权限\n\n##### iOS 受限的资源权限\n\niOS14 引入了部分资源限制的权限 (`PermissionState.limited`)。\n`PhotoManager.requestPermissionExtend()` 会返回当前的权限状态 `PermissionState`。\n详情请参阅 [PHAuthorizationStatus][]。\n\n如果你想要重新选择在应用里能够读取到的资源，你可以使用 `PhotoManager.presentLimited()` 重新选择资源，\n这个方法对于 iOS 14 以上的版本生效。\n\n如果你想要禁止每次应用重新启动后访问媒体时自动弹出提示，\n你可以将 `Info.plist` 的 `Prevent limited photos access alert` 设置为 `YES`\n（或者像下面一样手动编写）：\n\n```plist\n\u003ckey\u003ePHPhotoLibraryPreventAutomaticLimitedAccessAlert\u003c/key\u003e\n\u003ctrue/\u003e\n```\n\n##### Android 受限的资源权限\n\n与 iOS 类似，Android 14 (API 34) 中也引入了这个概念。\n它们在行为上略有不同（基于模拟器）：\n在 Android 中一旦授予某个资源的访问权限，就无法撤销，\n即使再次使用 `presentLimited` 时不选中也不会撤销对它的访问权限。\n\n### 获取相簿或图集 (`AssetPathEntity`)\n\n相簿或者图集以抽象类 [`AssetPathEntity`][] 的形式呈现，\n在 Android 中它表示为具有相同 `bucketId` 的 `MediaStore` 记录的集合，\n在 iOS/macOS 中则是 `PHAssetCollection` 的记录。\n\n获取所有相册：\n```dart\nfinal List\u003cAssetPathEntity\u003e paths = await PhotoManager.getAssetPathList();\n```\n\n详情请参阅 [`getAssetPathList`][]。\n\n#### `getAssetPathList` 方法的参数\n\n| 参数名              | 说明                                                                           | 默认值                 |\n|:-----------------|------------------------------------------------------------------------------|---------------------|\n| hasAll           | 如果你需要一个包含所有资源（AssetEntity) 的 PathEntity ，传入 true                             | true                |\n| onlyAll          | 如果你只需要一个包含所有资源的，传入true                                                       | false               |\n| type             | 资源文件的类型（视频、图片、音频）                                                            | RequestType.common  |\n| filterOption     | 用于筛选 AssetEntity，详情请参阅 [过滤资源](#过滤资源)                                         | FilterOptionGroup() |\n| pathFilterOption | 只对 iOS 和 macOS生效，对应原生中的相册类型，详情请参阅 [PMPathFilterOption](#pmpathfilteroption)。 | 默认为包含所有             |\n\n#### PMPathFilterOption (2.7.0 新增)\n\n\u003e [!NOTE]\n\u003e 当前仅在 iOS 和 macOS 上可用.\n\n```dart\nfinal List\u003cPMDarwinAssetCollectionType\u003e pathTypeList = []; // 配置为你需要的类型\nfinal List\u003cPMDarwinAssetCollectionSubtype\u003e pathSubTypeList = []; // 配置为你需要的子类型\nfinal darwinPathFilterOption = PMDarwinPathFilter(\n  type: pathTypeList,\n  subType: pathSubTypeList,\n);\nPMPathFilter pathFilter = PMPathFilter();\n```\n\n`PMDarwinAssetCollectionType`的枚举值一一对应 [PHAssetCollectionType | 苹果官网文档](https://developer.apple.com/documentation/photokit/phassetcollectiontype?language=objc).\n\n`PMDarwinAssetCollectionSubtype` 的枚举值一一对应 [PHAssetCollectionSubType | 苹果官网文档](https://developer.apple.com/documentation/photokit/phassetcollectionsubtype?language=objc).\n\n### 获取资源 (`AssetEntity`)\n\n资源（图片/视频/音频）以 [`AssetEntity`][] 的方式呈现，\n它抽象了原生中关于媒体对象的一系列属性和方法。\n在 Android 中表示 `MediaStore` 记录的其中一些字段的集合，\n在 iOS/macOS 则是 `PHAsset` 的记录。\n\n#### 通过 `AssetPathEntity` 获取\n\n你可以通过 [分页方法][`getAssetListPaged`] 获取：\n```dart\nfinal List\u003cAssetEntity\u003e entities = await path.getAssetListPaged(page: 0, size: 80);\n```\n\n也可以通过 [范围索引方法][`getAssetListRange`] 获取：\n```dart\nfinal List\u003cAssetEntity\u003e entities = await path.getAssetListRange(start: 0, end: 80);\n```\n\n#### 通过 `PhotoManager` 方法 (2.6.0+) 获取\n\n首先你需要获取资源的数量：\n```dart\nfinal int count = await PhotoManager.getAssetCount();\n```\n\n然后通过 [分页方法][`PhotoManager.getAssetListPaged`] 获取：\n\n```dart\nfinal List\u003cAssetEntity\u003e entities = await PhotoManager.getAssetListPaged(page: 0, pageCount: 80);\n```\n\n也通过 [范围索引方法][`PhotoManager.getAssetListRange`] 获取：\n```dart\nfinal List\u003cAssetEntity\u003e entities = await PhotoManager.getAssetListRange(start: 0, end: 80);\n```\n\n**注意：** `page` 和`start` 都从 **0** 开始。\n\n#### 通过 ID 获取\n\nID 在不同平台代表：\n\n- Android 平台 `MediaStore` 的 `_id` 字段；\n- iOS/macOS 平台 `PHAsset` 的 `localIdentifier` 字段。\n\n如果你想要实现持久化选择的相关功能，你需要存储资源的 ID，\n并在之后的使用中通过 [`AssetEntity.fromId`][]` 来重新持有资源对象。\n```dart\nfinal AssetEntity? asset = await AssetEntity.fromId(id);\n```\n\n请留意资源可能访问受限，或随时被删除，所以结果可能为空。\n\n#### 通过原始数据获取\n\n你可以从原始数据或文件（如下载的图像、录制的视频等）创建 `AssetEntity`。\n创建的 `AssetEntity` 将储存到设备的图库中。\n```dart\nfinal Uint8List rawData = yourRawData;\n\n// 将 `Uint8List` 保存为一张图片。\nfinal AssetEntity? entity = await PhotoManager.editor.saveImage(\n  rawData,\n  title: 'write_your_own_title.jpg', // 可能影响 EXIF 信息的读取\n);\n\n// 通过路径来保存一张已存在的图片。\nfinal AssetEntity? imageEntityWithPath = await PhotoManager.editor.saveImageWithPath(\n  path, // 使用源文件的绝对路径来保存，与复制类似。\n  title: 'same_as_above.jpg',\n);\n\n// 通过文件来保存视频。\nfinal File videoFile = File('path/to/your/video.mp4');\nfinal AssetEntity? videoEntity = await PhotoManager.editor.saveVideo(\n  videoFile, // 可以检查文件是否存在以获得更好的测试覆盖率。\n  title: 'write_your_own_title.mp4',\n);\n\n// [仅 iOS] 通过图片和视频来保存一张实况照片。\n// 仅在图片和视频文件为同一张实况照片时才能生效。\nfinal File imageFile = File('path/to/your/livephoto.heic');\nfinal File videoFile = File('path/to/your/livevideo.mp4');\nfinal AssetEntity? entity = await PhotoManager.editor.darwin.saveLivePhoto(\n  imageFile: imageFile,\n  videoFile: videoFile,\n  title: 'write_your_own_title.heic',\n);\n```\n\n请留意资源可能访问受限，或随时被删除，所以结果可能为空。\n\niOS 和 macOS 可能会对资源保存附加额外的限制，目前仅部分资源类型可以保存为图库资源。\n该限制由 [`AVFileType`][] 定义，当你在保存时看到\n`PHPhotosErrorDomain Code=3302` (或者 `330x`) 错误时，\n确保你的文件类型受支持。\n\n#### 通过 iCloud 获取\n\niOS 为了节省磁盘空间，可能将资源仅保存在 iCloud 上。\n从 iCloud 检索资源文件时，速度会取决于网络状况，可能非常缓慢，使用户感到焦虑。\n你可以使用 `PMProgressHandler` 在加载文件时提示用户当前的进度。\n\n推荐参考的实践是 `wechat_asset_picker` 中的\n[`LocallyAvailableBuilder`][]，它会在下载文件时提供进度的展示。\n\n有数个方法可以结合 `PMProgressHandler` 来提供进度反馈：\n* AssetEntity.thumbnailDataWithSize\n* AssetEntity.thumbnailDataWithOption\n* AssetEntity.getMediaUrl\n* AssetEntity.loadFile\n* PhotoManager.plugin.getOriginBytes\n\niCloud 文件只能在设备上的 Apple ID 正常登录时获取。\n当账号要求重新输入密码验证时，未缓存在本地的 iCloud 文件将无法访问，\n此时相关方法会抛出 `CloudPhotoLibraryErrorDomain` 错误。\n\n#### 取消加载 (3.8.0 新增)\n\n\u003e [!NOTE]\n\u003e 当前仅在 iOS 和 macOS 上可用.\n\n上述的 `AssetEntity` 方法均添加了 `cancelToken` 参数，\n可以用于取消加载过程。\n\n其他方法如果也添加了 `cancelToken` 参数，同样可以用于取消加载过程。\n\n```dart\nfinal PMCancelToken cancelToken = PMCancelToken();\nfinal File? file = await yourAssetEntity.loadFile(cancelToken: cancelToken);\nawait cancelToken.cancel();\n```\n\n`PhotoManager` 也有一个方法可以取消所有加载：\n\n```dart\nawait PhotoManager.cancelAllRequest();\n```\n\n#### 展示资源\n\n从 v3.0.0 开始，插件不再提供任何 UI 组件。\n`AssetEntityImage` 和 `AssetEntityImageProvider` 在\n[`photo_manager_image_provider`][photo_manager_image_provider]\n插件中提供。\n\n新的插件提供 `AssetEntityImage` widget 和\n`AssetEntityImageProvider` 来处理资源的展示：\n\n```dart\nimport 'package:photo_manager_image_provider/photo_manager_image_provider.dart';\n\nfinal Widget image = AssetEntityImage(\n  yourAssetEntity,\n  isOriginal: false,\n  thumbnailSize: const ThumbnailSize.square(200),\n  thumbnailFormat: ThumbnailFormat.jpeg,\n);\n\nfinal Widget imageFromProvider = Image(\n  image: AssetEntityImageProvider(\n    yourAssetEntity,\n    isOriginal: false,\n    thumbnailSize: const ThumbnailSize.square(200),\n    thumbnailFormat: ThumbnailFormat.jpeg,\n  ),\n);\n```\n\n#### 获取文件\n\n`AssetEntity` 包含数个获取文件的 getter 和方法：\n* `.file`\n* `.fileWithSubtype`\n* `.originFile`\n* `.originFileWithSubtype`\n* `.loadFile`\n\n这些方法会获取与该资源关联的不同类型的文件。阅读它们的文档以了解具体的用途。\n\n另外，你可以使用 `PhotoManager.plugin.getFullFile` 来获取文件，该方法有完整的获取参数。\n\n#### 获取「实况照片」\n\n该插件支持获取和过滤 iOS 上的实况照片。\n\n##### 仅过滤「实况照片」\n\n只在过滤图片的时候支持过滤「实况照片」：\n```dart\nfinal List\u003cAssetPathEntity\u003e paths = await PhotoManager.getAssetPathList(\n  type: RequestType.image,\n  filterOption: FilterOptionGroup(onlyLivePhotos: true),\n);\n```\n\n或者你也可以使用 `CustomSqlFilter` 来获取「实况照片」：\n\n```dart\nfinal List\u003cAssetPathEntity\u003e paths = await PhotoManager.getAssetPathList(\n  type: RequestType.image,\n  filterOption: CustomFilter.sql(\n  where: '${CustomColumns.base.mediaType} = 1'\n      ' AND '\n      '${CustomColumns.darwin.mediaSubtypes} \u0026 (1 \u003c\u003c 3) = (1 \u003c\u003c 3)',\n  ),\n);\n```\n\n##### 获取「实况照片」的视频\n\n```dart\nfinal AssetEntity entity = livePhotoEntity;\n\n// 播放实况照片的视频\nfinal String? mediaUrl = await entity.getMediaUrl();\n\n// 获取缩略图和视频\nfinal File? imageFile = await entity.file;\nfinal File? videoFile = await entity.fileWithSubtype;\n\n// 获取原图和原视频\nfinal File? originImageFile = await entity.originFile;\nfinal File? originVideoFile = await entity.originFileWithSubtype;\n\n// 将实况照片的视频从 mov 转换为 mp4\nfinal File? convertedFile = await entity.loadFile(\n  isOriginal: true,\n  withSubtye: true,\n  darwinFileType: PMDarwinAVFileType.mp4,\n);\n```\n\n#### 包含隐藏资源（仅 iOS 平台有效）\n\n在 iOS 16 及以上版本中，用户可以要求验证才能查看隐藏相册，并且该设置默认为开启。在标准查询中，系统不会返回隐藏的资源。\n\n本插件现在支持通过 `includeHiddenAssets` 选项在 iOS 平台上包含隐藏资源：\n\n##### 与 FilterOptionGroup 一起使用\n\n```dart\nfinal FilterOptionGroup filterOption = FilterOptionGroup(\n  // 其他选项...\n  includeHiddenAssets: true, // 设置为 true 以包含隐藏资源\n);\n\n// 在获取资源时使用过滤选项\nfinal List\u003cAssetPathEntity\u003e paths = await PhotoManager.getAssetPathList(\n  filterOption: filterOption,\n);\n```\n\n##### 与 CustomFilter 一起使用\n\n```dart\nfinal filter = CustomFilter.sql(\n  where: '${CustomColumns.base.width} \u003e 100',\n  // 其他选项...\n);\nfilter.includeHiddenAssets = true; // 设置为 true 以包含隐藏资源\n\n// 在获取资源时使用过滤器\nfinal int count = await PhotoManager.getAssetCount(filterOption: filter);\n```\n\n注意：此选项仅在 iOS 平台上生效。在其他平台上，它将被忽略。如果用户在 iOS 16+ 上为隐藏相册启用了验证（默认开启），即使设置了 includeHiddenAssets 为 true，第三方应用也无法访问隐藏的资源。\n\n#### 限制\n\n##### Android 10 媒体位置权限\n\n在 Android 10 版本中获取带有位置信息和 EXIF 元数据的原始数据时，必须授予媒体位置权限。\n若需要获取，请将 `ACCESS_MEDIA_LOCATION` 权限添加到清单中。\n\n##### 原始数据的使用\n\n`originFile` 和 `originBytes` 的 getter 会返回资源的原始数据。\n然而在 Flutter 中，某些情况的原始数据是无法使用的。以下是一些常见的情况：\n\n- 在不同平台和版本中，HEIC 文件并未被完全支持。\n  我们建议你上传 JPEG 文件（HEIC 图片的 `.file`），\n  以保持多个平台之间的一致行为。\n  查看 [flutter/flutter#20522][] 了解更多细节。\n- 视频将仅以原始格式获取，而不是组合过的格式，\n  这可能会在播放视频时导致某些行为的差异。\n\n##### iOS 上文件检索时间过长\n\n该插件中有几个针对 `AssetEntity` 的 I/O 方法：\n\n- 所有名称带有 `file` 的方法.\n- `AssetEntity.originBytes`.\n\n在 iOS 上，文件的检索和缓存受到沙盒机制的限制。\n能获取到 `PHAsset` 并不意味着该资源位于设备上。\n一般来说，`PHAsset` 会有三种状态：\n\n- `isLocallyAvailable` 等于 `true`, **并且已经缓存**：可以获取。\n- `isLocallyAvailable` 等于 `true`, **但没有缓存**：当你调用 I/O 方法时，资源需要缓存在沙盒中才可以获取。\n- `isLocallyAvailable` 等于 `false`，通常意味着资源仅保存在 iCloud 上，或者某些视频尚未导出过。\n  在这种情况下，最好使用 `PMProgressHandler` 提供响应式的用户界面。\n\n### 资源变动的通知回调\n\n插件会从原生平台广播资源变更的事件，但是在不同的平台和系统版本之间，事件携带的内容并不相同。\n你可以参考 [相关日志](log) 了解各个版本和平台之间的事件日志。\n\n要为这些事件注册回调，请使用 `PhotoManager.addChangeCallback` 添加回调，\n并使用 `PhotoManager.removeChangeCallback` 移除回调，\n与 `addListener` 和 `removeListener` 方法相似。\n\n在添加/移除回调之后，你可以调用 [`PhotoManager.startChangeNotify` 方法启用通知，\n以及 `PhotoManager.stopChangeNotify` 方法停止通知。\n\n```dart\nimport 'package:flutter/services.dart';\n\nvoid changeNotify(MethodCall call) {\n  // 你的自定义回调。\n}\n\n/// 注册你的回调方法。\nPhotoManager.addChangeCallback(changeNotify);\n\n/// 启用事件通知订阅。\nPhotoManager.startChangeNotify();\n\n/// 移除你的回调方法。\nPhotoManager.removeChangeCallback(changeNotify);\n\n/// 取消事件通知订阅。\nPhotoManager.stopChangeNotify();\n```\n\n## 过滤资源\n\n插件包含对资源过滤筛选的支持。\n以下的方法包含 `filterOption` 参数，用于指定资源过滤的条件。\n- PhotoManager\n  - getAssetPathList（可以通过 `AssetPathEntity.filterOption` 获取）\n  - getAssetCount\n  - getAssetListRange\n  - getAssetListPaged\n- AssetPathEntity\n  - 构造（不推荐直接使用）\n  - fromId\n  - obtainPathFromProperties（不推荐直接使用）\n\n插件支持两种形式的资源筛选：\n- [FilterOptionGroup](#FilterOptionGroup)\n- [CustomFilter](#CustomFilter)\n\n### FilterOptionGroup\n\n`FilterOptionGroup` 是 2.6.0 版本前唯一支持的筛选器实现。\n\n```dart\nfinal FilterOptionGroup filterOption = FilterOptionGroup(\n  imageOption: FilterOption(\n    sizeConstraint: SizeConstraint(\n      maxWidth: 10000,\n      maxHeight: 10000,\n      minWidth: 100,\n      minHeight: 100,\n      ignoreSize: false,\n    ),\n  ),\n  videoOption: FilterOption(\n    durationConstraint: DurationConstraint(\n      min: Duration(seconds: 1),\n      max: Duration(seconds: 30),\n      allowNullable: false,\n    ),\n  ),\n  createTimeCondition: DateTimeCondition(\n    min: DateTime(2020, 1, 1),\n    max: DateTime(2020, 12, 31),\n  ),\n  orders: [\n    OrderOption(\n      type: OrderOptionType.createDate,\n      asc: false,\n    ),\n  ],\n  /// 包含隐藏资源（仅 iOS 平台有效）\n  includeHiddenAssets: false,\n  /// 其他选项\n);\n```\n\n### CustomFilter\n\n**注意：** `CustomFilter` 自 v2.6.0 引入。由于其存在时间较短，无法保证其稳定性。\n如果在使用时遇到相关问题，请按照模板提交 issue。\n\n`CustomFilter` 针对不同平台提供了更加灵活的筛选条件。\n其使用方法更像平台本身的处理方法，即类 SQL 的筛选方式。\n\nSQL 筛选的字段名称在不同平台上是不一致的，\n在使用时请注意区分 `CustomColumns.base`、`CustomColumns.android` 以及 `CustomColumns.darwin`\n来获取正确的字段名称。\n\n构造一个 `CustomFilter` 的例子：\n```dart\nCustomFilter createFilter() {\n  final filter = CustomFilter.sql(\n    where: '${CustomColumns.base.width} \u003e 100 AND ${CustomColumns.base.height} \u003e 200',\n    orderBy: [OrderByItem.desc(CustomColumns.base.createDate)],\n  );\n  // 包含隐藏资源（仅 iOS 平台有效）\n  filter.includeHiddenAssets = true;\n  return filter;\n}\n```\n\n#### 更高级的 CustomFilter\n\n`AdvancedCustomFilter` 继承自 `CustomFilter`，\n可以通过 builder 方式创建一个筛选器。\n\n```dart\nCustomFilter createFilter() {\n  final group = WhereConditionGroup()\n      .and(\n        ColumnWhereCondition(\n          column: CustomColumns.base.width,\n          value: '100',\n          operator: '\u003e',\n        ),\n      )\n      .or(\n        ColumnWhereCondition(\n          column: CustomColumns.base.height,\n          value: '200',\n          operator: '\u003e',\n        ),\n      );\n  final filter = AdvancedCustomFilter()\n      .addWhereCondition(group)\n      .addOrderBy(column: CustomColumns.base.createDate, isAsc: false);\n  return filter;\n}\n```\n\n#### 相关类定义解释\n\n- `CustomFilter`：自定义筛选器的基类。\n- `SqlCustomFilter`：类 SQL 的筛选器。\n- `AdvancedCustomFilter`：构建自定义选项的筛选器。\n  - `OrderByItem`：实现排序的类，功能类似于 ORDER BY。\n  - `WhereConditionItem`：条件筛选的抽象类，功能类似于 WHERE。\n    - `WhereConditionGroup`：筛选条件组，将一组条件合并在同一个条件组。\n    - `TextWhereCondition`：字符串筛选条件，在传递时不会检查是否有效。\n    - `ColumnWhereCondition`：字段名筛选条件，在传递时会检查字段名是否有效。\n    - `DateColumnWhereCondition`：日期筛选条件，由于 iOS/macOS 上的日期格式不同，该条件可以帮助处理这些差异。\n- `CustomColumns`：不同平台的字段名。\n  - `base`：适用于各个平台通用的字段名，但在 iOS 上 \"id\" 字段无效，甚至可能会导致错误。它只在 Android 上有效。\n  - `android`：适用于 Android 的字段名。\n  - `darwin`：适用于 iOS/macOS 的字段名。\n\n下图为自定义筛选器作用的流程图：\n![flow_chart](flow_chart/advance_custom_filter.png)\n\n## 缓存机制\n\n### Android 缓存\n\n由于 Android 10 限制了直接访问资源路径的能力，\n因此图像缓存将在 I/O 处理过程中生成。\n更具体地说，当调用 `file`，`originFile` 或任何 I/O 操作时，\n插件将保存一个文件到缓存文件夹以供进一步使用。\n\n幸运的是，在 Android 11 及以上版本中，可以再次直接获取资源路径，\n在 Android 10 中，你仍然可以使用 `requestLegacyExternalStorage`\n访问存储中的文件而不缓存它们。\n有关如何添加属性，请参见 [Android 10 (Q, 29)](#android-10-q-29)。\n该属性不是必需的。\n\n### iOS 缓存\n\niOS 没有直接提供 API 来访问相册资源的原始文件。\n因此，当调用 `file`、`originFile` 或相关的文件操作时，\n将在当前应用程序的沙盒中生成对应的缓存文件。\n\n如果在你的用例中占用磁盘空间很敏感，\n那么你可以在使用完成后删除它（仅适用于 iOS）。\n\n```dart\nimport 'dart:io';\n\nFuture\u003cvoid\u003e useEntity(AssetEntity entity) async {\n  File? file;\n  try {\n    file = await entity.file;\n    await handleFile(file!); // 处理获取的文件\n  } finally {\n    if (Platform.isIOS) {\n      file?.deleteSync(); // 处理完成后删除\n    }\n  }\n}\n```\n\n### 清除缓存\n\n你可以使用 `PhotoManager.clearFileCache` 方法来清除插件生成的所有缓存。\n缓存的生成取决于不同平台、类型和分辨率等情况。\n\n| 平台      | 缩略图 | 文件 / 原始文件        |\n|---------|-----|------------------|\n| Android | 生成  | 生成 (Android 10+) |\n| iOS     | 不生成 | 生成               |\n\n## 原生额外配置\n\n### Android 额外配置\n\n#### Glide 相关问题\n\n如果你的项目存在 Glide 的版本冲突问题，\n那么你需要编辑 `android/build.gradle` 文件：\n\n```gradle\nrootProject.allprojects {\n    subprojects {\n        project.configurations.all {\n            resolutionStrategy.eachDependency { details -\u003e\n                if (details.requested.group == 'com.github.bumptech.glide'\n                        \u0026\u0026 details.requested.name.contains('glide')) {\n                    details.useVersion '4.14.2'\n                }\n            }\n        }\n    }\n}\n```\n\n如果你想了解如何同时使用 ProGuard 和 Glide，请参阅\n[ProGuard for Glide](https://github.com/bumptech/glide#proguard)。\n\n#### Android 14 (API level 34) 额外配置\n\n当你的应用在 API 34 (Android 14) 的设备上运行时，\n就算你的 `targetSdkVersion` 和 `compileSdkVersion` 不是 `34`，\n你也需要在清单文件中添加以下权限配置：\n\n```xml\n\u003cmanifest\u003e\n   \u003cuses-permission android:name=\"android.permission.READ_MEDIA_VISUAL_USER_SELECTED\" /\u003e \u003c!-- 如果需要提供可选的资源的功能 --\u003e\n\u003c/manifest\u003e\n```\n\n#### Android 13 (API level 33) 额外配置\n\n当你的应用在 API 33 (Android 13) 的设备上运行时，\n就算你的 `targetSdkVersion` 和 `compileSdkVersion` 不是 `33`，\n你也需要在清单文件中添加以下权限配置：\n\n\u003e 注意：`READ_MEDIA_IMAGES` 和 `READ_MEDIA_VIDEO` 无论在请求图片还是请求视频时都需要。\n\n```xml\n\u003cmanifest\u003e\n    \u003cuses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" /\u003e \u003c!-- 如果需要读取图片或视频 --\u003e\n    \u003cuses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" /\u003e \u003c!-- 如果需要读取视频或图片 --\u003e\n    \u003cuses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" /\u003e \u003c!-- 如果需要读取音频 --\u003e\n\u003c/manifest\u003e\n```\n\n### iOS 额外配置\n\n#### 配置系统相册名称的国际化\n\n默认情况下，无论设备上设置了什么语言，iOS 都只会以英语检索系统相册的名称。\n要更改默认语言，请按照以下步骤操作：\n\n- 用 Xcode 打开你的 iOS 项目 (Runner.xcworkspace)\n![Edit localizations in Xcode 1](https://raw.githubusercontent.com/CaiJingLong/some_asset/master/iosFlutterProjectEditinginXcode.png)\n\n- 选择你项目的 “Runner”，在本地化表格中单击加号图标。\n![Edit localizations in Xcode 2](https://raw.githubusercontent.com/CaiJingLong/some_asset/master/iosFlutterAddLocalization.png)\n\n- 选择你想要检索本地化的语言。\n- 在不进行任何修改的情况下验证弹出屏幕。\n- 重新构建你的 Flutter 项目。\n\n现在系统相册的名称应该能够以对应的语言显示。\n\n**注意**: 本地化相册名称不代表自定义。\n\n### 实验性功能\n\n**警告**: 此处的功能不能保证在所有平台和系统版本下完全可用，\n因为它们涉及到数据修改。\n它们可能在任何版本中随时被修改或删除。\n\n某些 API 将对数据进行不可逆的修改和删除。\n**在使用这些功能时，请谨慎操作，并最好实现先行测试**。\n\n#### 预加载缩略图\n\n你可以使用 `PhotoCachingManager.requestCacheAssets`\n或 `PhotoCachingManager.requestCacheAssetsWithIds` 方法\n以特定的缩略图选项来加载部分资源的缩略图。\n\n```dart\nPhotoCachingManager().requestCacheAssets(assets: assets, option: option);\n```\n\n你也可以通过调用\n`PhotoCachingManager().cancelCacheRequest`\n方法随时停止预加载。\n\n通常在 app 预览资源时，会使用缩略图进行展示。\n但有时我们希望预加载资源以使其显示更快。\n\n`PhotoCachingManager` 在 iOS 上使用的是 [PHCachingImageManager][]，\n在 Android 上使用 Glide 的文件缓存。\n\n#### 删除资源\n\n**此方法将从你的图库中完全删除资源，请谨慎使用。**\n\n```dart\n// 调用方法会返回被删除的资源，如果全部失败会返回空列表。\nfinal List\u003cString\u003e result = await PhotoManager.editor.deleteWithIds(\n  \u003cString\u003e[entity.id],\n);\n```\n\n删除后，你可以调用 `refreshPathProperties` 方法刷新相应的\n`AssetPathEntity` 以便更新字段。\n\n#### 复制资源\n\n你可以使用 `copyAssetToPath` 方法将资源 “复制” 到目标 `AssetPathEntity` 中：\n\n```dart\n// 确保 anotherPathEntity 对于当前 app 而言可以访问。\nfinal AssetPathEntity anotherPathEntity = anotherAccessiblePath;\nfinal AssetEntity entity = yourEntity;\nfinal AssetEntity? newEntity = await PhotoManager.editor.copyAssetToPath(\n  asset: entity,\n  pathEntity: anotherPathEntity,\n); // 如果 anotherPathEntity 无法访问，结果会返回 null。\n```\n\n“复制” 在 Android 和 iOS 上有不同的含义：\n\n- 对于 Android，它会插入源资源的副本：\n  - 在 SDK \u003c= 28 上，该方法将复制大部分来源信息。\n  - 在 SDK \u003e= 29 上，某些字段无法在插入期间修改，如 [MediaColumns.RELATIVE_PATH][].\n- 对于 iOS，它会创建一个快捷方式，而不是创建一个新的资源。\n  - 某些相册是智能相册，它们的内容由系统自动管理，不能手动插入资源。\n\n（对于 Android 30+，由于系统限制，此功能当前被屏蔽。）\n\n#### 仅适用于 Android 的功能\n\n##### 将资源移动到另一个相册\n\n```dart\n// 确保 accessiblePath 对于当前 app 而言可以访问。\nfinal AssetPathEntity pathEntity = accessiblePath;\nfinal AssetEntity entity = yourEntity;\nawait PhotoManager.editor.android.moveAssetToAnother(\n  entity: entity,\n  target: pathEntity,\n);\n```\n\n（对于 Android 30+，由于系统限制，此功能当前被屏蔽。）\n\n##### 将资源移动到废纸篓\n\n```dart\nawait PhotoManager.editor.android.moveToTrash(list);\n```\n\n这个方法用于将资源移动到废纸篓，它仅支持安卓 API 30+，低于 30 的 API 会抛出异常。\n\n##### 移除所有不存在的资源\n\n这将删除所有本地不存在的相册条目。\n安卓的 `MediaStore` 中的记录对应的文件可能会被其他的 app 或文件管理器删除。\n这些异常行为通常是由文件管理器、辅助工具或 adb 工具造成的。\n此操作很消耗资源，请不要重复调用。\n\n```dart\nawait PhotoManager.editor.android.removeAllNoExistsAsset();\n```\n\n某些系统会在每个资源删除时分别弹出确认对话框，这是无法避免的。\n请确认你需要调用该方法，并且你的客户接受反复弹窗确认。\n\n#### 适用于 iOS 或 macOS 的功能\n\n##### 创建一个文件夹\n\n```dart\nPhotoManager.editor.darwin.createFolder(\n  name,\n  parent: parent, // 应为 null、根目录或者其他可访问的文件夹\n);\n```\n\n##### 创建一个相簿\n\n```dart\nPhotoManager.editor.darwin.createAlbum(\n  name,\n  parent: parent, // 应为 null、根目录或者其他可访问的文件夹\n);\n```\n\n##### 从相册中移除资源\n\n从特定相册中移除资源。\n该移除不会从设备中删除，只会从相册中被移除。\n\n```dart\n// 确保你的路径能够访问。\nfinal AssetPathEntity pathEntity = accessiblePath;\nfinal AssetEntity entity = yourEntity;\nfinal List\u003cAssetEntity\u003e entities = \u003cAssetEntity\u003e[yourEntity, anotherEntity];\n// 移除相簿的单个图片\n// 这将调用列表移除的方法作为实现。\nawait PhotoManager.editor.darwin.removeInAlbum(\n  yourEntity,\n  accessiblePath,\n);\n// 批量从相册中移除资源。\nawait PhotoManager.editor.darwin.removeAssetsInAlbum(\n  entities,\n  accessiblePath,\n);\n```\n\n##### 删除 `AssetPathEntity`\n\n智能相册无法被删除。\n\n```dart\nPhotoManager.editor.darwin.deletePath();\n```\n\n#### 适用于 OpenHarmony 的功能\n\n\u003e 鸿蒙官方处于安全考虑已禁止相关资源能力。\n\n目前以支持除缓存相关的其他功能，且只支持图片和视频类型资源。\n\n| Feature                     | OpenHarmony |\n|:----------------------------|:-----------:|\n| releaseCache                |      ❌      |\n| clearFileCache              |      ❌      |\n| requestCacheAssetsThumbnail |      ❌      |\n| getSubPathEntities          |      ❌      |\n\n\n[pub package]: https://pub.flutter-io.cn/packages/photo_manager\n[repo]: https://github.com/fluttercandies/flutter_photo_manager\n[GitHub issues]: https://github.com/fluttercandies/flutter_photo_manager/issues\n\n[Glide]: https://muyangmin.github.io/glide-docs-cn/\n[Generated API]: https://muyangmin.github.io/glide-docs-cn/doc/generatedapi.html\n[MediaColumns.RELATIVE_PATH]: https://developer.android.com/reference/android/provider/MediaStore.MediaColumns#RELATIVE_PATH\n[PHAuthorizationStatus]: https://developer.apple.com/documentation/photokit/phauthorizationstatus?language=objc\n[PHCachingImageManager]: https://developer.apple.com/documentation/photokit/phcachingimagemanager?language=objc\n\n[`AssetPathEntity`]: https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/AssetPathEntity-class.html\n[`AssetEntity`]: https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/AssetEntity-class.html\n[`getAssetPathList`]: https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/PhotoManager/getAssetPathList.html\n[`getAssetListPaged`]: https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/AssetPathEntity/getAssetListPaged.html\n[`getAssetListRange`]: https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/AssetPathEntity/getAssetListRange.html\n[`PhotoManager.getAssetListPaged`]: https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/PhotoManager/getAssetListPaged.html\n[`PhotoManager.getAssetListRange`]: https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/PhotoManager/getAssetListRange.html\n[`AssetEntity.fromId`]: https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/AssetEntity/fromId.html\n\n[`AVFileType`]: https://developer.apple.com/documentation/avfoundation/avfiletype\n[`LocallyAvailableBuilder`]: https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/2055adfa74370339d10e6f09adef72f2130d2380/lib/src/widget/builder/locally_available_builder.dart\n\n[flutter/flutter#20522]: https://github.com/flutter/flutter/issues/20522\n[photo_manager_image_provider]: https://pub.flutter-io.cn/packages/photo_manager_image_provider\n","funding_links":[],"categories":["Dart","Components"],"sub_categories":["Media"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluttercandies%2Fflutter_photo_manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffluttercandies%2Fflutter_photo_manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluttercandies%2Fflutter_photo_manager/lists"}