Android storage access framework

226
30 июля 2018, 02:00

Всем привет, знаю, что уже очень много вопросов на эту тему, однако, как грамотно использовать 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

Answer 1

Как вам правильно сказали в комментариях, не все 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);

READ ALSO
Индексированный поиск в JAVA

Индексированный поиск в JAVA

Ребята нужна помощь и это касается быстрого поискаПишу загрузку данных из DBF в Postgresql

209
Ошибка в расширении класса ArrayAdapter

Ошибка в расширении класса ArrayAdapter

Пытаюсь расширить адаптер для спиннера, написал класс включающий в себя проверку: находится ли в списке данных для спиннера нужная строка:

163
Авторизация и аутентификация Servlet

Авторизация и аутентификация Servlet

День добрыйПодскажите пожалуйста в каком направлении идти

213
Border-image с одной стороны блока

Border-image с одной стороны блока

Есть ли возможность задать border-image только с одной стороны блока (не вокруг)? Например, если необходимо сделать тот же border-bottom: dotted, только с промежутком...

217