更新到 Oreo 后 ListFile 为空

Posted

技术标签:

【中文标题】更新到 Oreo 后 ListFile 为空【英文标题】:ListFile is null after updating to Oreo 【发布时间】: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.***.com/questions/30062035/… @Ankita-user3449434 这个根文件是目录,路径是“/storage/16 digit” 它适用于 getSubDirs("/storage/emulated/0/"),但不适用于 getSubDirs("/storage/39EB...../") Android Oreo 在 Mibox 4k 设备上存在许多错误。现在它已更改为测试版 【参考方案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名称

【讨论】:

以上是关于更新到 Oreo 后 ListFile 为空的主要内容,如果未能解决你的问题,请参考以下文章

linux字符测试

将 Xcode 6.4 更新到 Xcode 7.0 后,NSData dataWithContentsOfURL 为空

mern - 更新后的值在数据中为空

更新到 Gradle 5.6.4 和 Android Studio 3.6.1 后 nativeLibraryDir 显示为空

使用脚本选项及组合条件测试

PHPActiveRecord validates