Всем привет, знаю, что уже очень много вопросов на эту тему, однако, как грамотно использовать Android storage access framework. Вот примерно такой:
val i = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
i.addCategory(Intent.CATEGORY_DEFAULT)
startActivityForResult(Intent.createChooser(i, "Choose directory"), 9999)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
9999 -> {
Log.e("Test", "Result URI " + data!!.data!!.path)
}
}
}
Если быть точнее, то вопрос вот в чем:
Все эти File picker'ы возвращают uri файла. Так вот, например, я хочу создать файл в выбранной папке или открыть выбранный файл как объект типа File(), как это сделать?
P.S.
Пожалуйста, не предлагайте вот такие способы:
val uri = data!!.getData()
val file=File(uri.path)
Если для данного объекта вызвать метод
file.exists()
Он вернет false
Как вам правильно сказали в комментариях, не все Uri являются файлами, это может быть например ссылка в сети или вообще запись в БД.
А раз так, то вам нужно правильно определять какие Uri являются файлами, например так:
/**
* @return Whether the Uri authority is file.
*/
public static boolean isFileDocument(final Uri uri) {
if(uri.toString().startsWith("file://"))
return true;
return false;
}
/**
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(final Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
/**
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(final Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
/**
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(final Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
По хорошему, если Uri являюется одним из указанных типов, то его можно сконвертировать в некое подобие файла. Если нет, скажем это запись в БД в виде BLOB'а то может подойти вариант:
context.getContentResolver().openFile(uri, mode);
Если не получается, то на помощь для чтения придет:
InputStream is=context.getContentResolver().openInputStream(uri);
Для записи: context.getContentResolver().openOutputStream(uri);
Виртуальный выделенный сервер (VDS) становится отличным выбором
Ребята нужна помощь и это касается быстрого поискаПишу загрузку данных из DBF в Postgresql
Пытаюсь расширить адаптер для спиннера, написал класс включающий в себя проверку: находится ли в списке данных для спиннера нужная строка:
Есть ли возможность задать border-image только с одной стороны блока (не вокруг)? Например, если необходимо сделать тот же border-bottom: dotted, только с промежутком...