Skip to content

Commit eabb469

Browse files
authored
Merge pull request #213 from CaiJingLong/add-orientation
Add orientation.
2 parents 3d2589a + 11299ba commit eabb469

File tree

11 files changed

+60
-28
lines changed

11 files changed

+60
-28
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## 0.5.0-dev.1
44

5+
Feature:
6+
7+
- Add `orientation` for `AssetEntity`.
8+
59
Update
610

711
- **Breaking change**, Split video filter and image filter

android/src/main/kotlin/top/kikt/imagescanner/core/entity/AssetEntity.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ data class AssetEntity(
1212
val height: Int,
1313
val type: Int,
1414
val displayName: String,
15-
val modifiedDate: Long
15+
val modifiedDate: Long,
16+
val orientation:Int
1617
) {
1718
var lat: Double? = null
1819
var lng: Double? = null

android/src/main/kotlin/top/kikt/imagescanner/core/utils/AndroidQDBUtils.kt

+8-6
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ object AndroidQDBUtils : IDBUtils {
122122
val height = cursor.getInt(MediaStore.MediaColumns.HEIGHT)
123123
val displayName = cursor.getString(MediaStore.Images.Media.DISPLAY_NAME)
124124
val modifiedDate = cursor.getLong(MediaStore.MediaColumns.DATE_MODIFIED)
125-
126-
val asset = AssetEntity(id, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate)
125+
val orientation: Int = cursor.getInt(MediaStore.MediaColumns.ORIENTATION)
126+
val asset = AssetEntity(id, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate, orientation)
127127
list.add(asset)
128128
cache.putAsset(asset)
129129
}
@@ -176,8 +176,9 @@ object AndroidQDBUtils : IDBUtils {
176176
val height = cursor.getInt(MediaStore.MediaColumns.HEIGHT)
177177
val displayName = cursor.getString(MediaStore.Images.Media.DISPLAY_NAME)
178178
val modifiedDate = cursor.getLong(MediaStore.MediaColumns.DATE_MODIFIED)
179-
180-
val asset = AssetEntity(id, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate)
179+
val orientation:Int = cursor.getInt(MediaStore.MediaColumns.ORIENTATION)
180+
181+
val asset = AssetEntity(id, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate, orientation)
181182
list.add(asset)
182183
cache.putAsset(asset)
183184
}
@@ -212,8 +213,9 @@ object AndroidQDBUtils : IDBUtils {
212213
val height = cursor.getInt(MediaStore.MediaColumns.HEIGHT)
213214
val displayName = cursor.getString(MediaStore.MediaColumns.DISPLAY_NAME)
214215
val modifiedDate = cursor.getLong(MediaStore.MediaColumns.DATE_MODIFIED)
215-
216-
val dbAsset = AssetEntity(databaseId, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate)
216+
val orientation:Int = cursor.getInt(MediaStore.MediaColumns.ORIENTATION)
217+
218+
val dbAsset = AssetEntity(databaseId, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate, orientation)
217219
cacheContainer.putAsset(dbAsset)
218220

219221
cursor.close()

android/src/main/kotlin/top/kikt/imagescanner/core/utils/ConvertUtils.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package top.kikt.imagescanner.core.utils
22

33
import top.kikt.imagescanner.AssetType
4-
import top.kikt.imagescanner.core.entity.*
4+
import top.kikt.imagescanner.core.entity.AssetEntity
5+
import top.kikt.imagescanner.core.entity.FilterCond
6+
import top.kikt.imagescanner.core.entity.FilterOption
7+
import top.kikt.imagescanner.core.entity.GalleryEntity
58

69
/// create 2019-09-05 by cai
710

@@ -39,6 +42,7 @@ object ConvertUtils {
3942
"createDt" to entity.createDt / 1000,
4043
"width" to entity.width,
4144
"height" to entity.height,
45+
"orientation" to entity.orientation,
4246
"modifiedDt" to entity.modifiedDate,
4347
"lat" to entity.lat,
4448
"lng" to entity.lng,

android/src/main/kotlin/top/kikt/imagescanner/core/utils/DBUtils.kt

+6-3
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,9 @@ object DBUtils : IDBUtils {
168168

169169
val lat = cursor.getDouble(MediaStore.Images.ImageColumns.LATITUDE)
170170
val lng = cursor.getDouble(MediaStore.Images.ImageColumns.LONGITUDE)
171+
val orientation:Int = cursor.getInt(MediaStore.MediaColumns.ORIENTATION)
171172

172-
val asset = AssetEntity(id, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate)
173+
val asset = AssetEntity(id, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate,orientation)
173174

174175
if (lat != 0.0) {
175176
asset.lat = lat
@@ -232,8 +233,9 @@ object DBUtils : IDBUtils {
232233

233234
val lat = cursor.getDouble(MediaStore.Images.ImageColumns.LATITUDE)
234235
val lng = cursor.getDouble(MediaStore.Images.ImageColumns.LONGITUDE)
236+
val orientation:Int = cursor.getInt(MediaStore.MediaColumns.ORIENTATION)
235237

236-
val asset = AssetEntity(id, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate)
238+
val asset = AssetEntity(id, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate, orientation)
237239

238240
if (lat != 0.0) {
239241
asset.lat = lat
@@ -279,8 +281,9 @@ object DBUtils : IDBUtils {
279281
val modifiedDate = cursor.getLong(MediaStore.MediaColumns.DATE_MODIFIED)
280282
val lat = cursor.getDouble(MediaStore.Images.ImageColumns.LATITUDE)
281283
val lng = cursor.getDouble(MediaStore.Images.ImageColumns.LONGITUDE)
284+
val orientation:Int = cursor.getInt(MediaStore.MediaColumns.ORIENTATION)
282285

283-
val dbAsset = AssetEntity(databaseId, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate)
286+
val dbAsset = AssetEntity(databaseId, path, duration, date, width, height, getMediaType(type), displayName, modifiedDate, orientation)
284287

285288
if (lat != 0.0) {
286289
dbAsset.lat = lat

android/src/main/kotlin/top/kikt/imagescanner/core/utils/IDBUtils.kt

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ interface IDBUtils {
3333
MediaStore.MediaColumns.BUCKET_DISPLAY_NAME, // dir name 目录名字
3434
MediaStore.MediaColumns.WIDTH, //
3535
MediaStore.MediaColumns.HEIGHT, //
36+
MediaStore.MediaColumns.ORIENTATION, // 角度
3637
MediaStore.MediaColumns.DATE_MODIFIED, // 修改时间
3738
MediaStore.MediaColumns.MIME_TYPE, //
3839
MediaStore.MediaColumns.DATE_TAKEN //日期
@@ -48,6 +49,7 @@ interface IDBUtils {
4849
MediaStore.MediaColumns.DATE_TAKEN, //日期
4950
MediaStore.MediaColumns.WIDTH, //
5051
MediaStore.MediaColumns.HEIGHT, //
52+
MediaStore.MediaColumns.ORIENTATION, // 角度
5153
MediaStore.MediaColumns.DATE_MODIFIED, // 修改时间
5254
MediaStore.MediaColumns.MIME_TYPE, //
5355
MediaStore.MediaColumns.DURATION //时长

example/lib/page/detail_page.dart

+8-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@ import 'package:photo_manager/photo_manager.dart';
77
class DetailPage extends StatefulWidget {
88
final File file;
99
final AssetEntity entity;
10-
final String mediaUrl;
11-
const DetailPage({Key key, this.file, this.entity,this.mediaUrl, }) : super(key: key);
10+
final String mediaUrl;
11+
const DetailPage({
12+
Key key,
13+
this.file,
14+
this.entity,
15+
this.mediaUrl,
16+
}) : super(key: key);
1217

1318
@override
1419
_DetailPageState createState() => _DetailPageState();
@@ -78,6 +83,7 @@ class _DetailPageState extends State<DetailPage> {
7883
buildInfoItem("create", entity.createDateTime.toString()),
7984
buildInfoItem("modified", entity.modifiedDateTime.toString()),
8085
buildInfoItem("size", entity.size.toString()),
86+
buildInfoItem("orientation", entity.orientation.toString()),
8187
buildInfoItem("duration", entity.videoDuration.toString()),
8288
buildInfoItemAsync("title", entity.titleAsync),
8389
buildInfoItem("lat", lat?.toString() ?? "null"),

example/lib/widget/image_item_widget.dart

+11-12
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,7 @@ class _ImageItemWidgetState extends State<ImageItemWidget> {
2626
Widget image;
2727

2828
if (u8List != null) {
29-
return Image.memory(
30-
u8List,
31-
width: size.toDouble(),
32-
height: size.toDouble(),
33-
fit: BoxFit.cover,
34-
);
29+
return _buildImageWidget(item, u8List, size);
3530
} else {
3631
image = FutureBuilder<Uint8List>(
3732
future: item.thumbDataWithSize(size, size),
@@ -44,12 +39,7 @@ class _ImageItemWidgetState extends State<ImageItemWidget> {
4439
}
4540
if (snapshot.hasData) {
4641
ImageLruCache.setData(item, size, snapshot.data);
47-
w = FittedBox(
48-
fit: BoxFit.cover,
49-
child: Image.memory(
50-
snapshot.data,
51-
),
52-
);
42+
w = _buildImageWidget(item, snapshot.data, size);
5343
} else {
5444
w = Center(
5545
child: loadWidget,
@@ -64,6 +54,15 @@ class _ImageItemWidgetState extends State<ImageItemWidget> {
6454
return image;
6555
}
6656

57+
Widget _buildImageWidget(AssetEntity entity, Uint8List uint8list, num size) {
58+
return Image.memory(
59+
uint8list,
60+
width: size.toDouble(),
61+
height: size.toDouble(),
62+
fit: BoxFit.cover,
63+
);
64+
}
65+
6766
@override
6867
void didUpdateWidget(ImageItemWidget oldWidget) {
6968
super.didUpdateWidget(oldWidget);

ios/Classes/PHAsset+PHAsset_checkType.m

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ -(bool)isVideo{
1717
return [self mediaType] == PHAssetMediaTypeVideo;
1818
}
1919

20+
-(bool)isAudio{
21+
return [self mediaType] == PHAssetMediaTypeAudio;
22+
}
23+
2024
-(bool)isImageOrVideo{
2125
return [self isVideo] || [self isImage];
2226
}

lib/src/entity.dart

+9-3
Original file line numberDiff line numberDiff line change
@@ -263,11 +263,11 @@ class AssetEntity {
263263
Future<bool> get exists => PhotoManager._assetExistsWithId(id);
264264

265265
/// The url is provided to some video player. Such as [flutter_ijkplayer](https://pub.dev/packages/flutter_ijkplayer)
266-
///
266+
///
267267
/// It is such as `file:///var/mobile/Media/DCIM/118APPLE/IMG_8371.MOV` in iOS.
268-
///
268+
///
269269
/// Android28 or lower: `file:///storage/emulated/0/DCIM/Camera/20201020_202020.MP4`
270-
///
270+
///
271271
/// AndroidQ or higher: `content://media/external/video/media/894857`
272272
Future<String> getMediaUrl() {
273273
if (type == AssetType.video) {
@@ -276,6 +276,12 @@ class AssetEntity {
276276
return null;
277277
}
278278

279+
/// Orientation of android MediaStore. See [ORIENTATION](https://developer.android.com/reference/android/provider/MediaStore.MediaColumns#ORIENTATION)
280+
/// Example values for android: 0 90 180 270
281+
///
282+
/// The value always 0 in iOS.
283+
int orientation;
284+
279285
@override
280286
int get hashCode {
281287
return id.hashCode;

lib/src/utils/convert_utils.dart

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class ConvertUtils {
3636
..createDtSecond = item["createDt"]
3737
..width = item["width"]
3838
..height = item["height"]
39+
..orientation = (item["orientation"] ?? 0)
3940
..duration = item["duration"]
4041
..modifiedDateSecond = item["modifiedDt"]
4142
..typeInt = item["type"]

0 commit comments

Comments
 (0)