如何访问目录“/storage/emulated”

3

我使用的是 Marshmallow(api 23) 操作系统。

我已经声明了相关权限并在运行时请求这些权限。我通过 Environment.getExternalStorageDirectory() 获得了外部存储目录——"/storage/emulated/0"。使用这个文件实例(我将其称为 extF),extF.listFiles() 不为 null。但是,extF.getParentFile().listFiles() 返回 null。

在 adb shell 中,我检查了 "/storage/emulated" 目录,发现有两个子目录:

0

obb

那么,在 Marshmallow(api23) 上为什么无法通过 File.listFiles() 获取 "/storage/emulated" 的子文件呢?谢谢您的解释。


你正在测试哪个API级别? - Gyanendra Mani
@GyanendraMani 关于Marshmallow,对应的API版本为23。 - Lym Zoy
请确保您的应用程序拥有读取权限,并且对于API 23,您必须在运行时检查权限。 - Gyanendra Mani
3个回答

1
你可以像这样获取Marshmallow中的文件列表。
    //this function will check for runtime permission so Add this block in your OnCreate() Method

    if(checkandRequestPermission()) {

        File sdCardRoot = Environment.getExternalStorageDirectory();
                Log.w("SDCardRoot", "" + sdCardRoot);
                File yourDir = new File(sdCardRoot, "/yourFolderName");

                // This will check if directory is exist or not
                if (!yourDir.exists()) {
                    yourDir.mkdirs();
                }

                if(yourDir.isDirectory()){

                    File[] content = yourDir.listFiles();
                    for(int i = 0; i<content.length;i++){

                        // Your List of Files
                        Log.w("List", "" + String.valueOf(content[i]));

                    }
    }

现在,如果您正在使用API级别23,则需要像这样添加运行时权限。
// Declare this function to check for runtime permission 

private boolean checkandRequestPermission(){

        int storageread = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);

        List<String> listpermissionNeeded = new ArrayList<>();

        if (storageread != PackageManager.PERMISSION_GRANTED) {
            listpermissionNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        }


        if (!listpermissionNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(this, listpermissionNeeded.toArray(new String[listpermissionNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    }

在您的清单文件中添加此权限。
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在我的Android Studio中,这段代码完美地运行。它可以访问指定文件夹中的所有列表文件。如果您想要访问子文件夹,则需要指定该目录的完美路径。 - pike
我想获取您的sdCardRoot父文件,然后获取它的子文件,也就是sdCardRoot的兄弟文件。 - Lym Zoy
如果您想访问父文件,则需要在此代码中将您的 filename.extention 添加到 /yourfoldername 的位置,并且摆脱检查目录的 If else 块。现在它将在sdcard中检查父文件。您还可以在此链接中找到它 https://dev59.com/v3E85IYBdhLWcg3wMAbc - pike
除非您的设备已经取得了 root 权限,否则您无法访问 /storage/emulated。外部存储是 /storage/emulated/0 而不是 /storage/emulated - Farid

0
所以,为什么我无法通过File.listFiles()获取这些文件呢?
您的应用程序没有该目录的读取权限。

@lmz:在一个已经root的设备上,可以使用 su/sudo 来实现。或者你可以自己构建一个使得该目录对所有用户可读的定制ROM,然后安装到你的设备上。否则你无法获取到该目录的读取权限。 - CommonsWare

0

可能是清单文件中权限的问题: android:name="android.permission.READ_EXTERNAL_STORAGE" *

如果这样做不起作用,只需确保路径是否正确

以下代码对我有效

File f = new File(Environment.getExternalStorageDirectory()+ "");
        if (f.exists()) {
        File[] dff= f.listFiles();
        }else{
            Logs.debug("siz","Files not existed.");
        }

Environment.getExternalStorageDirectory() 返回的是 /storage/emulated/0 而不是 /storage/emulated。除非 Android 已经被 root,否则无法授权访问 /storage/emulated - Farid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接