Как получить доступ (чтение / запись) к каталогу publi c sd-карты? Environment.getExternalStoragePublicDirectory возвращает внутреннее хранилище - PullRequest
0 голосов
/ 04 августа 2020

Как получить доступ (чтение / запись) к каталогу publi SD-карты c?

Environment.getExternalStoragePublicDirectory возвращает внутренние пути хранения. getExternalFilesDirs возвращает как внутреннюю память, так и SD-карту. Но приложение указывает c путей. А как насчет publi c общих каталогов на SD-карте? А подключил usb-накопитель? Как получить к ним доступ?

1 Ответ

0 голосов
/ 09 августа 2020

Вместо устаревшей java Файловой структуры я нашел еще одну устаревшую функцию startActivityForResult. Есть не устаревшая, но все еще бета-версия registerForActiviResult. Но я не могу найти, какой Uri перейти на запуск this. Из-за этого я вынужден использовать startActivityForResult, чтобы передать Uri в Direcroty:

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
        flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
}
startActivityForResult(intent,10)

Затем из Uri, полученного из устаревшего onActivityResult, создайте другой Uri, потому что первый не подходит для проверки свободного места на диске.

val docUriTree = DocumentsContract.buildDocumentUriUsingTree(u,DocumentsContract.getTreeDocumentId(u))
val fd = app.contentResolver.openFileDescriptor(docUriTree,"r")
val st = Os.fstatvfs(fd?.fileDescriptor)
Log.d(TAG, "sUr: Free ${st.f_bsize * st.f_bavail / 1024 / 1024} MByes  f_bsize: ${st.f_bsize} Bytes  f_bavail: ${st.f_bavail}")

Затем список файлов ...

val df = DocumentFile.fromTreeUri(app.applicationContext, u)
val dfl = df?.listFiles()
dfl?.forEach {
       Log.d("MY_TAG",
"\n-------------------\n$it\nname: ${it.name}\nparentFile: ${it.parentFile}\nuri: ${it.uri}\ntype: ${it.type}\nlength: ${it.length()}\nlastModified: ${it.lastModified()}\n-------------------------\n"
       )
       // Do something with it like:
      filelist.add(
                ImageFile(
                    fUri = it.uri,
                    Name = it.name,
                    bitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
                        DocumentsContract.getDocumentThumbnail(
                            app.contentResolver, it.uri,
                            Point(190, 108), null
                        )
                    else
                        null
                )
            )
}

Я не могу понять, как использовать бета-версию registerForActivityResult вместо устаревшего startActivityForResult.

ps

Наконец-то нашел, что передать для запуска. Это DocumentsContract.EXTRA_INITIAL_URI.

registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) {
          if (it != null) {
                   viewModel.sUr(it)
          }
}.launch(Uri.parse(DocumentsContract.EXTRA_INITIAL_URI))

Какие еще параметры можно передать для запуска? Что такое DocumentsContract.EXTRA_INITIAL_URI?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...