diff --git a/mobile/lib/utils/migration.dart b/mobile/lib/utils/migration.dart
index bebd7a027b..6a09f79ce2 100644
--- a/mobile/lib/utils/migration.dart
+++ b/mobile/lib/utils/migration.dart
@@ -3,7 +3,7 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:flutter/widgets.dart';
+import 'package:flutter/foundation.dart';
 import 'package:immich_mobile/domain/models/store.model.dart';
 import 'package:immich_mobile/entities/album.entity.dart';
 import 'package:immich_mobile/entities/android_device_asset.entity.dart';
@@ -17,6 +17,8 @@ import 'package:immich_mobile/infrastructure/entities/store.entity.dart';
 import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
 import 'package:immich_mobile/utils/diff.dart';
 import 'package:isar/isar.dart';
+// ignore: import_rule_photo_manager
+import 'package:photo_manager/photo_manager.dart';
 
 const int targetVersion = 10;
 
@@ -69,14 +71,45 @@ Future<void> _migrateDeviceAsset(Isar db) async {
       : (await db.iOSDeviceAssets.where().findAll())
           .map((i) => _DeviceAsset(assetId: i.id, hash: i.hash))
           .toList();
-  final localAssets = (await db.assets
-          .where()
-          .anyOf(ids, (query, id) => query.localIdEqualTo(id.assetId))
-          .findAll())
-      .map((a) => _DeviceAsset(assetId: a.localId!, dateTime: a.fileModifiedAt))
-      .toList();
-  debugPrint("Device Asset Ids length - ${ids.length}");
-  debugPrint("Local Asset Ids length - ${localAssets.length}");
+
+  final PermissionState ps = await PhotoManager.requestPermissionExtend();
+  if (!ps.hasAccess) {
+    if (kDebugMode) {
+      debugPrint(
+        "[MIGRATION] Photo library permission not granted. Skipping device asset migration.",
+      );
+    }
+
+    return;
+  }
+
+  List<_DeviceAsset> localAssets = [];
+  final List<AssetPathEntity> paths =
+      await PhotoManager.getAssetPathList(onlyAll: true);
+
+  if (paths.isEmpty) {
+    localAssets = (await db.assets
+            .where()
+            .anyOf(ids, (query, id) => query.localIdEqualTo(id.assetId))
+            .findAll())
+        .map(
+          (a) => _DeviceAsset(assetId: a.localId!, dateTime: a.fileModifiedAt),
+        )
+        .toList();
+  } else {
+    final AssetPathEntity albumWithAll = paths.first;
+    final int assetCount = await albumWithAll.assetCountAsync;
+
+    final List<AssetEntity> allDeviceAssets =
+        await albumWithAll.getAssetListRange(start: 0, end: assetCount);
+
+    localAssets = allDeviceAssets
+        .map((a) => _DeviceAsset(assetId: a.id, dateTime: a.modifiedDateTime))
+        .toList();
+  }
+
+  debugPrint("[MIGRATION] Device Asset Ids length - ${ids.length}");
+  debugPrint("[MIGRATION] Local Asset Ids length - ${localAssets.length}");
   ids.sort((a, b) => a.assetId.compareTo(b.assetId));
   localAssets.sort((a, b) => a.assetId.compareTo(b.assetId));
   final List<DeviceAssetEntity> toAdd = [];
@@ -95,15 +128,27 @@ Future<void> _migrateDeviceAsset(Isar db) async {
       return false;
     },
     onlyFirst: (deviceAsset) {
-      debugPrint(
-        'DeviceAsset not found in local assets: ${deviceAsset.assetId}',
-      );
+      if (kDebugMode) {
+        debugPrint(
+          '[MIGRATION] Local asset not found in DeviceAsset: ${deviceAsset.assetId}',
+        );
+      }
     },
     onlySecond: (asset) {
-      debugPrint('Local asset not found in DeviceAsset: ${asset.assetId}');
+      if (kDebugMode) {
+        debugPrint(
+          '[MIGRATION] Local asset not found in DeviceAsset: ${asset.assetId}',
+        );
+      }
     },
   );
-  debugPrint("Total number of device assets migrated - ${toAdd.length}");
+
+  if (kDebugMode) {
+    debugPrint(
+      "[MIGRATION] Total number of device assets migrated - ${toAdd.length}",
+    );
+  }
+
   await db.writeTxn(() async {
     await db.deviceAssetEntitys.putAll(toAdd);
   });