MediaSync: Fotos vom Handy auf einen USB-Stick, ohne Cloud
Ein halbes Jahr lang habe ich nebenbei an einer Android-App gebaut, die Fotos und Videos direkt auf einen USB-Stick sichert. Rund 26.000 Zeilen Kotlin, allein.
Stick rein, Backup läuft, Stick raus, und beim nächsten Mal geht es genau da weiter, wo es aufgehört hat. Das ist MediaSync in einem Satz.
Die Frage dahinter war simpel: Wie bekomme ich Fotos und Videos vom Handy auf einen USB-Stick und wieder zurück, ohne dass sie über irgendeine Cloud laufen? Vom 5. April bis heute habe ich daran gebaut, neben dem Studium. Am Ende sind es rund 26.000 Zeilen Kotlin in 155 Dateien. Mein größtes eigenes Mobile-Projekt, alles allein, aber stark agentengestützt. Das sage ich lieber gleich dazu.
So läuft ein Backup, und so zeigt es auch die Demo auf dieser Seite, mit Beispieldateien. Du steckst den Stick an. Android meldet das Gerät, und die App spricht den Stick direkt über die USB-Host-Schnittstelle an. Dafür nutze ich die Bibliothek libaums, die das FAT-Dateisystem selbst liest und schreibt, ohne dass Android den Stick einhängen muss. Dann kommt die Vorschau: Die App vergleicht, was auf dem Handy liegt, mit dem, was schon auf dem Stick ist, und nimmt nur neue Dateien mit. Gleiche Dateien erkennt sie an ihrem Hash, nicht am Namen.
MediaSync
Gesicherte Ordner
Dann das eigentliche Kopieren. Große Videos gehen nicht in einem Stück über die Leitung, sondern in Chunks. Jeder Chunk bekommt eine eigene SHA-256-Prüfsumme, und welcher Chunk schon sicher angekommen ist, steht in einer kleinen Datenbank auf dem Handy. Ziehst du den Stick mitten im Video ab, ist nichts kaputt. Beim nächsten Einstecken geht es beim ersten fehlenden Chunk weiter.
Um diesen Kern herum ist viel Android gewachsen. Ein Vordergrund-Dienst mit Benachrichtigung, damit das Backup nicht abbricht, wenn man die App verlässt. Eine Erinnerung ans nächste Backup. Eine Kachel in den Schnelleinstellungen, drei Widgets für den Homescreen und ein Teilen-Ziel, über das man einzelne Bilder direkt schicken kann. Dazu Wiederherstellen vom Stick, ein Bericht nach jedem Lauf, Komprimieren von Fotos und ein Datumsstempel.
Was es noch nicht gibt: Feedback von anderen Nutzern. Das Repository liegt bisher nur lokal. Veröffentlichen auf GitHub ist beschlossen, vorher prüfe ich noch, dass keine Schlüssel drinstecken, und schreibe ein README.
Was ich mitnehme: Bei Dateien, die Leuten wichtig sind, ist „fortsetzen statt neu anfangen” kein Extra, sondern der Kern. Ohne Prüfsummen pro Chunk wüsste ich nie sicher, ob ein abgebrochenes Video wirklich vollständig ist. Und Android-Hintergrundarbeit ist ein eigenes Fach. Dienste, Worker und Benachrichtigungen haben jeweils ihre eigenen Regeln.
Tools und Skills: Kotlin, Jetpack Compose für die Oberfläche, Hilt für Dependency Injection, Room als Datenbank, WorkManager für Hintergrundjobs, die Android-USB-Host-API mit libaums, Hashing und eine Architektur, in der Backup, Restore und USB-Zugriff sauber getrennt sind.