From 409cb3b4d1dd2a049c93b4799b60a2baaa4d86fa Mon Sep 17 00:00:00 2001 From: Kyle Bolen Date: Tue, 28 Jul 2026 05:08:32 +0000 Subject: [PATCH] Fix doubled photos: /sdcard is a symlink to /storage/emulated/0 Scanning both paths listed every photo twice. Now only scan /storage/emulated/0/DCIM which is the canonical path. --- .../bolenpad/photophetch/device/AndroidConnector.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/com/bolenpad/photophetch/device/AndroidConnector.kt b/src/main/kotlin/com/bolenpad/photophetch/device/AndroidConnector.kt index 870fe11..cfb8453 100644 --- a/src/main/kotlin/com/bolenpad/photophetch/device/AndroidConnector.kt +++ b/src/main/kotlin/com/bolenpad/photophetch/device/AndroidConnector.kt @@ -27,9 +27,8 @@ class AndroidConnector( // Directories on Android that contain camera-roll originals. // Used as fallback if dynamic DCIM discovery finds nothing. private val fallbackCameraDirs = listOf( - "/sdcard/DCIM/Camera", - "/sdcard/DCIM/100ANDRO", - "/sdcard/Pictures/Camera", + "/storage/emulated/0/DCIM/Camera", + "/storage/emulated/0/Pictures/Camera", ) // Photo/video extensions to include @@ -66,8 +65,9 @@ class AndroidConnector( val serial = requireSerial(device) val photos = mutableListOf() - // Dynamically discover all subdirectories under DCIM on common storage paths - val dcimRoots = listOf("/sdcard/DCIM", "/storage/emulated/0/DCIM") + // /sdcard is a symlink to /storage/emulated/0 on most Android devices. + // Scan only /storage/emulated/0/DCIM to avoid listing every photo twice. + val dcimRoots = listOf("/storage/emulated/0/DCIM") val cameraDirs = mutableListOf() for (root in dcimRoots) { @@ -80,7 +80,6 @@ class AndroidConnector( } // Also check Pictures/Camera (some Samsung models store there) - cameraDirs.add("/sdcard/Pictures/Camera") cameraDirs.add("/storage/emulated/0/Pictures/Camera") // Fall back to hardcoded list if dynamic discovery found nothing