为什么File.listFiles()方法只能列出目录

4

我在Android R上遇到了一个非常奇怪的问题。以下是我所做的事情。

  1. 在Manifest.xml中声明我将使用WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限。
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  1. 在我的代码中检查并请求权限
   private void checkPermission() {
       int pid = android.os.Process.myPid();
       int read = checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, pid, 1);
       int write = checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, pid, 1);
       ArrayList<String> permissions = new ArrayList<>();
       if (read != PackageManager.PERMISSION_GRANTED)
           permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
       if (write != PackageManager.PERMISSION_GRANTED)
           permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
       if (permissions.size() > 0) {
           String[] permissionArray = new String[permissions.size()];
           permissions.toArray(permissionArray);
           requestPermissions(permissionArray,1);
       }
   }

   public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                          @NonNull int[] grantResults) {
       //I ignored the result check here since I definitely know that I clicked on the "Allow" button when
       //I was asked to allow the permissions
       File directory = new File("/storage/emulated/0/ebook");
       File[] files = directory.listFiles();
       for(File file : files)
       {
           try {

               Log.i("tagd", "file name: " +file.getCanonicalPath());

           } catch (IOException e) {
               e.printStackTrace();

           }
       }
   }

好的,下面来说一件有点奇怪的事情。从日志中我只得到了一行:

file name: /storage/emulated/0/ebook/temp

但实际上,在“ebook”文件夹中有40个项目,其中39个是PDF文档,另外一个是名为“temp”的文件夹。所有的PDF文档都不见了。其他任何类型的文件夹也出现了相同的问题。

generic_x86_64_arm64:/sdcard/ebook $ ls
1.pdf                                                       dovado\ 4GR\ Reference_manua62X.pdf.pdf
111(1).pdf                                                  fit_diff_pages.pdf
2013\ Mar.pdf                                               help.pdf
2017-08-03_SZ_NK.pdf                                        interactiveform_enabled.pdf
223622-100518.pdf                                           invoice\ 2013-1-28.pdf
59df269384986.pdf                                           pass-111111.pdf
732101500002013-07-21_03-55-53-3352579.pdf                  pdf_commenting_new.pdf
Aeroplane\ -\ bjo.pdf                                       pdfa_pagina_a4_gear_movie.pdf
BoardMeetingMinutes.1024.pdf                                signature.pdf
CreditCardReckoning201211.pdf                               temp
DEMO_SV_lowsize.pdf                                         test.pdf
Geografie_\ Gr\ 10\ Portefeuljeboek\ -\ vnull.pdf           test.pfx
Geografie_\ Gr\ 10\ Portefeuljeboek\ -\ vnull_unlocked.pdf  test1.pdf
Layali_Ashar[1].pdf                                         test28k.pdf
PDF\ markup\ design-Model.pdf                               test_att.pdf
Praise\ And\ Thanksgiving\ (Morning\ Has\ Broken).pdf       visa-china.pdf
Professional_Android_2_Application_Development.pdf          为人父母.pdf
Welcome_to_Radaee_PDF_Master.pdf                            张霁\ 简历\ 3\ -\ 副本.pdf
Xaml_Introduction.pdf                                       比亚迪.pdf
__ViewPoint\ 8000________________\ (2).pdf                  美时每客CakeTime移动平台项目开发分析报告.pdf

这个问题只能在Android Q上重现。代码非常简单,在其他Android版本上运行良好。有人知道发生了什么吗?任何帮助将不胜感激,谢谢。


1
我们无法看到您尝试列出的目录。请仅列出一个目录并发布代码。不要发布图片,而是将日志行作为文本发布。既然已经有R 30,为什么还需要保留所有权限代码呢? - blackapps
在Android 11上,列出/storage/emulated/0只会给出目录是很正常的。而在Android 10上,它会返回null。那么问题来了,你是如何在Android 11上将文件放入/storage/emulated/0/ebook中的呢? - blackapps
我已经感到自由询问你为什么没有使用SDK 30,但你甚至不屑回答。我还问了更多的问题,你也没有回答。 - blackapps
1
你找到解决方案了吗? - Jaswant Singh
有人找到解决方案了吗? - user18511546
显示剩余2条评论
4个回答

1
看起来这与Android 11存储更新有关。这是一个非常令人烦恼的变化。他们在没有提供有用的错误信息的情况下默默地破坏了API协议。抛出异常或在日志中添加一些警告将提供更好的线索,以节省开发人员的时间。 https://developer.android.com/about/versions/11/privacy/storage

在Android 11中,您只能访问外部存储器中的媒体文件。如果您需要读取非媒体文件,请遵循此链接:https://dev59.com/uVEG5IYBdhLWcg3wct5F#68168979。 - liber

0

我曾遇到过类似的问题。重启设备解决了它。太奇怪了,也许是 Android 的一个 bug。


0

嗨,Alin,谢谢您的回复。但是我想不是这个问题,我尝试捕获SecurityException,但似乎在应用程序运行时没有抛出任何异常。 - Alex.Y

-1

Java File.listFiles() 方法返回一个抽象路径名数组,表示由此抽象路径名所表示的目录中的文件。

如果目录为空,则该数组将为空。如果此抽象路径名不表示目录或发生 I/O 错误,则返回 null。

但你可以尝试类似这样的操作

for (File file: files) {
        try {

            Log.i("file name" +file.getCanonicalPath()+"/n");

        } catch (IOException e) {
            e.printStackTrace();

        }

嗨,Sideeg,循环仅输出一个包含39个PDF文档和1个子文件夹的目录的一行。只有文件夹被列出。请参考我修改后的帖子。谢谢您的回复。 - Alex.Y

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