好的,我們已經完成了一次上去一個照片,那如果使用者有好幾張照片呢? 他可能會希望多給幾張照片的話,那我們就給他一次可以多選擇吧!!
因為我們要變成多張了,所以我們要把原本的String,改成List,新增以下
val photoUriList: List<String>? = null
我們原本是單選,現在我們要把它新增成為可以選擇多樣的方式,直接在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)
再過來我們也要去我們的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)
}
}
}
看了一下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())
}
}
}
在最上面新增
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
}
這樣就完成囉!! 接下來明天將會把它顯示出來!