A Flutter plugin that provides assets abstraction management APIs without UI integration, you can get assets (image/video/audio) on Android, iOS and macOS.

Last update: Jun 23, 2022

photo_manager

pub package GitHub GitHub stars

Photo/Assets management APIs for Flutter without UI integration, you can get assets (image/video/audio) from Android, iOS and macOS.

提供相册操作 API 的插件,Android、iOS 和 macOS 可用。 没有 UI 内容,以便于自定义自己的界面,你可以通过提供的 API 来实现图片相关的 UI 或插件。

Projects that using this packages

name owner description pub github
wechat_assets_picker fluttercandies An audio/video/image picker in pure Dart which is the same with WeChat, support multi picking. pub package star
photo Caijinglong A selector for multiple pictures / videos, The style is like the 6.0 version of wechat. pub package star
photo_widget fluttercandies Not just selectors, but to provide each widget as a separate component, which is convenient for quickly combining and customizing your own style. pub package star

Table of contents

install

Add to pubspec

the latest version is pub package

dependencies:
  photo_manager: $latest_version

import in dart code

import 'package:photo_manager/photo_manager.dart';

Usage

Configure your flutter project to use the plugin

Before using the plug-in, there are several points to note. Please click the link below.

  1. Android
  2. iOS

request permission

You must get the user's permission on android/ios.

var result = await PhotoManager.requestPermissionExtend();
if (result.isAuth) {
    // success
} else {
    // fail
    /// if result is fail, you can call `PhotoManager.openSetting();`  to open android/ios applicaton's setting to get permission
}

About requestPermissionExtend

In iOS14, Apple inclue "LimitedPhotos Library" to iOS.

We need use the PhotoManager.requestPermissionExtend() to request permission.

The method will return PermissionState. See it in document of Apple.

So, because of compatibility, Android also recommends using this method to request permission, use state.isAuth, use a to be equivalent to the previous method requestPermission.

Limit photos

Because apple inclue "LimitedPhotos Library" to iOS.

Let the user select the visible image for app again, we can use PhotoManager.presentLimited() to repick again.

The method is only valid when iOS14 and user authorization mode is PermissionState.limited, other platform will ignore.

you get all of asset list (gallery)

List<AssetPathEntity> list = await PhotoManager.getAssetPathList();
name description
hasAll Is there an album containing "all"
type image/video/all , default all.
filterOption See FilterOption.

FilterOption

name description
needTitle The title attribute of the picture must be included in android (even if it is false), it is more performance-consuming in iOS, please consider whether you need it. The default is false.
sizeConstraint Constraints on resource size.
durationConstraint Constraints of time, pictures will ignore this constraint.
createDateTimeCond Create date filter
updateDateTimeCond Update date filter
orders The sort option, use addOrderOption.

Example see filter_option_page.dart.

Most classes of FilterOption support copyWith.

Get asset list from AssetPathEntity

paged

// page: The page number of the page, starting at 0.
// perPage: The number of pages per page.
final assetList = await path.getAssetListPaged(page, perPage);

The old version, it is not recommended for continued use, because there may be performance issues on some phones. Now the internal implementation of this method is also paged, but the paged count is assetCount of AssetPathEntity.

range

final assetList = await path.getAssetListRange(start: 0, end: 88); // use start and end to get asset.
// Example: 0~10 will return 10 assets. Special case: If there are only 5, return 5

Old version

AssetPathEntity data = list[0]; // 1st album in the list, typically the "Recent" or "All" album
List<AssetEntity> imageList = await data.assetList;

AssetEntity

AssetEntity entity = imageList[0];

File file = await entity.file; // image file

Uint8List originBytes = await entity.originBytes; // image/video original file content,

Uint8List thumbBytes = await entity.thumbData; // thumb data ,you can use Image.memory(thumbBytes); size is 64px*64px;

Uint8List thumbDataWithSize = await entity.thumbDataWithSize(width,height); //Just like thumbnails, you can specify your own size. unit is px; format is optional support jpg and png.

AssetType type = entity.type; // the type of asset enum of other,image,video

Duration duration = entity.videoDuration; //if type is not video, then return null.

Size size = entity.size

int width = entity.width;

int height = entity.height;

DateTime createDt = entity.createDateTime;

DateTime modifiedDt = entity.modifiedDateTime;

/// Gps info of asset. If latitude and longitude is 0, it means that no positioning information was obtained.
/// This information is not necessarily available, because the photo source is not necessarily the camera.
/// Even the camera, due to privacy issues, this property must not be available on androidQ and above.
double latitude = entity.latitude;
double longitude = entiry.longitude;

Latlng latlng = await entity.latlngAsync(); // In androidQ or higher, need use the method to get location info.

String mediaUrl = await entity.getMediaUrl(); /// It can be used in some video player plugin to preview, such as [flutter_ijkplayer](https://pub.dev/packages/flutter_ijkplayer)

String title = entity.title; // Since this property is fetched using KVO in iOS, the default is null, please use titleAsync to get it.

String relativePath = entity.relativePath; // It is always null in iOS.

About title: if the title is null or empty string, need use the titleAsync to get it. See below for the definition of attributes.

  /// It is title `MediaStore.MediaColumns.DISPLAY_NAME` in MediaStore on android.
  ///
  /// It is `PHAssetResource.filename` on iOS.
  ///
  /// Nullable in iOS. If you must need it, See [FilterOption.needTitle] or use [titleAsync].
  String title;

  /// It is [title] in Android.
  ///
  /// It is [PHAsset valueForKey:@"filename"] in iOS.
  Future<String> get titleAsync => _plugin.getTitleAsync(this);

location info of android Q

Because of AndroidQ's privacy policy issues, it is necessary to locate permissions in order to obtain the original image, and to obtain location information by reading the Exif metadata of the data.

Origin description

The originFile and originBytes will return the original content.

Not guaranteed to be available in flutter.
Because flutter's Image does not support heic.
The video is also the original format, non-exported format, compatibility does not guarantee usability.

Create with id

The id of the Asset corresponds to the id field of the MediaStore on android, and the localIdentity of PHAsset on iOS.

The user can store the id to any place if necessary, and next time use the AssetEntity.fromId(id) method to create the AssetEntity instace.

final asset = await AssetEntity.fromId(id);

observer

use addChangeCallback to regiser observe.

PhotoManager.addChangeCallback(changeNotify);
PhotoManager.startChangeNotify();
PhotoManager.removeChangeCallback(changeNotify);
PhotoManager.stopChangeNotify();

Clear file cache

You can use PhotoManager.clearFileCache() to clear all of cache.

The cache is generated at runtime when your call some methods. The following table will tell the user when the cache file will be generated.

Platform thumb file/originFile
Android(28 or lower) Yes No
Android(29) (requestLegacyExternalStorage) Yes No
Android(29) Yes Yes
Android(30) Yes No
iOS No Yes

Experimental

Important: The functions are not guaranteed to be fully usable, because it involves data modification, some APIs will cause irreversible deletion / movement of the data, so please use test equipment to make sure that there is no problem before using it.

Preload thumb

PhotoCachingManager().requestCacheAssets(
  assets: assets,
  option: thumbOption,
);

And, if you want to stop, call PhotoCachingManager().cancelCacheRequest();

Usually, when we preview an album, we use thumbnails. In flutter, because ListView.builder and GridView.builder rendering that loads, but sometimes we might want to pre-load some pictures in advance to make them display faster.

Now, I try to create a caching image manager (just like PHCachingImageManager) to do it. In IOS, I use the system API directly, and Android will use glide and use glide's file cache to complete this step. This function is completely optional.

Delete item

Hint: this will delete the asset from your device. For iOS, it's not just about removing from the album.

final List<String> result = await PhotoManager.editor.deleteWithIds([entity.id]); // The deleted id will be returned, if it fails, an empty array will be returned.

Tip: You need to call the corresponding PathEntity's refreshPathProperties method to refresh the latest assetCount.

And range way to get the latest data to ensure the accuracy of the current data. Such as example.

Insert new item

final AssetEntity imageEntity = await PhotoManager.editor.saveImage(uint8list); // nullable

final AssetEntity imageEntity = await PhotoManager.editor.saveImageWithPath(path); // nullable

File videoFile = File("video path");
final AssetEntity videoEntity = await await PhotoManager.editor.saveVideo(videoFile); // nullable

Copy asset

Availability:

  • iOS: some albums are smart albums, their content is automatically managed by the system and cannot be inserted manually.
  • android:
    • Before api 28, the method will copy some column from origin row.
    • In api 29 or higher, There are some restrictions that cannot be guaranteed, See document of relative_path.
Only for iOS

Create folder:

PhotoManager.editor.iOS.createFolder(
  name,
  parent: parent, // It is a folder or Recent album.
);

Create album:

PhotoManager.editor.iOS.createAlbum(
  name,
  parent: parent, // It is a folder or Recent album.
);

Remove asset in album, the asset can't be delete in device, just remove of album.

PhotoManager.editor.iOS.removeInAlbum();  // remove single asset.
PhotoManager.editor.iOS.removeAssetsInAlbum(); // Batch remove asset in album.

Delete the path in device. Both folders and albums can be deleted, except for smart albums.

PhotoManager.editor.iOS.deletePath();
Only for Android

Move asset to another album

PhotoManager.editor.android.moveAssetToAnother(entity: assetEntity, target: pathEntity);

Remove all non-existing rows. For normal Android users, this problem doesn't happened.
A row record exists in the Android MediaStore, but the corresponding file has been deleted. This kind of abnormal deletion usually comes from file manager, helper to clear cache or adb.
This is a very resource-consuming operation. If the first one is not completed, the second one cannot be opened.

await PhotoManager.editor.android.removeAllNoExistsAsset();

iOS config

iOS plist config

Because the album is a privacy privilege, you need user permission to access it. You must to modify the Info.plist file in Runner project.

like next

    <key>NSPhotoLibraryUsageDescription</key>
    <string>App need your agree, can visit your album</string>

xcode like image in xcode

In ios11+, if you want to save or delete asset, you also need add NSPhotoLibraryAddUsageDescription to plist.

enabling localized system albums names

By default iOS will retrieve system album names only in English whatever the device's language currently set. To change this you need to open the ios project of your flutter app using xCode

in xcode

Select the project "Runner" and in the localizations table, click on the + icon

in xcode

Select the adequate language(s) you want to retrieve localized strings. Validate the popup screen without any modification Close xCode Rebuild your flutter project Now, the system albums should be displayed according to the device's language

Cache problem of iOS

iOS does not directly provide APIs to access the original files of the album. The corresponding object is PHAsset,

So when you want to use file or originFile, a cache file will be generated locally.

So if you are sensitive to space, please delete it after using file(just iOS), and if it is only used for preview, you can consider using thumb or thumbWithSize.

void useEntity(AssetEntity entity) async {
  File file = null;
  try{
    file = await entity.file;
    doUpload(); // do upload
  }finally{
    if(Platform.isIOS){
      file?.deleteSync();
    }
  }
}

android config

Kotlin and Gradle version

Start from 1.2.7, We're shipping this package using Kotlin 1.5.21 and AGP 4.1.0. If your projects are using a lower version of Kotlin or Gradle, please upgrade them to a newer version. More specifically:

  • Upgrade your Gradle version (the one in gradle-wrapper.properties) to 6.8.3 or the latest version but lower than 7.0.0.
  • Upgrade your Kotlin version (ext.kotlin_version) to 1.4.32 or the latest version.

Cache problem of android

Because androidQ restricts the application’s ability to directly access the resource path, some large image caches will be generated. This is because: When the file/originFile attribute is used, the plugin will save a file in the cache folder and provide it to dart:io use.

Fortunately, in androidP, the path attribute can be used again, but for androidQ, this is not good news, but we can use requestLegacyExternalStorage to avoid using androidQ's api, and I also recommend you to do so. See Android Q to add the attribute.

about androidX

Google recommends completing all support-to-AndroidX migrations in 2019. Documentation is also provided.

This library has been migrated in version 0.2.2, but it brings a problem. Sometimes your upstream library has not been migrated yet. At this time, you need to add an option to deal with this problem.

The complete migration method can be consulted gitbook.

Android Q (android10 , API 29)

Now, the android part of the plugin uses api 29 to compile the plugin, so your android sdk environment must contain api 29 (androidQ).

AndroidQ has a new privacy policy, users can't access the original file.

If your compileSdkVersion and targetSdkVersion are both below 28, you can use PhotoManager.forceOldApi to force the old api to access the album. If you are not sure about this part, don't call this method. And, I recommand you add android:requestLegacyExternalStorage="true" to your AndroidManifest.xml, just like next.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="top.kikt.imagescannerexample">

    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="image_scanner_example"
        android:requestLegacyExternalStorage="true"
        android:icon="@mipmap/ic_launcher">
    </application>
</manifest>

Android R (android 11, API30)

Unlike androidQ, this version of requestLegacyExternalStorage is invalid, but I still recommend that you add this attribute to make it easier to use the old API on android29 of android device.

glide

Android native use glide to create image thumb bytes, version is 4.11.0.

If your other android library use the library, and version is not same, then you need edit your android project's build.gradle.

rootProject.allprojects {

    subprojects {
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.github.bumptech.glide'
                        && details.requested.name.contains('glide')) {
                    details.useVersion '4.11.0'
                }
            }
        }
    }
}

And, if you want to use ProGuard, you can see the ProGuard of Glide.

Remove Media Location permission

Android contains ACCESS_MEDIA_LOCATION permission by default.

This permission is introduced in Android Q. If your app doesn't need this permission, you need to add the following node to the Android manifest in your app.

<uses-permission
  android:name="android.permission.ACCESS_MEDIA_LOCATION"
  tools:node="remove"
  />

See code in the example.

common issues

ios build error

if your flutter print like the log. see stackoverflow

Xcode's output:

    === BUILD TARGET Runner OF PROJECT Runner WITH CONFIGURATION Debug ===
    The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "Runner" target.
    === BUILD TARGET Runner OF PROJECT Runner WITH CONFIGURATION Debug ===
    While building module 'photo_manager' imported from /Users/cai/IdeaProjects/flutter/sxw_order/ios/Runner/GeneratedPluginRegistrant.m:9:
    In file included from <module-includes>:1:
    In file included from /Users/cai/IdeaProjects/flutter/sxw_order/build/ios/Debug-iphonesimulator/photo_manager/photo_manager.framework/Headers/photo_manager-umbrella.h:16:
    /Users/cai/IdeaProjects/flutter/sxw_order/build/ios/Debug-iphonesimulator/photo_manager/photo_manager.framework/Headers/MD5Utils.h:5:9: error: include of non-modular header inside framework module 'photo_manager.MD5Utils': '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.2.sdk/usr/include/CommonCrypto/CommonDigest.h' [-Werror,-Wnon-modular-include-in-framework-module]
    #import <CommonCrypto/CommonDigest.h>
            ^
    1 error generated.
    /Users/cai/IdeaProjects/flutter/sxw_order/ios/Runner/GeneratedPluginRegistrant.m:9:9: fatal error: could not build module 'photo_manager'
    #import <photo_manager/ImageScannerPlugin.h>
     ~~~~~~~^
    2 errors generated.

Some articles about to use this library

How To: Create a custom media picker in Flutter to select photos and videos from the gallery

Flutter 开发日记-如何实现一个照片选择器 plugin

If you have other articles about this library, you can contact me or open PR here.

Migration Guide

See Migration-Guide

GitHub

https://github.com/CaiJingLong/flutter_photo_manager
Comments
  • 1. [BUG] Video AssetImage.file loads extremely long on iOS even though isLocal == true. AssetImage.originFile loads instantly

    Describe the bug We're creating an app where we need a custom video picker, however loading the video files via photo_manager is extremely slow on iOS. When obtaining the file for a video for the first time, a 3s video can load for upwards of 5 seconds. For longer videos the loading time is even worse (>1min in some cases), making our app almost unusable on iOS at the moment. Obtaining files through AssetEntity.originFile is almost instant, however some videos are unusable or have unexpected behaviour (HDR, slow motion, etc.) Caching is not really a valid option for us, since we need to provide access to different videos quickly and can't afford the storage that the cache would take up in that case.

    To Reproduce

    • Find an AssetEntity that is a video and where isLocal == true
    • Call assetEntity.file (or loadFile() for that matter)
    • Wait

    Expected behavior Since other apps, like every messenger for example, can access gallery videos almost instantly, even on first load where caching couldn't have taken place, we expected that the same should hold true for this package as well.

    Flutter version [✓] Flutter (Channel stable, 2.10.0, on macOS 12.2 21D49 darwin-arm, locale en-DE) • Flutter version 2.10.0 at /Users/tim/flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 5f105a6ca7 (13 days ago), 2022-02-01 14:15:42 -0800 • Engine revision 776efd2034 • Dart version 2.16.0 • DevTools version 2.9.2

    Smartphone:

    • Device: iPhone 13, iPhone 8 (physical devices)
    • iOS 15.3.1
    • Version ^1.3.10 (also reproducible in 2.0.0--dev.6)
    Reviewed by timcreatedit at 2022-02-14 13:28
  • 2. [BUG] Duplicate images on iOS are sorted differently from ios "Photos" app

    Describe the bug Sometime users duplicate images in their albums (eg. to apply different effects to the same pic). Noticed that all duplicated images are not loaded by photomanager.

    To Reproduce Steps to reproduce the behavior:

    1. Load Recents album via photomanager
    2. Duplicate an image via native photos app
    3. Load album again via photomanager and see that duplicated image is neglected

    Tested on iOS, it might affect android as well.

    Expected behavior Albums in photomanager should be an exact copy of what they are in native photos app.

    Flutter version

    Smartphone (please complete the following information):

    • Device: iPhoneXS
    • OS: iOS17.7.1

    Log

    If applicable, add logs to help explain your problem.

    
    
    Reviewed by iosephmagno at 2021-09-22 18:41
  • 3. [BUG] Functions getAssetListRange and getAssetListPaged returning images only for first invocation

    Describe the bug Functions getAssetListRange and getAssetListPaged returning images only for first invocation. Further invocations of this functions return 0 entities. I have more than 600 images in album.

    To Reproduce Steps to reproduce the behavior: Just run a example app from this project.

    Expected behavior More images should be loaded.

    Flutter version Channel stable, 2.10.3,

    Smartphone (please complete the following information): xiaomi

    Reviewed by adamCPP at 2022-03-20 18:26
  • 4. [BUG] Some of the videos not showing in picker

    Describe the bug I use this library for a long time for images, but recently I tried to enable videos and some of users reported that cant see some videos, but can see in other apps like Facebook that also use MediaStore.

    How to reproduce Enable common or videos filter and open picker.

    Version information

    • Device: Realme 3 Pro and maybe some others
    • OS: Android 10
    • Package Version: 6.2.3
    • Flutter Version: v2.5.3

    Additional context All not displayed videos are screencasts recorded by built in firmware recorder. When user sends "broken" video to any place (original without modification) and download on device again - it displayed. So the file is valid. Especially since all native apps show this file sucessfully. Can somehow suggest where to search the error? Maybe additional filters in picker or filters in underlying media manager (MediaStore), or consumed crash when getting preview can cause this.

    Reviewed by NaikSoftware at 2021-11-17 18:40
  • 5. [BUG] Edited video are not displayed correctly

    Describe the bug

    I am not sure that it's a Widget - related issue or the retrieved file itself, but displaying the content of assetEntity.file in the official example code of this plugin is showing a black rect on the screen if assetEntity.file is supposed to retrieve an edited video (iOS only, have not tested on Android).

    From a UI point of view, it seems that this rect has a width equal to the cropped region in the edited video.
    Hard to tell for the height since we don't see the real edited video content in the widget despite the BoxFit.fill or BoxFit.cover.

    To Reproduce Steps to reproduce the behavior:

    1. Edit a video (crop it in your iPhone's photo app)
    2. Run the official example code
    3. Show detail page of the edited video
    4. See the black screen

    We can see this behavior using also assetEntity.getMediaUrl.

    Expected behavior The edited video should be rendered as it is seen in the Photos native application on iOS.

    Screenshots

    https://user-images.githubusercontent.com/32631467/150109912-dcc72ee2-1e17-469b-bf9f-ae6cdb4914cb.MOV

    Flutter version

    Smartphone (please complete the following information):

    • Device: iPhone 8, iPhone XS Max, iPhone 12 Pro
    • OS: iOS 15.2.1, iOS 15.1.1

    Code

    In the initState of video_widget.dart you can play with this code and see the behavior with any of the chosen method :

    @override
      void initState() {
        super.initState();
        /*
        widget.entity.file.then((File? file) {
          if (!mounted || file == null) {
            return;
          }
          _controller = VideoPlayerController.file(file)
            ..initialize()
            ..addListener(() => setState(() {}));
          setState(() {});
        });
         */
        
        widget.entity.getMediaUrl().then((String? url) {
          if (!mounted || url == null) {
            return;
          }
          _controller = VideoPlayerController.network(url)
            ..initialize()
            ..addListener(() => setState(() {}));
          setState(() {});
        });
      }
    
    Reviewed by Tom3652 at 2022-01-19 11:05
  • 6. this pacakge not working well in android version11.

    it's shows all the photos from gallery into the app(we are using pagination to shows all the image into the app) but when we scroll down or do anything else then it's hang the whole app and after a while response comes so it's not a good thing ( NOTE:- this behaviour is only for android version 11 otherwise it's fine in android version 6,7,8,9,10 )

    Reviewed by soroutarchana at 2021-04-23 08:13
  • 7. [BUG]kotlin.KotlinNullPointerException

    E/AndroidRuntime(25410): kotlin.KotlinNullPointerException E/AndroidRuntime(25410): at top.kikt.imagescanner.core.PhotoManagerPlugin$onHandlePermissionResult$4.invoke(PhotoManagerPlugin.kt:208) E/AndroidRuntime(25410): at top.kikt.imagescanner.core.PhotoManagerPlugin$onHandlePermissionResult$4.invoke(PhotoManagerPlugin.kt:23) E/AndroidRuntime(25410): at top.kikt.imagescanner.core.PhotoManagerPlugin$sam$java_lang_Runnable$0.run(Unknown Source:2) E/AndroidRuntime(25410): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) E/AndroidRuntime(25410): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) E/AndroidRuntime(25410): at java.lang.Thread.run(Thread.java:764)

    Reviewed by github0911 at 2020-04-17 07:04
  • 8. iOS is returning uneditied image[BUG]

    Describe the bug If you crop an image in your photo app and select it using this library the thumbnail returns the correct latest version but the full image always returns the original unedited version of the photo instead of the current edit

    To Reproduce Steps to reproduce the behavior IOS ONLY:

    1. Edit a photo before using the app within your photos app ( i usually resize it )
    2. Select an image from the gallery
    3. You can see the thumbnail is ok
    4. See error

    Expected behavior I would expect the full size image to be the same as the thumbnail

    Screenshots IMG_4543 IMG_4542

    Flutter version [✓] Flutter (Channel stable, v1.12.13+hotfix.7, on Mac OS X 10.15.3 19D76, locale en-US) • Flutter version 1.12.13+hotfix.7 at /Users/barrettbreshears/dev/flutter • Framework revision 9f5ff2306b (3 weeks ago), 2020-01-26 22:38:26 -0800 • Engine revision a67792536c • Dart version 2.7.0

    Smartphone (please complete the following information):

    • Device: iPhone Xs, iPhone XsMax
    • OS: iOS 13.3.1

    Log NA

    Reviewed by barrettbreshears at 2020-02-14 22:40
  • 9. call to getAssetPathList takes excessively long time on some android devices

    I'm calling getAssetPathList as follows:

    List<AssetPathEntity> list = await PhotoManager.getAssetPathList(hasAll: false, hasVideo: false);

    On iOS and Android 8 (with many thousand of images on the device), it completes within a few seconds. However, some users (on Android 5 and 6) are reporting a delay of over 30 seconds, with relatively few images stored on the device. So, my questions are:

    1. Is there some sort of caching mechanism to build this listing more efficiently (ie, on subsequent loads)

    2. Could the params: "hasAll: false, hasVideo: false" have any impact on the speed?

    3. Is there any other way to speed up the scan? 30 seconds is a bit of a deal-breaker, but I don't have a physical device with android 5 or 6 to test on.

    Reviewed by ROTGP at 2019-01-15 12:14
  • 10. [Feature Request] Add possibility to display video's first frame when retrieving their thumbnail

    Describe the bug When retrieving assets and trying to display them using entity.thumbDataWithOption(), if the AssetEntity named entity is a video, the first frame is not displayed.

    To Reproduce

    1. Run the sample code on a phone that has videos in its gallery.
    2. See that the first frame is not displayed.

    Code sample :

    import 'dart:io';
    import 'dart:typed_data';
    
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:photo_manager/photo_manager.dart';
    
    void main() {
      runApp(const TestApp());
    }
    
    class TestApp extends StatefulWidget {
      const TestApp({Key? key}) : super(key: key);
    
      @override
      State<TestApp> createState() => _TestAppState();
    }
    
    class _TestAppState extends State<TestApp> {
      final List<AssetEntity> assetsList = [];
    
      bool granted = false;
    
      void loadAssets() async {
        granted = await PhotoManager.requestPermission();
        if (granted) {
          FilterOptionGroup option = FilterOptionGroup()
            ..addOrderOption(const OrderOption(
              type: OrderOptionType.createDate,
              asc: false,
            ));
    
          final albums = await PhotoManager.getAssetPathList(
              onlyAll: true, filterOption: option, type: RequestType.video);
    
          if (albums.isNotEmpty) {
            var album = albums.first;
            // Now that we got the album, fetch all the assets it contains
            List<AssetEntity> currentList = await album.getAssetListRange(start: 0, end: 200);
            // Update the state and notify UI
            assetsList.clear();
            assetsList.addAll(currentList);
          }
          setState(() {
    
          });
        }
      }
    
      @override
      void initState() {
        loadAssets();
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
              body: granted
                  ? _gridView()
                  : Center(
                    child: Container(
                        color: Colors.blue,
                        width: 200,
                        height: 200,
                        child: TextButton(
                          onPressed: () async {
                            granted = await PhotoManager.requestPermission();
                            setState(() {});
                          },
                          child: const Text("Ask permission", style: TextStyle(color: Colors.white),),
                        )),
                  )),
        );
      }
    
      Widget _gridView() {
        return GridView.builder(
          itemCount: assetsList.length,
            gridDelegate:
                const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3),
            itemBuilder: (context, index) {
              return GalleryThumbnail(asset: assetsList[index]);
            });
      }
    }
    
    class GalleryThumbnail extends StatelessWidget {
      final AssetEntity asset;
    
      const GalleryThumbnail({Key? key, required this.asset}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return FutureBuilder<Uint8List?>(
          future: Platform.isIOS
              ? asset.thumbDataWithOption(
                  ThumbOption.ios(
                      width: 500,
                      height: 500,
                      deliveryMode: DeliveryMode.opportunistic,
                      resizeMode: ResizeMode.fast,
                      resizeContentMode: ResizeContentMode.fit,
                      quality: 100
                      // resizeContentMode: ResizeContentMode.fill,
                      ),
                )
              : asset.thumbDataWithSize(250, 250),
          builder: (_, snapshot) {
            final bytes = snapshot.data;
            if (snapshot.hasError) {
              return Container();
            }
            // If we have no data
            if (bytes == null) return Container();
            // If there's data, display it as an image
            return Image.memory(bytes, fit: BoxFit.cover);
          },
        );
      }
    }
    

    Expected behavior I would expect to see the first frame of the video when retrieving a thumbnail with option for the AssetEntity. If this is not a global behavior, maybe add a bool parameter which would allow the user to choose which frame to take.

    Flutter version

    [✓] Flutter (Channel stable, 2.5.3, on macOS 12.0.1 21A559 darwin-x64, locale fr-FR)
        • Flutter version 2.5.3 at /Users/foxtom/Desktop/flutter
        • Upstream repository https://github.com/flutter/flutter.git
        • Framework revision 18116933e7 (3 weeks ago), 2021-10-15 10:46:35 -0700
        • Engine revision d3ea636dc5
        • Dart version 2.14.4
    

    Smartphone (please complete the following information):

    • Device: iPhone XS max, iPhone 7 plus, Android OPPO (10), iPhone 12 pro max
    • OS: ios 15, 14.7, android 10
    Reviewed by Tom3652 at 2021-11-06 18:31
  • 11. [BUG] PhotoManager.editor.saveImage is not preserving the title on iOS

    Description Calling PhotoManager.editor.saveImage(data, title: "title") returns an asset, with an empty title.

    To Reproduce

    final asset = PhotoManager.editor.saveImage(data, title: "title");
    print(asset.title); // will be an empty string
    

    Expected behavior The title that is passed to saveImage should be preserved in the AssetEntity that is returned.

    Flutter version: Flutter version 2.5.2 flutter_photo_manager version: v1.3.6

    Smartphone (please complete the following information):

    • Device: iPhone 11 Pro
    • OS: iOS 15.0.1
    Reviewed by vishnukvmd at 2021-10-13 05:55
  • 12. ✨ `AssetPathEntity.assetCountAsync`

    • Deprecate AssetPathEntity.assetCount.
    • Add AssetPathEntity.assetCountAsync.
    • Remove containsEmptyAlbum from FilterOptionGroup.

    Local test result:

    Before: image After: image

    Reviewed by AlexV525 at 2022-06-23 08:54
  • 13. [BUG] loadFile fails for almost all images

    Describe the bug I implemented the package and it was working fine so far. I can display the images how I want it but now I want to save them inside the app. This is where it fails. For almost all images (talking here about > 90%) I .loadFile is returning null.

    My app is really complex and you would need access to my PhotoLibrary so I can not really give you an example but this is the code where I try to save the image:

    if (returnObject is AssetEntity) {
             print(returnObject.createDateTime);  // -> works everytime
    
            dynamic bytes = await returnObject.originBytes; // -> almost always null
            File? image = await returnObject.originFile;  // -> almost always null
            File? loadImage = await returnObject.loadFile();  // -> almost always null
            File? fileImage = await returnObject.file;  // -> almost always null
    }
    

    What am I missing here? The package is pretty much useless if you can not save the actual images. I must be forgetting something but I have no idea what...

    I also downloaded the example-project and checked if I can open the images there, but same result: It shows the thumbnail but can not get the data:

    Bad state: The data of the entity is null: AssetEntity(id: 6E76423A-C3BF-46CF-BFEB-9F7018C9DE81/L0/001 , type: AssetType.image)

    Smartphone (please complete the following information):

    • Device: iPod touch - 7th generation - iOS 15.2
    Reviewed by DieGlueckswurst at 2022-06-17 17:24
  • 14. PhotoManager.getAssetPathList takes too much time with iCloud

    PhotoManager.getAssetPathList performance seems fixed with local file fetch but not in iCloud, anyone facing this issue?

    I got 2T volume iCloud and has around 60000up photos in many folder/album

    I tried PhotoManager.getAssetPathList(type: RequestType.image, onlyAll: true), costed my about 4secs, i can deal with that, but what i use PhotoManager.getAssetPathList(type: RequestType.image) to get all album, it costed me about 2mins to return the result

    Originally posted by @dvlj in https://github.com/fluttercandies/flutter_photo_manager/issues/178#issuecomment-1097483990

    Reviewed by AlexV525 at 2022-04-13 02:34
  • 15. [Feature] Android getAllGalleryList return favorite album

    I use flutter_wechat_assets_picker, but this lib show gallery list not include favorite album.

    But iOS has been return favorite album(link), so can you add android version.

    Thanks!

    Reviewed by hhgz9527 at 2022-03-20 09:57
  • 16. [BUG] `moveAssetToPath` is unavailable

    Expect

    What you want to achieve Screenshot 2022-01-28 at 10 37 48

    ScreenShots

    Screenshots showing the purpose.

    when I try to one picture to move another gallery I facing this type of permitton error and I don't understand why this showing because I already definer all permission can anyone please solve this issue..

    Reviewed by darshit01920 at 2022-01-28 05:11

Related

dos downloader app is developed for downloading video. You can download video from YouTube and Facebook. You can also play video on background

dosdownloader Dos downloader app is developed for downloading video. You can download video from YouTube and Facebook. You can also play video on back

Dec 8, 2021
A Video and Audio player that can play from local assets, local files and network URLs with the powerful controls
A Video and Audio player that can play from local assets, local files and network URLs with the powerful controls

Video/Audio Player in Flutter with Powerful controls How can we play videos in Flutter? There is a library directly from the Flutter team simply calle

Jan 31, 2022
The Swift code generator for your assets, storyboards, Localizable.strings, … — Get rid of all String-based APIs!
The Swift code generator for your assets, storyboards, Localizable.strings, … — Get rid of all String-based APIs!

SwiftGen SwiftGen is a tool to automatically generate Swift code for resources of your projects (like images, localised strings, etc), to make them ty

Jun 21, 2022
A Video Player For Vimeo Videos in Flutter. This plugin allows us to play video from Vimeo and it supports Android and iOS platforms.
A Video Player For Vimeo Videos in Flutter. This plugin allows us to play video from Vimeo and it supports Android and iOS platforms.

vimeo_video_player A Video Player For Vimeo Videos in Flutter. This plugin allow us to play video from vimeo and it's supports Android and iOS platfor

Mar 8, 2022
Integration test - Copy of the official Flutter integration test plugin

integration_test This package enables self-driving testing of Flutter code on de

Jan 5, 2022
Feb 10, 2022
Flutter plugin that allows you to keep the device screen awake on Android, iOS, macOS, Windows, and web.

Wakelock Wakelock is Flutter plugin that allows you to keep the device screen awake, i.e. prevent the screen from sleeping. Supported platforms Platfo

Jun 28, 2022
Flutter package to render html as widgets that supports hyperlink, image, audio, video, iframe and many other tags.
Flutter package to render html as widgets that supports hyperlink, image, audio, video, iframe and many other tags.

HtmlWidget monorepo This repo contains the source code for everything HtmlWidget-related. Name Link flutter_widget_from_html_core flutter_widget_from_

Jun 18, 2022
Flutter simple image crop - A simple and easy to use flutter plugin to crop image on iOS and Android
Flutter simple image crop - A simple and easy to use flutter plugin to crop image on iOS and Android

Image Zoom and Cropping plugin for Flutter A simple and easy used flutter plugin to crop image on iOS and Android. Installation Add simple_image_crop

Dec 14, 2021
Backs up Android devices on Linux, macOS and Windows. Backup your device without vendor lock-ins, using insecure software or root.

Backs up Android devices on Linux, macOS and Windows. Backup your device without vendor lock-ins, using insecure software or root. Supports encryption and compression out of the box.

Jun 20, 2022
Spider - A small dart library to generate Assets dart code from assets folder.
Spider - A small dart library to generate Assets dart code from assets folder.

Spider A small dart library to generate Assets dart code from assets folder. It generates dart class with static const variables in it which can be us

Jun 22, 2022
The typesafe, reactive, and lightweight SQLite abstraction for your Flutter applications
The typesafe, reactive, and lightweight SQLite abstraction for your Flutter applications

See the project's website for the full documentation. Floor provides a neat SQLite abstraction for your Flutter applications inspired by the Room pers

Jun 27, 2022
Flutter-fb-integration - Flutter And firebase integration Guide
Flutter-fb-integration - Flutter And firebase integration Guide

Quickstart Guide This project still use my firebase server config, if you want t

Feb 2, 2022
Getx and Dio APi-Integration - Flutter RestApi Integration using Dio
Getx and Dio APi-Integration - Flutter RestApi Integration using Dio

Flutter RestApi Integration using Dio. Click this image to find videos==> //Crud

Jun 24, 2022
FLutter Api Integration - Flutter Rest API Integration
FLutter Api Integration - Flutter Rest API Integration

Flutter_Rest_Api_integration Flutter_Rest_Api_integration. Preview How To Use To

Feb 17, 2022
Flutterbodydetection - A flutter plugin that uses MLKit on iOS/Android platforms to enable body pose and mask detection using Pose Detection and Selfie Segmentation APIs for both static images and live camera stream.
Flutterbodydetection - A flutter plugin that uses MLKit on iOS/Android platforms to enable body pose and mask detection using Pose Detection and Selfie Segmentation APIs for both static images and live camera stream.

body_detection A flutter plugin that uses MLKit on iOS/Android platforms to enable body pose and mask detection using Pose Detection and Selfie Segmen

Apr 26, 2022
Simple app for both Android and Windows to sync Audio Trip songs from the Audio Trip Choreography Discord

ATCD Choreography Sync Simple app for both Android (Oculus Quest native) and Windows (PCVR) to sync Audio Trip songs from the Audio Trip Choreography

Jun 12, 2022
A Dart Build Plugin that uploads debug symbols for Android, iOS/macOS and source maps for Web to Sentry via sentry-cli

Sentry Dart Plugin A Dart Build Plugin that uploads debug symbols for Android, iOS/macOS and source maps for Web to Sentry via sentry-cli. For doing i

Jun 6, 2022
Ml kit ocr - Plugin which provides native ML Kit OCR APIs

MLKit OCR Plugin which provides native ML Kit OCR APIs Requirements Android Set

Apr 4, 2022