Kotlin文件(路径).walkTopDown()找不到文件

envsm3lx  于 2023-01-17  发布在  Kotlin
关注(0)|答案(1)|浏览(146)

bounty将在6天后过期。回答此问题可获得+50声望奖励。Mathlight希望引起更多人关注此问题。

我试图递归读取一个给定的目录,并找到所有的文件夹和文件。目录和子目录被找到,但没有文件。
我的虚拟设备上的存储结构:

用于“遍历给定目录”的代码

import android.util.Log
import java.io.File

// path = "/storage/1B10-1D17/ReadTest/"

class FileHelper {
    fun walkTest(path: String){
        File(path).walkTopDown().forEach {
//            println(it)
            Log.e("walkTest extension", it.extension)
            if(it.isDirectory){
                Log.e("walkTest", "Directory: ${it.name}")
            }else{
                Log.e("walkTest", "File: ${it.name}")
            }
        }
    }
}

这将输出以下内容:

E/walkTest extension: 
E/walkTest: Directory: ReadTest
E/walkTest extension: 
E/walkTest: Directory: SubFolder

在我的android manifest文件中,我有以下行,并授予权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

我的代码中有什么缺陷,我如何才能找到存储在这些目录中的三个pdf文件?

更新1/2

如下面的屏幕截图所示,介质访问权限已被授予:

如果我运行下面的命令(按照dan 1st的建议),我会得到下面的输出,其中显示了pdf文件:

> adb shell ls /storage/1B10-1D17/ReadTest/
File_1.pdf
SubFolder
g6ll5ycj

g6ll5ycj1#

一般来说,您无法访问可移动存储上的任意文件。READ_EXTERNAL_STORAGE不会改变这一点。
你建议的解决方案是使用MANAGE_EXTERNAL_STORAGE。从技术上讲,这是可行的,而且对于个人使用的应用来说,这是一个很好的解决方案。如果你打算分发此应用,你需要向Google(可能还有其他应用商店)提交文件,证明你使用此权限的合理性。商店不同意你的理由,可能会选择不分发你的应用。
或者,您可以使用存储访问框架。使用ACTION_OPEN_DOCUMENT_TREE/ActivityResultContracts.OpenDocumentTree,让用户决定希望您的应用访问用户设备(或用户云存储)上的哪个位置。然后,您可以使用DocumentFile遍历文档树以查找子树和文档。

相关问题