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

Overview

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

Comments
  • [BUG] Video AssetImage.file loads extremely long on iOS even though isLocal == true. AssetImage.originFile loads instantly

    [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)
    Sort: Enhancement Sort: Performance Platform: iOS Type: Video Type: Photo library Status: Have use case 
    opened by timcreatedit 35
  • [BUG] Duplicate images on iOS are sorted differently from ios

    [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.

    
    
    Type: Help wanted Status: Fixed Type: Pagination Platform: iOS Type: Photo library PR welcomed Status: Have use case 
    opened by iosephmagno 34
  • [BUG] Functions getAssetListRange and getAssetListPaged returning images only for first invocation

    [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

    Sort: BUG Platform: Android Type: Pagination Android 10 Type: Photo library Status: Have use case Status: Need investigate 
    opened by adamCPP 30
  • [BUG] Some of the videos not showing in picker

    [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.

    Sort: BUG Type: Help wanted Platform: Android Type: Video Status: Have use case 
    opened by NaikSoftware 27
  • [BUG] Edited video are not displayed correctly

    [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(() {});
        });
      }
    
    Sort: BUG Platform: iOS Type: Video Sort: Out of support 
    opened by Tom3652 25
  • this pacakge not working well in android version11.

    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 )

    Sort: Performance Android 11 
    opened by soroutarchana 25
  • [BUG]kotlin.KotlinNullPointerException

    [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)

    Platform: Android Status: Need more info 
    opened by github0911 23
  • iOS is returning uneditied image[BUG]

    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

    Sort: BUG Status: Need response Platform: iOS 
    opened by barrettbreshears 17
  • call to getAssetPathList takes excessively long time on some android devices

    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.

    Platform: Android Sort: Performance Status: Need more info Status: Fixed 
    opened by ROTGP 16
  • [BUG] Permission denied on Android 13

    [BUG] Permission denied on Android 13

    Describe the bug On android 13, the app asks for the permission to access photos and video, the pemission is agreed, but the app returns PermissionState.denied. No problems with other versions.

    To Reproduce Steps to reproduce the behavior:

    1. Run result = await PhotoManager.requestPermissionExtend()
    2. Accept the permission dialog
    3. Print results and you'll get PermissionState.denied

    Expected behavior If I accept the permission, the PermissionState should be granted.

    Flutter version Flutter (Channel stable, 3.3.1, on macOS 12.6 21G115 darwin-arm, locale en-US)

    Smartphone (please complete the following information):

    • Device: Pixel 4a 5g
    • OS: Android 13

    Code

    This is the code:

    final PermissionState result = await PhotoManager.requestPermissionExtend();
       print('permission result: $result');//this returns PermissionState.denied
    

    Manifest

        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
            android:maxSdkVersion="32" />
    
        <!-- From android 13 -->
        <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
        <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
        <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    
        <!-- Media location permission-->
        <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
    
        <uses-permission android:name="android.permission.READ_CONTACTS" />
        <uses-permission android:name="android.permission.WRITE_CONTACTS" />
        <uses-permission android:name="android.permission.CAMERA" />
    
        <application
            android:name=".MyApplication"
            android:icon="@mipmap/ic_launcher"
            android:label="MyFamily"
            android:requestLegacyExternalStorage="true"
            >
            ....
    
    Sort: Invalid Status: Need more info Invalid: Not reproducible 
    opened by rignaneseleo 15
  • [Feature Request] Add possibility to display video's first frame when retrieving their thumbnail

    [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
    Sort: Enhancement Status: Fixed Type: Video Status: Have use case 
    opened by Tom3652 14
  • [BUG]saveImage failed on  the device Xiaomi note5 when first run app

    [BUG]saveImage failed on the device Xiaomi note5 when first run app

    when I first run the flutter_wechat_assets_picker:7.2.0 example, I miss a bug! when I click confirm button on the camera priview page, i get nothing, the page go back to the camera page! and the picture can not be found on the album!if I do run again, everything ok ! I can find the picture on the album! the test device info is below! image

    What puzzles me is that the first installation is not good, and running it again can do this

    To Reproduce Steps to reproduce the behavior:

    1. run flutter_wechat_assets_picker example,Multi->Pick from camera
    2. Click on the Special button,into the camera preview page,
    3. take picture and go to the picture preview,the click the confirm button,
    4. then picture preview go back,nothing show! and no picture to album.

    Expected behavior picture can be save to album!

    Flutter version [✓] Flutter (Channel stable, 2.10.5, on macOS 12.3 21E230 darwin-arm, locale zh-Hans-CN) • Flutter version 2.10.5 at /Users/sanyu/.fvm/versions/2.10.5 • Upstream repository https://github.com/flutter/flutter.git • Framework revision 5464c5bac7 (7 months ago), 2022-04-18 09:55:37 -0700 • Engine revision 57d3bac3dd • Dart version 2.16.2 • DevTools version 2.9.2 • Pub download mirror https://pub.flutter-io.cn • Flutter download mirror https://storage.flutter-io.cn

    [✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0) • Android SDK at /Users/sanyu/Library/Android/sdk • Platform android-33, build-tools 33.0.0 • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840) • All Android licenses accepted.

    [✓] Xcode - develop for iOS and macOS (Xcode 13.4.1) • Xcode at /Applications/Xcode.app/Contents/Developer • CocoaPods version 1.11.3

    [✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

    [✓] Android Studio (version 2021.2) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840)

    some permisson config as below android:requestLegacyExternalStorage="true"

    What I find the problem is when I click confirm, it use the PhotoManager.editor.saveImage method and return null! I do not thnow why! the Permission dialog was shown and granted the permission,but No effect!

    Sort: BUG Platform: Android Type: Photo library Status: Need investigate From: Pickers Android 10- 
    opened by clycheng2015 6
  • How to save image or video in an album [IOS]

    How to save image or video in an album [IOS]

    Expect

    in Android I can save relativePath like 'Pictures/MyAlbum/' and load Images or Videos I saved in AssetPathEntity with name is MyAlbum but it not in IOS

    final entity = await PhotoManager.editor.saveVideo(
            file,
            relativePath: Platform.isAndroid ? 'Pictures/MyAlbum/' : 'MyAlbum/,
            title: file.path.split('/').last, 
          );
    

    I see you have function PhotoManager.editor.copyAssetToPath have copy to AssetPathEntity, can you suppor save Image or Video use AssetPathEntity if you can support save use AssetPathEntity I can save to any albums I want

    opened by tvqphong001 0
  • [BUG] Deleted asset ids from addChangeCallback don't match with the existing asset ids

    [BUG] Deleted asset ids from addChangeCallback don't match with the existing asset ids

    Describe the bug I would like to update my custom gallery in the app when a user deletes photos from the app gallery. I listen changes by addChangeCallback method. When the user deletes some images from the app gallery, this callback gets called with some ids that represent deleted asset ids. The problem is, these deleted ids don't match with the fetched asset ids which obtained by getAssetListRange method.

    Here is the code example I use to fetch images:

    List<AssetEntity> allPhotos = [];
    
    getPhotos();
    
    getPhotos() async {
      List<AssetPathEntity> _albums = await PhotoManager.getAssetPathList(
        type: RequestType.image,
        onlyAll: true,
      );
      for (AssetPathEntity _album in _albums) {
        await addPhotosOfAlbum(_album);
      }
    }
    
    Future addPhotosOfAlbum(AssetPathEntity _album) async {
      List<AssetEntity> _photos = await _album.getAssetListRange(
        start: 0,
        end: 3000,
      );
      allPhotos.addAll(_photos);
    }
    

    Here is the code example I listen app gallery changes:

    PhotoManager.addChangeCallback(
      (MethodCall c) => handleGalleryChange(c.arguments),
    );
    
    handleGalleryChange(dynamic change) async {
      List<dynamic> _delete = (change["delete"] ?? []) as List<dynamic>;
    
      if (Platform.isAndroid) {
        String _type = change["type"] ?? "";
        if (change["id"] != null) {
          if (_type == "delete") {
            _delete.add({"id": change["id"]});
          }
        }
      }
    
      if (_delete.isNotEmpty) {
        List<String> ids = _delete.map((e) => e["id"].toString()).toList();
        await deletePhotos(ids);
      }
    }
    
    deletePhotos(List<String> ids) async {
      for (String id in ids) {
        // THE PROBLEM IS HERE. THE ID CANNOT BE FOUND IN ALL_PHOTOS. 
        final _photo = allPhotos.firstWhereOrNull((a) => a.id == id);
        // _PHOTO RETURNS NULL.
        allPhotos.remove(_photo);
      }
    }
    

    I am not sure if it is a bug or I am doing something wrong.

    To Reproduce Steps to reproduce the behavior:

    1. Get photos via getAssetListRange method.
    2. Listen app gallery changes via addChangeCallback method.

    Expected behavior 3. I expect addChangeCallback returns ids that matches with ids that comes with getAssetListRange method.

    Flutter version Flutter version 3.3.6 PhotoManager version: 2.4.1

    Smartphone (please complete the following information):

    • Device: iPhone 12 mini
    • OS: iOS 16.0
    • Browser: Firefox
    • Version 106
    opened by arazosman 0
  • [Feature] Support platform interface architecture

    [Feature] Support platform interface architecture

    New Flutter plugins support platform interfaces by default. In order to support (maybe) more platforms in the future, we should consider migrating the current implementation to the platform interface architecture.

    Plugins that are under the platform interface architecture:

    • https://github.com/flutter/plugins
    • https://github.com/firebase/flutterfire
    Platform: Dart (package) PR welcomed Sort: Goal Status: Need investigate Package: Flutter 
    opened by AlexV525 0
Releases(2.5.0)
  • 2.5.0(Nov 4, 2022)

    What's Changed

    • Support saving Live Photos on iOS and macOS. (#851)
    • Introduce DarwinEditor to replace IosEditor. (#855)

    New Contributors

    • @ua741 made their first contribution in https://github.com/fluttercandies/flutter_photo_manager/pull/851

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.4.1...2.5.0

    Source code(tar.gz)
    Source code(zip)
  • 2.4.1(Oct 19, 2022)

    What's Changed

    • ⚡️ [Android] Use AssetEntity.modifiedDate for Glide cache key by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/848

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.4.0...2.4.1

    Source code(tar.gz)
    Source code(zip)
  • 2.4.0(Oct 10, 2022)

    What's Changed

    Features

    • Support both legacy and scoped storage on Android. (#833)

    Fixes

    • Avoid duplicate copyItemAtURL for videos on iOS. (#840)
    • Correct permission checks with requestPermissionExtend on Android 13. (#843)

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.3.0...2.4.0

    Source code(tar.gz)
    Source code(zip)
  • 2.4.0-dev.3(Oct 7, 2022)

    What's Changed

    • 🐛 [Android] Correct permission checks with requestPermissionExtend on Android 33 by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/843

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.4.0-dev.2...2.4.0-dev.3

    Source code(tar.gz)
    Source code(zip)
  • 2.4.0-dev.2(Oct 5, 2022)

    What's Changed

    • 🐛 [iOS] Avoid duplicate copyItemAtURL by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/840

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.4.0-dev.1...2.4.0-dev.2

    Source code(tar.gz)
    Source code(zip)
  • 2.4.0-dev.1(Sep 21, 2022)

    What's Changed

    • ✨ Fully support scoped storage by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/833

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.3.0...2.4.0-dev.1

    Source code(tar.gz)
    Source code(zip)
  • 2.3.0(Sep 19, 2022)

    What's Changed

    Features

    • Support Android 13 (API 33) permissions.

    Improvements

    • Adapt Flutter 3.3. (#820)
    • Retrieve metadata for videos when empty on Android. (#819)

    Fixes

    • Fix saving videos with the path on Android 29-. (#829)

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.2.1...2.3.0

    Source code(tar.gz)
    Source code(zip)
  • 2.3.0-dev.2(Aug 30, 2022)

    What's Changed

    • 🚀 [Android] Retrieve metadata for videos when empty by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/819
    • ⚡️ Adapt Flutter 3.3 by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/820

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.3.0-dev.1...2.3.0-dev.2

    Source code(tar.gz)
    Source code(zip)
  • 2.3.0-dev.1(Aug 23, 2022)

    What's Changed

    • Feat: support android 13 permission by @CaiJingLong in https://github.com/fluttercandies/flutter_photo_manager/pull/816

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.2.1...2.3.0-dev.1

    Source code(tar.gz)
    Source code(zip)
  • 2.2.1(Aug 19, 2022)

    What's Changed

    • [Android] Ignore the existence when saving images with path by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/815

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.2.0...2.2.1

    Source code(tar.gz)
    Source code(zip)
  • 2.2.0(Aug 13, 2022)

    What's Changed

    Breaking changes

    • Introduce AssetPathEntity.assetCountAsync getter, which improves the speed when loading paths mainly on iOS, also:
      • Deprecate AssetPathEntity.assetCount.
      • Remove FilterOptionGroup.containsEmptyAlbum.

    Improvements

    • Improve asset change notify with better methods of signature and checks. (#790)
    • Add PermissionState.hasAccess getter for better condition judgement. (#792)
    • Remove unnecessary assets fetch in getMediaUrl on iOS. (#793)
    • Improve AssetEntity.obtainForNewProperties on iOS. (#794)
    • Improve MD5Utils on iOS. (#802)
    • Improve cache container mutations on iOS. (#803)
    • Improve assets count assignments. (#804)
    • Improve cursor conversion on Android. (#806)

    Fixes

    • Purpose video creation correctly on iOS. (#791)
    • Mark assets as favorited on iOS. (#794)
    • Fix not replied method calls (#800).
    • Fix invalid RELATIVE_PATH obtains with cursors on Android Q-. (#810)

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.1.4...2.2.0

    Source code(tar.gz)
    Source code(zip)
  • 2.2.0-dev.5(Aug 4, 2022)

    What's Changed

    • 🐛 [Android] Use RELATIVE_PATH only on Android Q+ by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/810

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.2.0-dev.4...2.2.0-dev.5

    Source code(tar.gz)
    Source code(zip)
  • 2.2.0-dev.4(Jul 20, 2022)

    What's Changed

    Improvements

    • Improve assets count assignments. (#804)
    • Improve cursor conversion on Android. (#806)

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.2.0-dev.3...2.2.0-dev.4

    Source code(tar.gz)
    Source code(zip)
  • 2.2.0-dev.3(Jul 14, 2022)

    What's Changed

    Improvements

    • Improve MD5Utils on iOS. (#802)
    • Improve cache container mutations on iOS. (#803)

    Fixes

    • Fix not replied method calls (#800).

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.2.0-dev.2...2.2.0-dev.3

    Source code(tar.gz)
    Source code(zip)
  • 2.2.0-dev.2(Jul 7, 2022)

    What's Changed

    Improvements

    • Improve assets change notify with better methods signature and checks. (#790)
    • Add PermissionState.hasAccess getter for better condition judgement. (#792)
    • Remove unnecessary assets fetch in getMediaUrl on iOS. (#793)
    • Improve AssetEntity.obtainForNewProperties on iOS. (#794)

    Fixes

    • Purpose video creation correctly on iOS. (#791)
    • Mark assets as favorite on iOS. (#794)

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.2.0-dev.1...2.2.0-dev.2

    Source code(tar.gz)
    Source code(zip)
  • 2.2.0-dev.1(Jun 28, 2022)

    What's Changed

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

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.1.4...2.2.0-dev.1

    Source code(tar.gz)
    Source code(zip)
  • 2.1.4(Jun 22, 2022)

    What's Changed

    Improvements

    • ⚡️ [iOS] Check canPerformEditOperation before performing change requests by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/782

    Fixes

    • 🐛 [Android] Fix orientation missing during conversions by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/783

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.1.3...2.1.4

    Source code(tar.gz)
    Source code(zip)
  • 2.1.3(Jun 20, 2022)

    What's Changed

    Improvements:

    • Expose PhotoManager.plugin. (#778)

    Fixes:

    • Fix forceOldApi not well-called. (#778)
    • Fix invalid type cast with AssetEntity.exists. (#777)

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.1.2...2.1.3

    Source code(tar.gz)
    Source code(zip)
  • 2.1.2(May 30, 2022)

    What's Changed

    • ✏️ Correct PermissionRequestOption with a class type alias by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/770
    • 🥅 [Android] Catch throwables when reading EXIF by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/771
    • 🐛 [iOS] Improve Live-Photos filtering by @yu840915 in https://github.com/fluttercandies/flutter_photo_manager/pull/772

    New Contributors

    • @yu840915 made their first contribution in https://github.com/fluttercandies/flutter_photo_manager/pull/772

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.1.1...2.1.2

    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(May 16, 2022)

    What's Changed

    • 🚑️ [Android] Protect cursors convert by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/761
    • 🐛 [Android] Fix ACCESS_MEDIA_LOCATION checks by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/765
    • 🔊 Present exceptions in the image provider when debugging by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/766

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.1.0...2.1.1

    Source code(tar.gz)
    Source code(zip)
  • 2.1.0+2(May 13, 2022)

    What's Changed

    • 🚀 Support Flutter 3 by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/760

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.9...2.1.0+2

    Source code(tar.gz)
    Source code(zip)
  • 2.0.9(May 11, 2022)

    What's Changed

    Improvements:

    • Ignore the null-aware operator for PaintingBinding's instance in order to solve the coming lint issues with Flutter 2.13, and keeps the compatibility of previous Flutter versions.
    • Fix dart docs generate issues.

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.8...2.0.9

    Source code(tar.gz)
    Source code(zip)
  • 2.0.8(Apr 26, 2022)

    What's Changed

    Improvements

    • ⚡️ [Android] Using ContentResolver as much as possible by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/755

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.7...2.0.8

    Source code(tar.gz)
    Source code(zip)
  • 2.0.7(Apr 6, 2022)

    What's Changed

    Fixes

    • Fix assets pagination issues on Android 29+ by @CaiJingLong in https://github.com/fluttercandies/flutter_photo_manager/pull/748

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.6...2.0.7

    Source code(tar.gz)
    Source code(zip)
  • 2.0.6(Mar 26, 2022)

    What's Changed

    • Modify the reference method of PMLogUtils.h by @CaiJingLong in https://github.com/fluttercandies/flutter_photo_manager/pull/744
    • Fix ios clear cache by @CaiJingLong in https://github.com/fluttercandies/flutter_photo_manager/pull/743

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.5...2.0.6

    Source code(tar.gz)
    Source code(zip)
  • 2.0.5(Mar 25, 2022)

    What's Changed

    • Fix an error of example load more by @CaiJingLong in https://github.com/fluttercandies/flutter_photo_manager/pull/738
    • Modify the titleAsync implementation on iOS. by @CaiJingLong in https://github.com/fluttercandies/flutter_photo_manager/pull/740

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.4...2.0.5

    Source code(tar.gz)
    Source code(zip)
  • 2.0.4(Mar 21, 2022)

    What's Changed

    Fixes:

    • Fix invalid InputStream when saving images on Android by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/736

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.3...2.0.4

    Source code(tar.gz)
    Source code(zip)
  • 2.0.3(Mar 20, 2022)

    What's Changed

    Improvements:

    • Improve getMediaUrl on iOS.
    • Read orientation when saving images on Android by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/730
    • Improve generic type casts on Android by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/732

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.2...2.0.3

    Source code(tar.gz)
    Source code(zip)
  • 2.0.2(Mar 17, 2022)

    What's Changed

    Fixes:

    • Ensure file exists before reading EXIF on Android by @AlexV525 in https://github.com/fluttercandies/flutter_photo_manager/pull/728

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.1...2.0.2

    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Mar 9, 2022)

    What's Changed

    Improvements:

    • Update legacy external storage exception on Android.

    Fixes:

    • Predicate more precise permissions requirements on Android <29. (#723)

    Full Changelog: https://github.com/fluttercandies/flutter_photo_manager/compare/2.0.0...2.0.1

    Source code(tar.gz)
    Source code(zip)
Owner
FlutterCandies
Custom Flutter candies (packages) for you to build your Flutter app easily. Enjoy it!
FlutterCandies
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

Md Abir Ahsan Tahmim 1 Dec 8, 2021
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

Harsh Mistry 12 Jan 31, 2022
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

null 8.3k Nov 19, 2022
Album Image is based in photo_manager package and has the same concept as image_picker but with a more attractive interface to choose an image or video from the device gallery, whether it is Android or iOS

Album Image is based in photo_manager package and has the same concept as image_picker but with a more attractive interface to choose an image or vide

Phuong Vu 2 Oct 13, 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.

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

MindInventory 25 Nov 22, 2022
Integration test - Copy of the official Flutter integration test plugin

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

null 0 Jan 5, 2022
腾讯云 1 Feb 10, 2022
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

null 97 Dec 14, 2021
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

null 332 Nov 7, 2022
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_

Đào Hoàng Sơn 421 Nov 18, 2022
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.

null 229 Nov 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. It generates dart class with static const variables in it which can be us

Birju Vachhani 159 Nov 8, 2022
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

Vitus 777 Nov 12, 2022
Flutter-fb-integration - Flutter And firebase integration Guide

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

Naufal Aldy Pradana 0 Feb 2, 2022
Getx and Dio APi-Integration - Flutter RestApi Integration using Dio

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

Fsd Ramjan 9 Nov 5, 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

atcd 2 Nov 15, 2022
FLutter Api Integration - Flutter Rest API Integration

Flutter_Rest_Api_integration Flutter_Rest_Api_integration. Preview How To Use To

Rahul Ranjan Singh 0 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.

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

null 16 Oct 27, 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

Sentry 31 Nov 19, 2022