From a44d9da2ea56650ce2d1c71f043c98e856504ebb Mon Sep 17 00:00:00 2001 From: Wenqi Li Date: Sun, 10 Jan 2021 21:43:18 +0800 Subject: [PATCH] add mimeType attribute in Medium --- .../morbit/photogallery/PhotoGalleryPlugin.kt | 8 ++++++++ ios/Classes/SwiftPhotoGalleryPlugin.swift | 17 +++++++++++++++++ lib/src/models/medium.dart | 10 ++++++++++ 3 files changed, 35 insertions(+) diff --git a/android/src/main/kotlin/com/morbit/photogallery/PhotoGalleryPlugin.kt b/android/src/main/kotlin/com/morbit/photogallery/PhotoGalleryPlugin.kt index 2455480..07cf56e 100644 --- a/android/src/main/kotlin/com/morbit/photogallery/PhotoGalleryPlugin.kt +++ b/android/src/main/kotlin/com/morbit/photogallery/PhotoGalleryPlugin.kt @@ -56,6 +56,7 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler { MediaStore.Images.Media._ID, MediaStore.Images.Media.WIDTH, MediaStore.Images.Media.HEIGHT, + MediaStore.Images.Media.MIME_TYPE, MediaStore.Images.Media.DATE_TAKEN, MediaStore.Images.Media.DATE_MODIFIED ) @@ -64,6 +65,7 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler { MediaStore.Video.Media._ID, MediaStore.Video.Media.WIDTH, MediaStore.Video.Media.HEIGHT, + MediaStore.Video.Media.MIME_TYPE, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.DATE_TAKEN, MediaStore.Video.Media.DATE_MODIFIED @@ -587,12 +589,14 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler { val idColumn = cursor.getColumnIndex(MediaStore.Images.Media._ID) val widthColumn = cursor.getColumnIndex(MediaStore.Images.Media.WIDTH) val heightColumn = cursor.getColumnIndex(MediaStore.Images.Media.HEIGHT) + val mimeColumn = cursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE) val dateTakenColumn = cursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN) val dateModifiedColumn = cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED) val id = cursor.getLong(idColumn) val width = cursor.getLong(widthColumn) val height = cursor.getLong(heightColumn) + val mimeType = cursor.getString(mimeColumn) var dateTaken: Long? = null if (cursor.getType(dateTakenColumn) == FIELD_TYPE_INTEGER) { dateTaken = cursor.getLong(dateTakenColumn) @@ -607,6 +611,7 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler { "mediumType" to imageType, "width" to width, "height" to height, + "mimeType" to mimeType, "creationDate" to dateTaken, "modifiedDate" to dateModified ) @@ -616,6 +621,7 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler { val idColumn = cursor.getColumnIndex(MediaStore.Video.Media._ID) val widthColumn = cursor.getColumnIndex(MediaStore.Video.Media.WIDTH) val heightColumn = cursor.getColumnIndex(MediaStore.Video.Media.HEIGHT) + val mimeColumn = cursor.getColumnIndex(MediaStore.Video.Media.MIME_TYPE) val durationColumn = cursor.getColumnIndex(MediaStore.Video.Media.DURATION) val dateTakenColumn = cursor.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN) val dateModifiedColumn = cursor.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED) @@ -623,6 +629,7 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler { val id = cursor.getLong(idColumn) val width = cursor.getLong(widthColumn) val height = cursor.getLong(heightColumn) + val mimeType = cursor.getString(mimeColumn) val duration = cursor.getLong(durationColumn) var dateTaken: Long? = null if (cursor.getType(dateTakenColumn) == FIELD_TYPE_INTEGER) { @@ -638,6 +645,7 @@ class PhotoGalleryPlugin : FlutterPlugin, MethodCallHandler { "mediumType" to videoType, "width" to width, "height" to height, + "mimeType" to mimeType, "duration" to duration, "creationDate" to dateTaken, "modifiedDate" to dateModified diff --git a/ios/Classes/SwiftPhotoGalleryPlugin.swift b/ios/Classes/SwiftPhotoGalleryPlugin.swift index 1b7a04c..97e3504 100644 --- a/ios/Classes/SwiftPhotoGalleryPlugin.swift +++ b/ios/Classes/SwiftPhotoGalleryPlugin.swift @@ -376,9 +376,11 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin { } private func getMediumFromAsset(asset: PHAsset) -> [String: Any?] { + let mimeType = self.extractMimeTypeFromAsset(asset: asset) return [ "id": asset.localIdentifier, "mediumType": toDartMediumType(value: asset.mediaType), + "mimeType": mimeType, "height": asset.pixelHeight, "width": asset.pixelWidth, "duration": NSInteger(asset.duration * 1000), @@ -435,6 +437,16 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin { return "." + ext } + private func extractMimeTypeFromUTI(uti: String?) -> String? { + guard let assetUTI = uti else { + return nil + } + guard let mimeType = UTTypeCopyPreferredTagWithClass(assetUTI as CFString, kUTTagClassMIMEType as CFString)?.takeRetainedValue() as String? else { + return nil + } + return mimeType + } + private func extractUTIFromAsset(asset: PHAsset) -> String? { if #available(iOS 9, *) { let resourceList = PHAssetResource.assetResources(for: asset) @@ -450,6 +462,11 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin { return self.extractFileExtensionFromUTI(uti: uti) } + private func extractMimeTypeFromAsset(asset: PHAsset) -> String? { + let uti = self.extractUTIFromAsset(asset: asset) + return self.extractMimeTypeFromUTI(uti: uti) + } + private func cachePath() -> URL { let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask) let cacheFolder = paths[0].appendingPathComponent("photo_gallery") diff --git a/lib/src/models/medium.dart b/lib/src/models/medium.dart index f5a08c6..7c629d3 100644 --- a/lib/src/models/medium.dart +++ b/lib/src/models/medium.dart @@ -17,6 +17,9 @@ class Medium { /// The medium height. final int height; + /// The medium mimeType. + final String mimeType; + /// The duration of video final int duration; @@ -31,6 +34,7 @@ class Medium { this.mediumType, this.width, this.height, + this.mimeType, this.duration, this.creationDate, this.modifiedDate, @@ -42,6 +46,7 @@ class Medium { mediumType = jsonToMediumType(json["mediumType"]), width = json["width"], height = json["height"], + mimeType = json["mimeType"], duration = json['duration'] ?? 0, creationDate = json['creationDate'] != null ? DateTime.fromMillisecondsSinceEpoch(json['creationDate']) @@ -56,6 +61,7 @@ class Medium { mediumType: jsonToMediumType(map['mediumType']), width: map['width'], height: map['height'], + mimeType: map["mimeType"], creationDate: map['creationDate'], modifiedDate: map['modifiedDate'], ); @@ -66,6 +72,7 @@ class Medium { "id": this.id, "mediumType": mediumTypeToJson(this.mediumType), "height": this.height, + "mimeType": this.mimeType, "width": this.width, "creationDate": this.creationDate, "modifiedDate": this.modifiedDate, @@ -104,6 +111,7 @@ class Medium { mediumType == other.mediumType && width == other.width && height == other.height && + mimeType == other.mimeType && creationDate == other.creationDate && modifiedDate == other.modifiedDate; @@ -113,6 +121,7 @@ class Medium { mediumType.hashCode ^ width.hashCode ^ height.hashCode ^ + mimeType.hashCode ^ creationDate.hashCode ^ modifiedDate.hashCode; @@ -122,6 +131,7 @@ class Medium { 'mediumType: $mediumType, ' 'width: $width, ' 'height: $height, ' + 'mimeType: $mimeType, ' 'creationDate: $creationDate, ' 'modifiedDate: $modifiedDate}'; }