Intent.getData() в UTF-8

Всем доброго времени!

Пишу приложение для открытия файлов через Intent.

Нужно достать путь к файлу способом Intent.getData(), а потом этим же способом перезаписать файл.

Впринцыпе все работает, если путь к файлу без пробелов и на латинице )

Проблема следующая: getData() заменяет пробелы и русские символы на %20%D0% и тд..

Соответственно при перезаписи создается новый файл с этим же %20%D0%-именем.

Кому не трудно, подскажите способ получать путь в кодировке UTF-8, и чтобы при этом у FileOutputStream не было проблем с перезаписью.

Заранее спасибо!


Ответы (2 шт):

Автор решения: Eugene Krivenja

У getData() нет проблем с кириллицей, это вы его неправильно интерпретируете.
Если посмотреть внимательно, то getData() возвращает Uri, соответсвенно все что не ANSI, кодируется по правилам URL encoding
https://en.wikipedia.org/wiki/Percent-encoding

Конвертируйте Uri в file path (не всегда возможно) и все будет как надо.

ADDON: Uri.getPath() сам все декодирует

String linkUtf8 = "https://site.com/%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BA%D1%83%D0%B4%D0%B0-%D1%82%D0%BE%20%D0%B2%D0%B5%D0%B4%D0%B5%D1%82/";
Uri uri = Uri.parse(linkUtf8);
System.out.println(uri.toString());
// >> https://site.com/%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BA%D1%83%D0%B4%D0%B0-%D1%82%D0%BE%20%D0%B2%D0%B5%D0%B4%D0%B5%D1%82/
System.out.println(uri.getPath());
// >> /ссылка куда-то ведет/
→ Ссылка
Автор решения: Rianoks Ltd

Как раз перед вашим ответом нашел этот способ:

Uri uri = intent.getData();
try {
    String totalFile = new File(uri.toString());
    String fpath = URLDecoder.decode(totalF.getCanonicalPath().toString(), "UTF-8");
} catch (IOException e) {
    Toast.makeText(this, "Failed on reading File: " + e.toString(), Toast.LENGTH_LONG).show();
}
→ Ссылка