【问题标题】:Getting list of images from a folder in android kotlin从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 检查我为您的解决方案更新的答案。

标签: android arraylist nullpointerexception kotlin indexoutofboundsexception


【解决方案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!!
}

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多