From 1c535ac281b1f1583a38314542435de290210d89 Mon Sep 17 00:00:00 2001 From: Georg Lukas Date: Sat, 24 Sep 2016 14:52:40 +0200 Subject: [PATCH] osm prefs: add support for convoluted Android 5+ external/primary storage URLs --- src/PrefsAct.scala | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/PrefsAct.scala b/src/PrefsAct.scala index 7271646..d2e8a87 100644 --- a/src/PrefsAct.scala +++ b/src/PrefsAct.scala @@ -3,6 +3,7 @@ package org.aprsdroid.app import _root_.android.content.Intent import _root_.android.net.Uri import _root_.android.os.Bundle +import _root_.android.os.Environment import _root_.android.preference.Preference import _root_.android.preference.Preference.OnPreferenceClickListener import _root_.android.preference.PreferenceActivity @@ -26,21 +27,35 @@ class PrefsAct extends PreferenceActivity { fileChooserPreference("themefile", 123457) } + def resolveContentUri(uri : Uri) = { + val Array(storage, path) = uri.getPath().replace("/document/", "").split(":", 2) + android.util.Log.d("PrefsAct", "resolveContentUri s=" + storage + " p=" + path) + if (storage == "primary") + Environment.getExternalStorageDirectory() + "/" + path + else + "/storage/" + storage + "/" + path + } + def parseFilePickerResult(data : Intent, pref_name : String, error_id : Int) { val file = data.getData().getScheme() match { case "file" => data.getData().getPath() case "content" => - // fix up Uri for KitKat+; http://stackoverflow.com/a/27271131/539443 - val fixup_uri = Uri.parse(data.getDataString().replace( - "content://com.android.providers.downloads.documents/document", - "content://downloads/public_downloads")) - val cursor = getContentResolver().query(fixup_uri, null, null, null, null) - cursor.moveToFirst() - val idx = cursor.getColumnIndex("_data") - val result = if (idx != -1) cursor.getString(idx) else null - cursor.close() - result + // fix up Uri for KitKat+; http://stackoverflow.com/a/20559175/539443 + // http://stackoverflow.com/a/27271131/539443 + if ("com.android.externalstorage.documents".equals(data.getData().getAuthority())) { + resolveContentUri(data.getData()) + } else { + val fixup_uri = Uri.parse(data.getDataString().replace( + "content://com.android.providers.downloads.documents/document", + "content://downloads/public_downloads")) + val cursor = getContentResolver().query(fixup_uri, null, null, null, null) + cursor.moveToFirst() + val idx = cursor.getColumnIndex("_data") + val result = if (idx != -1) cursor.getString(idx) else null + cursor.close() + result + } case _ => null }