Итак, после отладки я нашел способ получить путь к выбранной папке.
Сначала я строю uri, используя дерево документов
Uri docUri = DocumentsContract.buildDocumentUriUsingTree(uri,
DocumentsContract.getTreeDocumentId(uri));
, и выполнил запрос по нему.
cursor = context.getContentResolver().query(contentUri, null, null, null, null);
и получить данные в столбце document_id
1010 *
String string = cursor.getString(cursor.getColumnIndex("document_id"));
это будет что-то вроде XXX-XXX:DCIM/ffmpeg
, если он находится на SD-карте, или primary:DCIM/ffmpeg
, если он находится в внутреннее хранилище.
В конце я смог получить реальный путь, используя это:
String[] strings = string.split(":");
String newPath = "/storage/" +
(strings[0].equals("primary")?"emulated/0/"+strings[1]:
string.replaceAll(":", "/"));
Это разделит данные в столбце на две части (мне интересно в первой строке только для того, чтобы узнать, находится ли он в SD-карте или нет). Если он находится на SD-карте, он добавит префикс /storage/
и заменит все двоеточия прямой косой чертой, если он находится в основном хранилище, он добавит префикс /storage/emulated/0/
и заменит двоеточия прямой косой чертой.
Я протестировал его на многих устройствах (даже на эмуляторе), и он работал нормально.