【问题标题】:ListFile is null after updating to Oreo更新到 Oreo 后 ListFile 为空
【发布时间】:2018-12-08 09:59:12
【问题描述】:

在我的 mibox 4k 更新到 android Oreo 后,该应用程序无法运行

代码查找外部存储

    private String[] getUsbStoragePaths()
{
    List<String> result  = new ArrayList<>();
    File storageDir = new File("/storage");
    if(storageDir.isDirectory()) {
        File[] subDir = storageDir.listFiles();
        for(File dir : subDir) {
            if(dir.canRead()) {
                result.add(dir.getAbsolutePath());
            }
        }
    }

    return result.toArray(new String[0]);
}


private List<File> getSubDirs(String path) {
    List<File> result = new ArrayList<>();
    File root = new File(path);
    if (root.exists() && root.canRead()) {
        File[] subDirs = root.listFiles(); ->>>>>> alway null

        if (subDirs !=null)
        {
            for(File dir: subDirs)
            {
                if (dir.isDirectory() && dir.canRead())
                {
                    result.add(dir);
                }
            }
        }
    }

    return result;
}

我的 USB 存储有子文件夹

----子目录1
----子目录2
----子目录3
----文件1

应用中的权限

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

并在运行时请求权限

private void requestStoragePermission() {
    if (!hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) ||
        !hasPermission(, Manifest.permission.READ_EXTERNAL_STORAGE)) {
        ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
    }
}
    private boolean hasPermission(final String permission) {
        return PackageManager.PERMISSION_GRANTED == getApplicationContext().getPackageManager().checkPermission(
            permission, getApplicationContext().getPackageName());
    }   

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Other things
    requestStoragePermission();
}

getSubDirs 方法的结果为空, 文件[] subDirs = root.listFiles(); ->>>>>> 始终为空

【问题讨论】:

  • 文件[] subDirs = root.listFiles(); ->>>>>> 始终为空。 'listFiles' 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。如果此抽象路径名不表示目录,则此方法返回 null。这个根文件不是我猜的目录,请看一下。 1.developer.android.com/reference/java/io/File#listFiles() 2.stackoverflow.com/questions/30062035/…
  • @Ankita-user3449434 这个根文件是目录,路径是“/storage/16 digit”
  • 它适用于 getSubDirs("/storage/emulated/0/"),但不适用于 getSubDirs("/storage/39EB...../")
  • Android Oreo 在 Mibox 4k 设备上存在许多错误。现在它已更改为测试版

标签: java android file android-tv


【解决方案1】:
This code will give you files which are stored inside directory.

String pattern = ".png";    
File directory = new File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES), "Your directory name");
            File[] fileList = directory.listFiles();
            if (fileList != null && fileList.length > 0) {

                for (File file : fileList) {
                     //if you need particular file format than check with that otherwise remove it.
                    if (file.isFile() && file.getName().endsWith(pattern)) {
                       //
                    }
                }
             }

【讨论】:

    【解决方案2】:

    我的解决方案: 将目标从 25 更改为 26 但不支持unicode名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-02
      • 2019-12-02
      • 1970-01-01
      • 2018-10-20
      • 2018-09-19
      • 2017-08-28
      • 2023-03-21
      • 2018-08-01
      相关资源
      最近更新 更多