enroute icon indicating copy to clipboard operation
enroute copied to clipboard

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

Open kebekus opened this issue 10 months ago • 0 comments

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")

kebekus avatar Apr 02 '24 08:04 kebekus