Akaflieg-Freiburg / enroute

A free navigation app for VFR pilots
https://akaflieg-freiburg.github.io/enroute/
GNU General Public License v3.0
111 stars 28 forks source link

Get file name from Android content URLs, use them when importing VAC graphic files #398

Open kebekus opened 7 months ago

kebekus commented 7 months ago

One user wrote:

Das funktioniert bereits. Enroute akzeptiert im Prinzip beliebige Rastergraphiken mit den entsprechenden Dateinamen. Die Sache hat aber einen Haken: einige Versionen von Android (und wahrscheinlich auch iOS) verschleiern die Dateinamen aus Gründen des Datenschutzes. Statt eines Dateinamens erhält die App dann nur eine "Content-URL", was im wesentlichen "content://zufallszahl" ist. Uns ist nie ganz klar geworden, welche Android-Versionen welcher Hersteller dieses Verfahren anwenden und wie man vielleicht doch noch an die Dateinamen kommt.

Da kann ich Euch vermutlich weiterhelfen.

In einem älteren Projekt habe ich bereits GMX-Dateien auf Android importiert und da brauchte ich auch den Namen um einige wichtige Informationen daraus zu extrahieren. Das geht auch wenn die URI nur eine Nummer enthält.

        try {
            log.info { "GPX file uri '$it'." }
            val documentFile = DocumentFile.fromSingleUri(context, it)
            val documentName = documentFile?.name
            if (documentName != null) {
                val routeId = documentName.substring(0, documentName.lastIndexOf('.'))
                val format = documentName.substring(documentName.lastIndexOf('.')+1)
                context.contentResolver.openInputStream(it).use {
                    log.info { "Importing GPX file '$documentName' with routeId '$routeId' and format '$format'." }

// if (it != null) MainModel.routePoolManager.importPlanningRoute(routeId, format, true, it) } } else { log.error { "Cannot import GPX file without its name." } } } catch (e: Exception) { log.error(e) { "Could not import GPX file." } }

Der Schlüssel ist die Funktion DocumentFile.fromSingleUri. Hier der Output von Logcat:

GPX file uri 'content://com.android.providers.downloads.documents/document/477'. Importing GPX file 'jit_cs_positive_preview.png' with routeId 'jit_cs_positive_preview' and format 'png'.

Du siehst, die URI hat am Ende nur die Nummer 477 aber die Funktion kann trotzdem den Originalnamen extrahieren. (Ist ein PNG weil ich gerade kein GPX-File zur Hand hatte.)

Man braucht dazu nur die Gradle-Abhängigkeit:

implementation("androidx.documentfile:documentfile:1.0.1")