HarmonyOS 鸿蒙Next 文件管理应用开发,file.listFiles()方法返回null

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 文件管理应用开发,file.listFiles()方法返回null

private static final String EXTERNAL_PATH = “/storage/emulated/0”;
File file = new File(EXTERNAL_PATH);
File[] fileArray;
if (file.exists()) {
    fileArray = file.listFiles();
    if (fileArray != null) {
        for (File fileInfo : fileArray){
              HiLog.info(logLabel, “fileInfo路径:” + fileInfo.getName());
        }
    } else {
         HiLog.info(logLabel, “没有文件”);
    }
}



程序一直打印“没有文件”,想了想是不是因为权限问题,所有在config.json中添加了如下权限

"reqPermissions": [
      {
        “name”: “ohos.permission.READ_MEDIA”
      },
      {
        “name”: “ohos.permission.WRITE_MEDIA”
      }
    ]



结果还是一直打印“没有文件”


麻烦大佬帮忙解答一下,看看是哪里出的问题??

谢谢了····


还有,如何得到鸿蒙内部存储的根目录??

24 回复

开发者你好,我这边尽量找技术帮你看看~

欢迎更多小伙伴来帮帮楼主吧

大佬···这个还挺着急的····麻烦能不能尽快找个人帮忙看看啊···

谢谢了····

大佬···

啥时候能帮忙解决这个问题啊····

大佬····

这个有解决方案了么???

您好,请参考https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-data-mgmt-storage-0000001050994909

我不是要开发这个···

我是要开发类似咱华为手机上的文件管理,文件管理里面有个手机存储,可以列出手机内部存储的根目录下的所有文件夹和文件


这样的,file.listFiles()就可以得到当前文件夹下的所有文件,但是在咱们鸿蒙上这个方法返回的是null

File file = new File("/storage/emulated/0");


Android上如果不动态申请"android.permission.READ_EXTERNAL_STORAGE"这个属性file.listFiles()也是空的

动态申请了后file.listFiles()就不为空了,就可以访问到"/storage/emulated/0"下的所有文件了

红框内就是当前文件夹下的所有目录了



我试了一下在鸿蒙上动态申请"ohos.permission.READ_MEDIA" 这个权限,但是file.listFiles()还是空的。

所有想问下鸿蒙侧如何访问当前设备的外部存储根目录


大佬···

啥时候能帮忙解决这个问题啊····

开发者您好,这个问题已经安排研发在分析了,请您耐心等待一下。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

感谢大佬···

有办法了麻烦即时回复一下···

谢谢了····

大佬···

啥时候能帮忙解决这个问题啊····


大佬····

这个有解决方案了么???

    开发者您好, 读取用户外部存储中的媒体文件信息需要申请ohos.permission.READ_MEDIA权限,而ohos.permission.READ_MEDIA权限属于敏感权限,不仅需要在config.json文件中声明所需要的权限,还需要在代码中动态申请,由用户点击同意后方可使用。


    动态权限申请开发步骤可参看开发者文档 https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-guidelines-0000000000029886

按照你说的动态申请了ohos.permission.READ_MEDIA权限


但是file.listFiles()还是返回null



鸿蒙上申请ohos.permission.READ_MEDIA权限后


Android上申请android.permission.READ_EXTERNAL_STORAGE权限后



Android申请的权限比鸿蒙上的多一个“文件”

是不是鸿蒙上这个“文件”的权限是另外一个呢???


就我所知,存储API方案还未定。利用File的接口+读写权限目前是不行的,以后可能也不会可行。貌似内部在考虑使用苹果的存储方式。我倒是期望能与Android的SAF框架保持相近。总之第三方文件管理器,以目前的形式及以后的发展看,直接Over。又或许会出现什么新的高招?总之这一块不乐观。

感谢解答,如果按你说的这个方向发展,那好多厂商对文件管理这里就很难受了吧,比如扫毒,垃圾清理等等··

大佬,这个问题就解决方案了吗?
申请ohos.permission.READ_MEDIA权限后,只能获取当前应用下缓存目录权限。获取手机内部存储的根目录下的所有文件夹和文件暂时不支持,请关注官网更新。

请问一下鸿蒙系统上如果删除图片,通过改命令,报没有权限。

已经动态申请了

verifySelfPermission(SystemPermission.READ_MEDIA)
verifySelfPermission(SystemPermission.WRITE_MEDIA
DataAbilityHelper helper = DataAbilityHelper.creator(mContext);
helper.delete(

Writing exception to parcel

09-22 21:26:16.348 4718-4742/? E DatabaseUtils:  android.app.RecoverableSecurityException: org.horaapps.leafpic has no access to content://media/external/images/media/871

09-22 21:26:16.348 4718-4742/? E DatabaseUtils:      at com.android.providers.media.MediaProvider.enforceCallingPermissionInternal(MediaProvider.java:9035)

09-22 21:26:16.348 4718-4742/? E DatabaseUtils:      at com.android.providers.media.MediaProvider.enforceCallingPermission(MediaProvider.java:8954)

09-22 21:26:16.348 4718-4742/? E DatabaseUtils:      at com.android.providers.media.MediaProvider.deleteInternal(MediaProvider.java:6803)

09-22 21:26:16.348 4718-4742/? E DatabaseUtils:      at com.android.providers.media.MediaProvider.delete(MediaProvider.java:6705)

09-22 21:26:16.348 4718-4742/? E DatabaseUtils:      at android.content.ContentProvider$Transport.delete(ContentProvider.java:404)

09-22 21:26:16.348 4718-4742/? E DatabaseUtils:      at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:19

我读指定文件时候用的 “/sdcard/Movies/xxxx.mp4”能读到文件

但是读目录下文件列表也是null

File file = new File("/sdcard/Movies/");
String[] files = file.list();
if (files != null) {
    for (String f : files) {
        LogUtil.info(TAG, f);
    }
}

用这个权限就可以了

%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20211230093241.png

你的是正解,尤其是对我这种用android studio开发兼容鸿蒙的很有帮助,谢谢!

在HarmonyOS鸿蒙Next的文件管理应用开发中,如果file.listFiles()方法返回null,这通常表明指定的路径不存在、没有读取权限或路径指向的是一个文件而非目录。以下是几个可能的解决方案:

  1. 确认路径正确:确保传递给listFiles()方法的路径确实是一个目录路径。可以使用file.isDirectory()来检查该路径是否为一个目录。

  2. 检查权限:确保应用已经获得了对目标路径的读取权限。在HarmonyOS中,需要在config.json文件中声明相应的权限,如ohos.permission.READ_EXTERNAL_STORAGE,并在运行时请求权限。

  3. 路径存在性:使用file.exists()来验证路径是否存在。如果路径不存在,需要先创建目录或确保路径正确。

  4. 设备兼容性:检查该行为是否在特定设备或系统版本上独有。有时,设备制造商的修改可能影响标准API的行为。

  5. 错误处理:添加适当的错误处理逻辑,如日志记录,以便在listFiles()返回null时能够捕获并处理异常。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部