在Kotlin中从图库选择多张图片(需要图片路径)

8

我正在开发一个用于将多张图片制作成视频的应用程序,使用的语言是kotlin。我找到了很多Java代码,但无法正确地将其转换为Kotlin代码。总是会出现错误:cursor.getString(column_index) must not be null
由于我只是Kotlin的初学者,所以是否有人能够给我提供一个简要的解决方案。

val cursor = contentResolver.query(uri,  filePathColumn, null, null, null)
 cursor!!.moveToFirst()
 val columnIndex = cursor.getColumnIndex(filePathColumn[0])


请查看空安全 - ADM
@ADM 这个问题不同。 - Heet Parkhiya
@Heet,你说得对。我正在发布解决同样问题的代码,请稍等。 - Harvi Sirja
问题是一样的。当您在var中放置!!时,您告诉编译器您对其空值负责。这就是为什么Kotlin是一种空安全语言。请阅读上面的链接。 - ADM
2个回答

14

嘿,我也遇到了同样的问题,并找到了解决方案。只需按照我的代码操作即可。

private var context: Context? = null
var PICK_IMAGE_MULTIPLE = 1
lateinit var imagePath: String
var imagesPathList: MutableList<String> = arrayListOf()

首先调用图库意图

if (Build.VERSION.SDK_INT < 19) {
            var intent = Intent()
            intent.type = "image/*"
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
            intent.action = Intent.ACTION_GET_CONTENT
            startActivityForResult(
                Intent.createChooser(intent, "Select Picture")
                , PICK_IMAGE_MULTIPLE
            )
        } else {
            var intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
            intent.addCategory(Intent.CATEGORY_OPENABLE)
            intent.type = "image/*"
            startActivityForResult(intent, PICK_IMAGE_MULTIPLE);
        }

现在检查onActivityResult。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

        super.onActivityResult(requestCode, resultCode, data)
        // When an Image is picked
        if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == Activity.RESULT_OK
            && null != data
        ) {
            if (data.getClipData() != null) {
                var count = data.clipData.itemCount
                for (i in 0..count - 1) {
                    var imageUri: Uri = data.clipData.getItemAt(i).uri
                    getPathFromURI(imageUri)
                }
            } else if (data.getData() != null) {
                var imagePath: String = data.data.path
                Log.e("imagePath", imagePath);
            }

            displayImageData()
        }
    }

    private fun getPathFromURI(uri: Uri) {
        var path: String = uri.path // uri = any content Uri

        val databaseUri: Uri
        val selection: String?
        val selectionArgs: Array<String>?
        if (path.contains("/document/image:")) { // files selected from "Documents"
            databaseUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
            selection = "_id=?"
            selectionArgs = arrayOf(DocumentsContract.getDocumentId(uri).split(":")[1])
        } else { // files selected from all other sources, especially on Samsung devices
            databaseUri = uri
            selection = null
            selectionArgs = null
        }
        try {
            val projection = arrayOf(
                MediaStore.Images.Media.DATA,
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.ORIENTATION,
                MediaStore.Images.Media.DATE_TAKEN
            ) // some example data you can query
            val cursor = contentResolver.query(
                databaseUri,
                projection, selection, selectionArgs, null
            )
            if (cursor.moveToFirst()) {
                val columnIndex = cursor.getColumnIndex(projection[0])
                imagePath = cursor.getString(columnIndex)
               // Log.e("path", imagePath);
                imagesPathList.add(imagePath)
            }
            cursor.close()
        } catch (e: Exception) {
            Log.e(TAG, e.message, e)
        }
    }


经过数小时的查看代码和尝试仅选择一个图像,我终于让它工作了。由于我不是安卓用户,所以我不知道当我点击一张图片时它会被选中,后来我意识到我必须在名称旁边点击添加勾选标记才能选择多个图像(头部拍打笑)。 - Tony Merritt
@TonyMerritt 你需要长按以进行多选。 - Harvi Sirja
我有Java代码,但在Kotlin中无法成功使用。这对我很有效...谢谢。 - Rashmi Andani
contentResolver 是什么? - Jaimin Modi

-2
这是一个使用Github仓库的解决方案,适用于您的需求。
在您的应用程序gradle文件中添加以下行。
   implementation 'com.github.esafirm.android-image-picker:imagepicker:1.13.1'
    // for experimental rx picker
    implementation 'com.github.esafirm.android-image-picker:rximagepicker:1.13.1'
    // If you have a problem with Glide, please use the same Glide version or simply open an issue
    implementation 'com.github.bumptech.glide:glide:4.8.0'

Java 类中调用此方法以选择或获取图像

 startActivityForResult(ImagePicker.create(getActivity())
                .multi()
                .folderMode(true)
                .returnMode(ReturnMode.ALL)
                .getIntent(getActivity()), IpCons.RC_IMAGE_PICKER);

onActivityResult()中获取选定图像的arraylist

 @Override
    protected void onActivityResult(int requestCode, final int resultCode, Intent data) {
        if (ImagePicker.shouldHandle(requestCode, resultCode, data)) {
            // Get a list of picked images
            List<Image> images = ImagePicker.getImages(data)
            // do your stuff here

            // or get a single image only
            //Image image = ImagePicker.getFirstImageOrNull(data)
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

这段代码不太复杂,无需处理图像多选,只需添加multi()即可启用多选。

注意:将此代码复制并粘贴到您的Kotlin项目中,转换器将自动将其转换为Kotlin。


我一直遇到问题,无法将其与gradle同步。 - Tony Merritt
请在此处发布Gradle问题。 - Quick learner
Failed to resolve: com.github.esafirm.android-image-picker:imagepicker:1.13.1 Show in File Show in Project Structure dialogFailed to resolve: com.github.esafirm.android-image-picker:rximagepicker:1.13.1 Show in File Show in Project Structure dialog - Tony Merritt
当您调用startActivityForResult时,应用程序会崩溃。 - Osama Ibrahim

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