Android-App / Offline-Foto-Entdopplung Android app / offline photo deduplication

Foto Dup Finder

Findet und entfernt doppelte und fast identische Fotos, vollständig offline auf dem Gerät. Ohne Werbung, ohne Konto und ohne Netzwerk-Berechtigung verlässt kein Foto das Smartphone. Finds and removes duplicate and near-duplicate photos, entirely offline on the device. With no ads, no account, and no network permission, no photo ever leaves the phone.

Android Kotlin Jetpack Compose MediaStore SHA-256 & dHash
Offline-first Verarbeitung auf dem Gerät On-device processing
Ohne NetzwerkNo network Keine INTERNET-Berechtigung im Manifest No INTERNET permission in the manifest
Zwei StufenTwo stages Exakte Kopien (SHA-256) und ähnliche Fotos (dHash) Exact copies (SHA-256) and similar photos (dHash)
Android 8+ minSdk 26, targetSdk 36 minSdk 26, targetSdk 36

Google Play

In Sekunden auf dem Smartphone On your phone in seconds

Foto Dup Finder ist kostenpflichtig im Google Play Store verfügbar; Preis und Angebote stehen im Store-Eintrag. Der QR-Code ist für den schnellen Zugriff gedacht, wenn diese Seite auf einem Desktop-Monitor oder Beamer geöffnet ist. Foto Dup Finder is available as a paid app in the Google Play Store; the price and any offers are shown in the listing. The QR code is intended for quick access when this page is open on a desktop monitor or projector.

QR-Code zum Google-Play-Eintrag von Foto Dup Finder
Foto Dup Finder bei Google Play Foto Dup Finder on Google Play

Zwei Arten von Duplikaten Two kinds of duplicates

Die App trennt exakte Kopien von visuell ähnlichen Aufnahmen, damit beim Aufräumen nichts Wertvolles verloren geht. The app separates exact copies from visually similar shots so that nothing valuable is lost during cleanup.

Exakte Kopien Exact copies

Byte-identische Dateien werden über eine günstige Signatur aus Größe sowie Kopf- und Fußbytes vorgefiltert und mit einem vollständigen SHA-256 bestätigt. Byte-identical files are pre-filtered with a cheap signature built from size plus head and tail bytes, then confirmed with a full SHA-256.

Ähnliche Fotos Similar photos

Verkleinerte, neu komprimierte oder leicht bearbeitete Varianten erkennt ein 64-Bit-Wahrnehmungs-Hash (dHash) über einen Hamming-Distanz-Schwellwert. Resized, recompressed, or lightly edited variants are detected with a 64-bit perceptual hash (dHash) using a Hamming-distance threshold.

Sauberes Aufräumen ohne Risiko Safe cleanup without risk

Scan- und Löschabläufe sind auf Nachvollziehbarkeit und Schutz vor versehentlichem Löschen ausgelegt. The scan and delete flows are designed around traceability and protection against accidental deletion.

Gestufte PipelineTiered pipeline

Nur plausibel verdächtige Dateien bekommen einen vollständigen Hash; die Arbeit läuft parallel über alle CPU-Kerne.Only plausible candidates get a full hash, and the work is spread across all CPU cores.

Persistenter IndexPersistent index

Ein lokaler SQLite-Hash-Index sorgt dafür, dass ein erneuter Scan nur neue oder geänderte Dateien liest.A local SQLite hash index means a re-scan only reads new or changed files.

Sicheres LöschenSafe deletion

Gelöscht wird über den System-Bestätigungsdialog oder den System-Papierkorb; MANAGE_EXTERNAL_STORAGE wird nie angefragt.Deletion goes through the system consent dialog or the system trash; MANAGE_EXTERNAL_STORAGE is never requested.

Zwei-Schritt-AufräumenTwo-step cleanup

Entfernen markiert nur vor, ein einziges Apply führt die Löschung aus, mit einer System-Bestätigung für den ganzen Stapel statt einer pro Gruppe.Removing only stages a row; a single Apply performs the removal, with one system confirmation for the whole batch instead of one per group.

Sinnvolle VorauswahlSensible defaults

„Alle außer dem besten“ behält die größte, danach die neueste Kopie jeder Gruppe.“Select all but best” keeps the largest, then newest, copy of each group.

Teil-Zugriff auf FotosPartial photo access

Der Teil-Zugriff ab Android 14 wird explizit unterstützt, inklusive klarem Hinweis zum Wechsel auf vollen Zugriff.Partial access on Android 14 and newer is handled explicitly, with a clear prompt to upgrade to full access.

Datenschutz Privacy

Die App ist um lokale Verarbeitung herum gebaut The app is built around local processing

Nach Projektbeschreibung bleiben Fotos, Metadaten und der Hash-Index auf dem Gerät. Ohne Netzwerk-Berechtigung kann die App nichts übertragen. According to the project documentation, photos, metadata, and the hash index stay on the device. With no network permission, the app cannot transmit anything.

01

Keine Netzwerk-BerechtigungNo network permission

Das gemergte Manifest deklariert keine INTERNET-Berechtigung.The merged manifest declares no INTERNET permission.

02

Keine Tracker oder AnalyticsNo trackers or analytics

Keine Werbe- oder Analytics-SDKs, keine Konten und keine Crash-Reporter.No advertising or analytics SDKs, no accounts, and no crash reporters.

03

System-Dialoge statt BreitzugriffSystem dialogs instead of broad access

Löschen läuft über System-Bestätigung oder Papierkorb; MANAGE_EXTERNAL_STORAGE wird nie angefragt.Deletion uses system confirmation or the trash; MANAGE_EXTERNAL_STORAGE is never requested.

Technik Technology

Android-nativer Stack Native Android stack

UI
Jetpack Compose, Material 3, MVVM
SpracheLanguage
Kotlin 2.4.10, Android Gradle Plugin 9.1.0
BilderImages
Coil 3.5.0, MediaStore
DatenData
SQLite-Hash-Index, app-privater SpeicherSQLite hash index, app-private storage
SDK
compileSdk/targetSdk 36, minSdk 26compileSdk/targetSdk 36, minSdk 26

Getrennter Kern für prüfbares VerhaltenA separated core for verifiable behaviour

Der Duplikat-Kern unter core/ hat bewusst keine Android-Abhängigkeiten. Damit werden Hashing, wahrnehmungsbasiertes Hashing, Gruppierung und die Berechnung der freigebbaren Bytes mit schnellen JVM-Tests abgedeckt. The duplicate engine under core/ deliberately has no Android dependencies. That lets hashing, perceptual hashing, grouping, and the reclaimable-bytes maths be covered by fast JVM tests.

Repository-KommandosRepository commands ./gradlew :app:assembleDebug ./gradlew :app:testDebugUnitTest

Roadmap

Das Repository führt den Fortschritt gegen einen Meilensteinplan M0–M10. Version 1.0.1 ist gebaut und getestet und steht seit Oktober 2026 im Google Play Store bereit. The repository tracks progress against an M0–M10 milestone plan. Version 1.0.1 is built and tested and has been listed in the Google Play Store since October 2026.

AbgeschlossenCompleted

  • Kern-Engine mit SHA-256- und dHash-Erkennung plus JVM-TestsCore engine with SHA-256 and dHash detection plus JVM tests
  • Sichere Löschung, Zwei-Schritt-Aufräumen und Vordergrund-Scan-ServiceSafe deletion, two-step cleanup, and a foreground scan service
  • Google-Play-Eintrag mit Store-Assets, Datenschutzerklärung und Release-ChecklistenGoogle Play listing with store assets, privacy policy, and release checklists

Als NächstesNext

  • Schrittweiser Rollout über die Play-Console-Testspuren intern, geschlossen, ProduktionStaged rollout through the Play Console tracks internal, closed, production
  • Farb-Signatur gegen falsch-positive Treffer bei einfarbigen BildernColour signature against false positives on flat-colour images

SpäterLater

  • Unterstützung für Videos, aktuell werden nur Bilder gescanntVideo support; currently only images are scanned
  • Eigener Bereich für „ähnliche Aufnahmen“ jenseits der DuplikateA separate “similar shots” section beyond duplicates
  • Warm-Scan-Beschleunigung für unveränderte BibliothekenWarm-scan speed-up for unchanged libraries

Foto Dup Finder ansehen oder mitentwickeln View or contribute to Foto Dup Finder

Die App ist im Google Play Store verfügbar. Quellcode, Roadmap, Datenschutzerklärung und Changelog liegen im Gitea-Repository. The app is available on Google Play. Source code, roadmap, privacy policy, and changelog live in the Gitea repository.