Hallo,
ich schreibe an einer kleinen Messager App (API 24+), bei der u.a. Fotos und Dokumente auf einen Server geladen werden.
Die Fotos werden zuvor verkleinert.
In der bisherigen Testphase habe ich einen file chooser verwendet, mit dem ich durch das Dateisystem browse und als Ergebnis ein File mit einem Pfad wie z.B. "/mnt/sdcard/picturexy.jpg" erhalten habe.
Da die typische Auswahl eines (von vielen) Fotos nur anhand des Names ohne Vorschau unpraktisch ist, möchte ich den file chooser ersetzen.
Daher lag der Rückgriff auf das Bordmittel Storage Access Framework (SAF) nahe.
Ich lasse also das File nach Vorgabe verschiedener Mime-Typen per Intent.ACTION_OPEN_DOCUMENT auswählen und erhalte einen Uri zurück.
Und da beginnen meine Probleme.
Meine App erwartet die Übergabe eines Files
file = new File(uri.getPath())
aus dem die Extension
String extension = MimeTypeMap.getFileExtensionFromUrl(file.getName())
und der MimeType
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
bestimmt werden.
Je nach Extension wird das File dann skaliert (wenn es ein Image ist) oder gleich auf den Server hochgeladen.
Spätestens beim Upload wird zudem der MediaType (erhalten aus dem dem Mime-Type) benötigt.
Aber: Das SAF liefert nicht diese Art von uri, sondern einen Pfad wie "/document/image:60".
Daraus erhalte ich mit meinen bisherigen Methoden aber nicht den Filetyp.
Wie kann ich aus dem vom SAF gelieferten uri den "echten" Pfad erhalten?
Oder: wie lese ich den mime-Typ aus?
(Ist etwa ernsthaft vorgesehen, aus dem uri-"image" auf den mime-Typ "image/*" zu schließen? Da fehlt noch der Subtyp "*", also jpg, png, ...)
Und dann gibt es am Horizont noch das Problem, ob das SAF alle vorhandenen Files auf dem Gerät tatsächlich findet.
Um in den dortigen Tabellen indiziert zu werden, müssen die Files ja bekannt gemacht worden sein, was normalerweise die App übernimmt.
Meine App löst das so:
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.addCompletedDownload(downloaded_file.getName(),"myApp",true,"image/png",downloaded_file.getPath(),downloaded_file.length(),true);
Aber wie ist das, wenn der User beispielsweise per USB-Kabel sein "Schaut_her.pdf" in den Download-Ordner seines Geräts geladen hat.
Findet SAF dieses File dann überhaupt? (Ja, "application/pdf" ist als mime-Type in der Auswahl zugelassen)
Ist das SAF für einen solchen Einsatz (beliebige Files verschiedener Apps, nicht zwangsläufig mit einem Content/Media/?Provider vertreten, dazu "external storage") überhaupt sinnvoll, oder sollte ich bei meinem alten File Chooser bleiben und diesen um eine Analyse der mime-Typen erweitern (also z.B. Typ-Icons und Thumbnails bei Bildern anzeigen)?
Wenn ich daran denke, wieviel Datenmüll auf manchen Smartphones herumfliegt ("wieso löschen? Ich habe eine 64-GB-Speicherkarte drin..."), sind das nicht gerade rosige Aussichten, was die zu erwartende Performance angeht.
Kann aber auch sein, dass ich grundsätzlich falsch liege - das SAF beansprucht schließlich ausdrücklich, über die Gerätegrenzen, d.h. auf die Cloud ausgedehnt, gültig zu sein.