【day24】上传多张照片(上)

好的,我们已经完成了一次上去一个照片,那如果使用者有好几张照片呢? 他可能会希望多给几张照片的话,那我们就给他一次可以多选择吧!!

0.修改dataClass

因为我们要变成多张了,所以我们要把原本的String,改成List,新增以下

val photoUriList: List<String>? = null

1. 修改Intent

我们原本是单选,现在我们要把它新增成为可以选择多样的方式,直接在AddInvitationFragment里面的 checkPermission(),修改Intent

val intent =   Intent(
                Intent.ACTION_PICK,
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true)
            resultLauncher.launch(intent)

2.修改resultLauncher

再过来我们也要去我们的resultLauncher修改成拿到多张照片,原本拿到的方式是data.data(拿到一张),现在我们现在透过data.clipData就可以拿到多张照片啦!

private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ uri ->
        if (uri.resultCode == Activity.RESULT_OK){
            val selectedUri = uri.data?.clipData
            if (selectedUri != null){

                val list = mutableListOf<Uri>()
                val account = selectedUri.itemCount

				//在这边把它加入list
                for (i in 0 until account){
                    val model = selectedUri.getItemAt(i).uri
                    list.add(model)
                }
				//并传入viewModel
                matchingViewModel.saveImageToFireStorage(requireActivity(),this,list)
            }
        }
    }

3.修改saveImageToFireStorage()

看了一下Firebase的文档,好像没有一次上传多张照片的方式,所以这边就用for loop 分次上传,且因为Firebase会自动异步,所以我们在上传成功的时候,判断是否全部都传完了,传完了就把资料丢进Fragment

//我们要把传入的单笔url改成list
fun saveImageToFireStorage(activity: Activity, fragment: AddInvitationFragment, list: List<Uri>) {


       val newList = mutableListOf<Uri>()
       for (i in list.indices){
           val sdf: StorageReference = FirebaseStorage.getInstance().reference.child(
               Constant.PET_IMAGE + "_" + System.currentTimeMillis() + "_" + Constant.getFileExtension(
                   activity,
                   list[i]
               )
           )
           sdf.putFile(list[i])
               .addOnSuccessListener { it ->
                   it.metadata?.reference?.downloadUrl
                       ?.addOnSuccessListener { uri ->
                       newList.add(uri)
                           Timber.d("测试 uri: $uri")
                           if (i == list.size-1){
                               Timber.d("得到的所有可下载 uri $newList  listSize:${newList.size}")
                                fragment.saveImageSuccessful(newList)
                           }
                       }
                       ?.addOnFailureListener {
                           fragment.saveImageFail(it.toString())
                       }


               }
               .addOnFailureListener {
                   fragment.saveImageFail(it.toString())
               }
       }

    }

4.修改saveImageSuccess()

在最上面新增

private var selectedUriList: List<String> = listOf()

因为我们的Firestore不接受Url的格式,所以我们要把它改成String在传上去!

fun saveImageSuccessful(uriList: List<Uri>){
        showSnackBar(resources.getString(R.string.update_pet_image_successful),false)
        val list = mutableListOf<String>()
        for (element in uriList){
            val model = element.toString()
            list.add(model)
        }

       selectedUriList = list
}

这样就完成罗!! 接下来明天将会把它显示出来!


<<:  世界上最快乐的人 (1) 实修方法摘录

>>:  Day24 NiFi 延伸应用 - Slack & Email

学习资源

分享一些我很喜欢的学习资源 有看到新的好资源会陆续更新 Computer Science 计算机概论...

3D 物件档案 — .obj

大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...

Day 30 Sniffing & Spoofing 监听与欺骗 (macchanger)

今天要体验的工具是macchanger,从介绍就一目了然其用途是拿来进行MAC地址欺骗,可以暂时修改...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 29 - cypress 最佳实践

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 选取元素 ⚠️ 避免使用会常常变的s...

Springboot HelloWorld

Springboot HelloWorld ...