Flutter中如何使用photo_manager: ^3.6.4库管理相册

在Flutter项目中使用photo_manager: ^3.6.4库时遇到几个问题:

  1. 如何获取设备上的所有相册列表?
  2. 如何读取指定相册中的照片和视频?
  3. 处理权限请求的正确方式是什么?调用requestPermission()后还需要手动检查吗?
  4. 加载大量图片时如何优化性能?看到有originFile和thumbnail方法,具体怎么选择?
  5. 从相册选择多张图片并上传时,如何获取文件的真实路径?
  6. 在Android和iOS上这个库的行为有什么主要差异需要注意?
2 回复

在Flutter中使用photo_manager: ^3.6.4管理相册:

  1. 添加依赖到pubspec.yaml
  2. 请求相册权限
  3. 获取相册列表:
List<AssetPathEntity> albums = await PhotoManager.getAssetPathList();
  1. 获取相册内图片:
List<AssetEntity> assets = await album.getAssetListPaged(page, size);
  1. 显示图片使用AssetEntityImage组件

记得处理权限和错误情况。

更多关于Flutter中如何使用photo_manager: ^3.6.4库管理相册的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用photo_manager: ^3.6.4库管理相册的步骤如下:

1. 添加依赖

pubspec.yaml中添加:

dependencies:
  photo_manager: ^3.6.4
  # 可选:用于图片加载
  cached_network_image: ^3.3.0

2. 配置权限

Android

android/app/src/main/AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Android 13+ 需要 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

iOS

ios/Runner/Info.plist中添加:

<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册以显示照片</string>

3. 基本使用

import 'package:photo_manager/photo_manager.dart';

class PhotoGalleryPage extends StatefulWidget {
  @override
  _PhotoGalleryPageState createState() => _PhotoGalleryPageState();
}

class _PhotoGalleryPageState extends State<PhotoGalleryPage> {
  List<AssetEntity> assets = [];

  @override
  void initState() {
    super.initState();
    _requestPermission();
  }

  // 请求权限
  Future<void> _requestPermission() async {
    final PermissionState state = await PhotoManager.requestPermissionExtend();
    if (state.isAuth) {
      _loadAssets();
    } else {
      PhotoManager.openSetting();
    }
  }

  // 加载相册资源
  Future<void> _loadAssets() async {
    final List<AssetPathEntity> albums = await PhotoManager.getAssetPathList();
    final AssetPathEntity recentAlbum = albums.first;
    
    final List<AssetEntity> recentAssets = await recentAlbum.getAssetListPaged(
      page: 0,
      size: 100,
    );
    
    setState(() {
      assets = recentAssets;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('相册')),
      body: GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 3,
        ),
        itemCount: assets.length,
        itemBuilder: (_, index) {
          return AssetEntityImage(assets[index]);
        },
      ),
    );
  }
}

// 图片显示组件
class AssetEntityImage extends StatelessWidget {
  final AssetEntity asset;
  
  const AssetEntityImage(this.asset);
  
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<Uint8List?>(
      future: asset.thumbnailDataWithSize(ThumbnailSize(200, 200)),
      builder: (_, snapshot) {
        if (snapshot.hasData) {
          return Image.memory(snapshot.data!);
        }
        return Container(color: Colors.grey);
      },
    );
  }
}

4. 主要功能说明

  • 获取相册列表PhotoManager.getAssetPathList()
  • 获取相册内资源assetPathEntity.getAssetListPaged()
  • 获取缩略图asset.thumbnailDataWithSize()
  • 权限管理PhotoManager.requestPermissionExtend()

5. 注意事项

  • 需要处理权限被拒绝的情况
  • 加载大量图片时建议使用分页
  • 可以使用cached_network_image优化图片加载性能

这样就完成了基本的相册管理功能,可以显示设备中的图片并支持权限管理。

回到顶部