Flutter相册管理插件photo_album_manager的使用

Flutter相册管理插件photo_album_manager的使用

插件介绍

photo_album_manager 是一个可以快速获取相册资源的插件,支持安卓和iOS平台。通过这个插件,你可以方便地从用户的相册中获取图片、视频等资源。

安装插件

首先,在你的 pubspec.yaml 文件中添加依赖项:

dependencies:
  photo_album_manager: ^1.2.0

导入插件

在你的 Dart 文件中导入插件:

import 'package:photo_album_manager/photo_album_manager.dart';

示例代码

下面是一个完整的示例代码,展示了如何使用 photo_album_manager 插件来获取相册中的资源:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:photo_album_manager/photo_album_manager.dart';
import 'package:toast/toast.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: new AppBar(
          title: new Text('photo_album_manager'),
          centerTitle: true,
        ),
        body: PhotoAlbumBodyWidget(),
      ),
    );
  }
}

class PhotoAlbumBodyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () async {
              PermissionStatus status = await PhotoAlbumManager.checkPermissions();
              if (status == PermissionStatus.granted) {
                Toast.show("权限同意", context);
              } else {
                Toast.show("权限拒绝", context);
              }
            },
            child: Text("权限申请"),
          ),
          ElevatedButton(
            onPressed: () async {
              Navigator.of(context).push(new MaterialPageRoute(builder: (_) {
                return new PhotoAlbumResourceWidget(
                  title: '图片',
                  resourceType: "image",
                );
              }));
            },
            child: Text("图片"),
          ),
          ElevatedButton(
            onPressed: () async {
              Navigator.of(context).push(new MaterialPageRoute(builder: (_) {
                return new PhotoAlbumResourceWidget(
                  title: '视频',
                  resourceType: "video",
                );
              }));
            },
            child: Text("视频"),
          ),
        ],
      ),
    );
  }
}

class PhotoAlbumResourceWidget extends StatefulWidget {
  final String title;
  final String resourceType;

  const PhotoAlbumResourceWidget({Key key, this.title, this.resourceType})
      : super(key: key);

  @override
  PhotoAlbumResourceWidgetState createState() => new PhotoAlbumResourceWidgetState();
}

class PhotoAlbumResourceWidgetState extends State<PhotoAlbumResourceWidget> {
  List<AlbumModelEntity> photos = List();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
        centerTitle: true,
      ),
      body: GridView.builder(
        padding: const EdgeInsets.all(1: 1: 10.0),
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 3,
          mainAxisSpacing: 1: 1: 10.0,
          crossAxisSpacing: 1: 1: 10.0,
        ),
        itemCount: photos.length,
        itemBuilder: (BuildContext context, int index) {
          AlbumModelEntity model = photos[index];
          return GestureDetector(
            child: Card(
              child: Stack(
                children: [
                  ConstrainedBox(
                    constraints: BoxConstraints.expand(),
                    child: Image.file(
                      File(model.thumbPath ?? model.originalPath),
                      fit: BoxFit.cover,
                    ),
                  ),
                  Offstage(
                    child: Center(
                      child: Icon(
                        Icons.play_circle_outline,
                        size: 40,
                        color: Colors.white,
                      ),
                    ),
                    offstage: model.resourceType == "video" ? false : true,
                  ),
                ],
              ),
            ),
            onTap: () {
              PhotoAlbumManager.getOriginalResource(model.localIdentifier,
                  onProgress: (progress) {
                    print("下载进度" + progress.toString());
                  }, onError: (error) {
                    print("下载错误" + error);
                  }).then((value) {
                print("下载完成" + value.originalPath);
              });
            },
          );
        },
      ),
    );
  }

  @override
  // ignore: missing_return
  Future&lt;void&gt; initState() {
    // TODO: implement initState
    super.initState();
    initPlatformState();
  }

  Future&lt;void&gt; initPlatformState() async {
    if (widget.resourceType == "image") {
      photos = await PhotoAlbumManager.getDescAlbumImg(maxCount: 50);
      setState(() {});
    } else if (widget.resourceType == "video") {
      photos = await PhotoAlbumManager.getDescAlbumVideo(maxCount: 50);
      setState(() {});
    }
  }
}

API介绍

以下是 photo_album_manager 提供的一些主要API及其说明:

  • 检查必要权限

    static Future&lt;PermissionStatus&gt; checkPermissions();
    

    检查用户是否已经授予了访问相册的权限。

  • 判断权限状态是否授予

    static bool statusIsGranted(PermissionStatus status);
    

    判断当前权限状态是否为已授予。

  • 获取相册资源(降序)

    static Future&lt;List&lt;AlbumModelEntity&gt;&gt; getDescAlbum({int maxCount});
    

    获取相册中的资源,返回资源列表,并按降序排列。如果未指定 maxCount,则返回全部资源。

  • 获取相册资源(升序)

    static Future&lt;List&lt;AlbumModelEntity&gt;&gt; getAscAlbum({int maxCount});
    

    获取相册中的资源,返回资源列表,并按升序排列。如果未指定 maxCount,则返回全部资源。

  • 获取相册图片资源(升序)

    static Future&lt;List&lt;AlbumModelEntity&gt;&gt; getAscAlbumImg({int maxCount});
    

    获取相册中的图片资源,返回资源列表,并按升序排列。如果未指定 maxCount,则返回全部资源。

  • 获取相册视频资源(升序)

    static Future&lt;List&lt;AlbumModelEntity&gt;&gt; getAscAlbumVideo({int maxCount});
    

    获取相册中的视频资源,返回资源列表,并按升序排列。如果未指定 maxCount,则返回全部资源。

  • 获取相册图片资源(降序)

    static Future&lt;List&lt;AlbumModelEntity&gt;&gt; getDescAlbumImg({int maxCount});
    

    获取相册中的图片资源,返回资源列表,并按降序排列。如果未指定 maxCount,则返回全部资源。

  • 获取相册视频资源(降序)

    static Future&lt;List&lt;AlbumModelEntity&gt;&gt; getDescAlbumVideo({int maxCount});
    

    获取相册中的视频资源,返回资源列表,并按降序排列。如果未指定 maxCount,则返回全部资源。

  • 通过唯一标识获取资源(原图、原视频)

    static Future&lt;AlbumModelEntity&gt; getOriginalResource(String localIdentifier,
        {void onProgress(double progress), void onError(String error)});
    

    根据资源的唯一标识获取原始资源(原图或原视频),并提供回调函数处理下载进度和错误信息。

使用示例

以下是一个完整的示例代码,展示了如何使用 photo_album_manager 插件来获取相册中的图片和视频资源:


更多关于Flutter相册管理插件photo_album_manager的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter相册管理插件photo_album_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter相册管理插件photo_album_manager的代码示例。这个插件允许你访问和管理设备的相册,包括获取相册列表、保存图片到相册以及删除相册中的图片等功能。

首先,确保你已经在pubspec.yaml文件中添加了photo_album_manager依赖:

dependencies:
  flutter:
    sdk: flutter
  photo_album_manager: ^latest_version  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个简单的示例代码,展示了如何使用photo_album_manager插件:

import 'package:flutter/material.dart';
import 'package:photo_album_manager/photo_album_manager.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<AlbumEntity> _albums = [];

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

  Future<void> _getAlbums() async {
    try {
      List<AlbumEntity> albums = await PhotoAlbumManager.getAlbumList();
      setState(() {
        _albums = albums;
      });
    } catch (e) {
      print("Error getting albums: $e");
    }
  }

  Future<void> _saveImageToAlbum(File imageFile) async {
    try {
      String? albumName = _albums.isNotEmpty ? _albums.first.name : null;
      if (albumName != null) {
        bool result = await PhotoAlbumManager.saveImageToAlbum(imageFile.path, albumName: albumName);
        if (result) {
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Image saved successfully')));
        } else {
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Failed to save image')));
        }
      } else {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('No album found')));
      }
    } catch (e) {
      print("Error saving image: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Photo Album Manager Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: [
              Expanded(
                child: ListView.builder(
                  itemCount: _albums.length,
                  itemBuilder: (context, index) {
                    AlbumEntity album = _albums[index];
                    return ListTile(
                      title: Text(album.name),
                      subtitle: Text('${album.assetCount} photos'),
                    );
                  },
                ),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  // 这里你需要一个File对象,这里仅作为示例,你需要自己获取或创建一个File对象
                  // 例如,你可以使用picker插件选择一个图片文件
                  // File imageFile = ...;
                  // 由于示例中无法直接创建File对象,这里省略了File的获取过程
                  // 直接调用保存方法(实际使用时请确保File对象有效)
                  // _saveImageToAlbum(imageFile);
                  print('Please replace the button press action with actual File saving logic.');
                },
                child: Text('Save Image to Album'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  1. 在实际使用中,你需要获取一个有效的File对象,这通常涉及到使用文件选择器插件让用户选择一个图片文件,或者使用相机插件拍摄一张照片。
  2. 权限处理:在Android和iOS上,访问相册和保存图片到相册通常需要请求用户权限。photo_album_manager插件在内部处理了大部分权限请求逻辑,但你可能需要在你的应用中添加适当的权限说明和请求逻辑,特别是在iOS上,你可能需要在Info.plist中添加相应的权限描述。

确保在实际项目中根据需要进行适当的错误处理和用户体验优化。

回到顶部