【问题标题】:How to access directory "/storage/emulated"如何访问目录“/storage/emulated”
【发布时间】:2016-11-07 07:04:38
【问题描述】:

我正在使用 Marshmallow(api 23)

并且我已经声明了相关权限并在运行时请求这些权限。我已经获得了external storage directory——“/storage/emulated/0”到Environment.getExternalStorageDirectory()。使用这个文件实例(这里我称之为extF),extF.listFiles() 不为空。但是extF.getParentFile().listFiles() 返回 null。

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

0

obb

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

【问题讨论】:

  • 您在哪个 api 级别上测试?
  • @GyanendraMani 在 MarshMallow 上,所以 api 23。
  • 确保您在您的应用中具有读取权限,对于 api 23,您必须在运行时检查权限。

标签: android


【解决方案1】:

清单中的权限可能有问题: 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 不会授予对 /storage/emulated 的访问权限,除非它已获得 root 权限。
【解决方案2】:

您可以像这样在棉花糖中获取文件列表

    //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 中,这段代码运行良好。它访问指定文件夹中的所有列表文件。如果要访问子文件夹,则需要指定该目录的完美路径..
  • 我想得到你的sdCardRootparent file,然后得到它的子文件,也就是你的sdCardRoot的兄弟文件。
  • 如果你想访问父文件,那么在这段代码中你需要在/yourfoldername 的位置添加你的filename.extention 并去掉检查目录的If else 块。现在它将检查 sdcard 中的父文件。您还可以在此链接中找到stackoverflow.com/questions/2902689/…
  • 除非您的设备已root,否则您无法访问/storage/emulated。外部存储是 /storage/emulated/0 而不是 /storage/emulated
【解决方案3】:

那么,为什么我不能通过 File.listFiles() 获取这些文件呢?

您的应用没有对该目录的读取权限。

【讨论】:

  • @lmz:在有根设备上,大概有一种使用su/sudo的方法。或者,您可以构建自己的自定义 ROM,使该目录对全世界都可读,然后在您的设备上安装该自定义 ROM。否则,您将无法获得对其的读取权限。
猜你喜欢
  • 1970-01-01
  • 2021-09-04
  • 2018-11-05
  • 2021-10-14
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多