我发现了另一个已弃用的 startActivityForResult 函数,而不是过时的 java File 框架。没有过时的,但仍然是 beta 的 registerForActiviResult。但我找不到要通过什么 Uri 来启动它。因此,我不得不使用 startActivityForResult 让 Uri 进入 Direcroty:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
}
startActivityForResult(intent,10)
然后从已弃用的 onActivityResult 中获取 Uri,制作另一个 Uri,因为第一个 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
)
)
}
我不知道如何使用 beta registerForActivityResult 而不是已弃用的 startActivityForResult。
附言
终于找到了要通过什么来启动。它是 DocumentsContract.EXTRA_INITIAL_URI。
registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) {
if (it != null) {
viewModel.sUr(it)
}
}.launch(Uri.parse(DocumentsContract.EXTRA_INITIAL_URI))
还有哪些参数可以传递给启动?
DocumentsContract.EXTRA_INITIAL_URI 是什么意思?