【问题标题】:Android says no such file or folder even though it's thereAndroid 说没有这样的文件或文件夹,即使它在那里
【发布时间】:2014-04-04 01:52:07
【问题描述】:

我正在尝试访问我的 Android 手机中的文件,并使用以下代码:

final File folder = new File("/storage/sdcard0/");
        for (final String fileEntry : folder.list()) {
            System.out.println(fileEntry);
        }

它在 list() 函数上抛出一个空指针,这意味着它不是文件/目录。但是,如果我将路径更改为 /storage/,它会打印一堆文件夹,包括 sdcard0。我知道 sdcard0 实际上是一个文件夹/文件,因为我还为我的手机下载了一个文件管理器并浏览了这些文件。许多人建议使用 getExternalStorageDirectory(),但这会导致相同的空指针。

我已经添加了这些权限:

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

编辑: 我看过的众多网站之一 android null pointer error

更新: 我用isDirectory()检查它是否是一个文件夹,它返回true,然后我尝试canRead()它返回false,可能是权限问题?

【问题讨论】:

  • 没有像“android.permission.READ_INTERNAL_STORAGE”这样的权限,尽管这不太可能是问题,因为读取EXTERNAL存储的权限通常尚未强制执行。
  • 这很奇怪,因为我从字面上看到了 10 多个与使用它的人的链接,为什么它如此普遍?
  • 您(或他们)混淆了内部和外部。有关清单权限,请参阅文档。

标签: android file nosuchfileexception


【解决方案1】:
final File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
for (final String fileEntry : folder.list()) {
 System.out.println(fileEntry);
}

【讨论】:

    【解决方案2】:

    我终于弄明白了,如果您滑动顶部菜单栏(您会在其中接收通知),则会出现“已连接为媒体设备”,如果您单击该菜单栏会有更多设置,并且如果您启用“媒体设备 (MTP) ",当我通过 USB 将 SD 卡插入计算机时,没有这组设备会自动卸载我的 SD 卡。

    【讨论】:

      【解决方案3】:

      Environment.getExternalStorageState() 这将为您提供外部存储而不是路径的状态。 检查路径请使用 Environment.getExternalStorageDirectory().getAbsolutePath()。

      根据您提到的“共享”状态,您似乎在通过 USB 电缆将其访问到您的系统时进行测试。 因为“共享”状态意味着“媒体存在但未安装,并通过 USB 大容量存储共享”。

      【讨论】:

      • 对不起,我想当我在此期间发布我的答案时,你想通了。
      【解决方案4】:

      尝试通过以下方式获取外部存储路径:

        System.out.println(Environment.getExternalStorageState());
      

      它返回外部存储的路径并与您正在编写的内容进行交叉检查。

      【讨论】:

      • 我认为你越来越近了,确实打印共享,但它仍然给我空指针
      • “共享”就是它给我的东西
      • “共享”在您的设备中的什么位置?
      • 我不知道,我在任何地方都找不到它,起初我以为共享来自我的 Mac,但那没有意义
      • 正如 Ankit 所指出的,这是一个有用的测试,但它返回的是状态,不是路径。请编辑以避免混淆未来的读者。
      【解决方案5】:

      你能试试这个代码吗

      final File folder = new File("/storage/sdcard");
      
          if (folder.getAbsoluteFile().exists()) {
              for (final String fileEntry : folder.getAbsoluteFile().list()) {
                  System.out.println(fileEntry);
              }
          }
      

      【讨论】:

      • 你能检查一下 sdcard0 是否存在于存储中吗?因为在模拟器上你有 sdcard 而不是 sdcard0。
      • 当我使用“/storage/”时,它给了我一堆文件夹,其中一个包括 sdcard0
      • 我在编辑后的答案中添加了一个检查文件夹或文件是否存在,因为上面的代码在我的模拟器和设备中运行良好。
      • 什么也没做,但是,我刚刚注意到一条消息说“没有安装 sd 卡”,但是如果我通过文件管理器访问 sdcard0,它可以读取文件
      • 我想我可能已经知道为什么,当我通过电脑将手机插入 USB 时,它会卸载 sdcard,这是否正常?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 2018-05-30
      相关资源
      最近更新 更多