从android kotlin中的文件夹中获取图像列表

Posted

技术标签:

【中文标题】从android kotlin中的文件夹中获取图像列表【英文标题】:Getting list of images from a folder in android kotlin 【发布时间】:2018-12-12 14:08:06 【问题描述】:

我正在尝试使用此功能从文件夹中获取图像列表

var gpath:String = Environment.getExternalStorageDirectory().absolutePath
var spath = "testfolder"
var fullpath = File(gpath + File.separator + spath)
var list = imageReader(fullpath)

fun imageReader(root : File):ArrayList<File>
    val a : ArrayList<File> ? = null
    val files = root.listFiles()
    for (i in 0..files.size)
        if (files[i].name.endsWith(".jpg"))
            a?.add(files[i])
        
    
    return a!!

但我有这些例外:

java.lang.ArrayIndexOutOfBoundsException:length=3;index=3

kotin.kotlinNullPointerException

我已经阅读过这个问题,但我不知道如何解决它,

请帮忙?

【问题讨论】:

因为Array 的索引是从零开始的,所以最后一个元素是files.size - 1 谢谢,它修复了第一个异常,但 NullPointerException 仍然存在,知道吗? @evals 请提供完整的 logcat 错误和您尝试调用函数的代码。 @evals 看起来你需要在 var list = imageReader(path) 中传递 fullpath 而不是 path检查我的答案并申请。 @evals 检查我为您的解决方案更新的答案。 【参考方案1】:

对于 Null Pointer,您可能需要在 var list = imageReader(path) 中更改并传递 fullpath 而不是 path

错误

var fullpath = File(gpath + File.separator + spath)
var list = imageReader(path)

正确

var gpath:String = Environment.getExternalStorageDirectory().absolutePath
var spath = "testfolder"
var fullpath = File(gpath + File.separator + spath)
var list = imageReader(fullpath)

编辑 1

我对函数进行了一些更改并将其应用到 override fun onCreate 中,如下所示。

var gpath: String = Environment.getExternalStorageDirectory().absolutePath
var spath = "Download"
var fullpath = File(gpath + File.separator + spath)
Log.w("fullpath", "" + fullpath)
imageReaderNew(fullpath)

功能

fun imageReaderNew(root: File) 
    val fileList: ArrayList<File> = ArrayList()
    val listAllFiles = root.listFiles()

    if (listAllFiles != null && listAllFiles.size > 0) 
        for (currentFile in listAllFiles) 
            if (currentFile.name.endsWith(".jpeg")) 
                // File absolute path
                Log.e("downloadFilePath", currentFile.getAbsolutePath())
                // File Name
                Log.e("downloadFileName", currentFile.getName())
                fileList.add(currentFile.absoluteFile)
            
        
        Log.w("fileList", "" + fileList.size)
    

Logcat 输出

W/fullpath: /storage/emulated/0/Download
E/downloadFilePath: /storage/emulated/0/Download/download.jpeg
E/downloadFileName: download.jpeg
E/downloadFilePath: /storage/emulated/0/Download/images.jpeg
E/downloadFileName: images.jpeg
E/downloadFilePath: /storage/emulated/0/Download/images (1).jpeg
E/downloadFileName: images (1).jpeg

【讨论】:

对不起,我错了,我编辑了问题,但这不是问题,使用调试模式和 BreakPoints 我看到函数返回 (a) 为 null 并且我 100% 确定在提供的路径中有 .jpg 文件 @evals 检查我更新的答案对功能进行了一些更改并改进了这将解决您所有的问题。让它变得简单。 @evals 很高兴为您提供帮助!还要支持答案,以便对未来的访问者有所帮助。 :) 我得到“未解决的参考:环境”【参考方案2】:
fun imageReader(root : File):ArrayList<File>
    val a : ArrayList<File> ? = null
    val files = root.listFiles()
    for (i in 0..files.size-1)
        if (files[i].name.endsWith(".jpg"))
            a?.add(files[i])
        
    
    return a!!

【讨论】:

很好地修复了第一个异常,但 NullPointerException 仍然存在,知道吗?【参考方案3】:

上面的答案是正确的,但它将a 声明为null,然后在循环中使用null 保存。因此它检测图像但不将它们添加到列表中并且列表返回 null。

fun imageReader(root: File): ArrayList < File > 
  val a: ArrayList < File > = ArrayList()
  if (root.exists()) 
    val files = root.listFiles()
    if (files.isNotEmpty()) 
      for (i in 0..files.size - 1) 
        if (files[i].name.endsWith(".jpg")) 
          a.add(files[i])
        
      
    
  
  return a!!

【讨论】:

以上是关于从android kotlin中的文件夹中获取图像列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中使用 Kotlin 从 Firebase 中的数据库中获取特定值?

我可以从android中的uri获取图像文件的宽度和高度吗?

Qt 和 Android - 从图库中的图像获取路径

Android Kotlin Volley 如何从 JSONArray 中获取价值

如何使用 Kotlin 从 android 中的资产中读取 json 文件?

如何使用Kotlin从Firestore中的数组字段中获取数据?