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

ryhaxcpt  于 2023-02-17  发布在  Android
关注(0)|答案(4)|浏览(165)

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

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!!
}

但我有以下例外:

  • 数组索引超出范围异常:长度=3;指数=3*
  • 返回值异常 *

我读过这个问题,但我不知道如何解决它,
有什么需要帮忙的吗?

mzsu5hc0

mzsu5hc01#

对于 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
drnojrws

drnojrws2#

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!!
}
nxagd54h

nxagd54h3#

上面的答案是正确的,但是它声明anull,然后在循环中使用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!!
}
b1zrtrql

b1zrtrql4#

通过使用MediaStore,我们可以实现一个文件夹内的图像计数,我们将添加一个检查,以防止获得当前文件夹的子文件夹的图像。

fun getImageCountInDirectory(context: Context, directoryPath: String): Int {
    var imageCount = 0

    val uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    val sortOrder = MediaStore.Images.Media.DATE_MODIFIED + " DESC"
    val selection = "${MediaStore.Images.Media.DATA} like ? and ${MediaStore.Images.Media.DATA} not like ?"
    val selectionArgs = arrayOf("$directoryPath/%", "$directoryPath/%/%") // use % as a wildcard character to select all files inside the directory, and exclude subdirectories

    val cursor = context.contentResolver.query(
        uri,
        null,
        selection,
        selectionArgs,
        sortOrder
    )
    if (cursor != null) {
        imageCount = cursor.count
        cursor.close()
    }

    return imageCount
}

这个函数将返回一个整数值,它是文件夹中图像文件的总数,我们使用not like操作符,并将%/%添加到selectionArgs数组中,以选择路径不包含子目录的所有文件。

相关问题