파이어베이스를 활용해서 이미지는 Storage에 저장하고, 입력한 내용과 uri는 파이어스토어에 저장하도록 해야한다.
우선 카테고리 부분은 임시로 세팅.
class RegisteritemActivity: AppCompatActivity() {
private lateinit var binding: ActivityRegisterItemBinding
private var uri:Uri? = null
private var auth: FirebaseAuth? = null
companion object {
const val REQUEST_FIRST = 1000
const val REQUEST_GET_IMAGE = 2000
}
private var launcher = registerForActivityResult(ActivityResultContracts.GetContent()){ it ->
uri = it
binding.itemimageUpload.setImageURI(uri)
Log.e("text", uri.toString())
}
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
binding = ActivityRegisterItemBinding.inflate(layoutInflater)
setContentView(binding.root)
auth = FirebaseAuth.getInstance()
var categoryInfo = arrayOf("디지털기기", "생활가전", "도서", "게임", "유아용품" )
var listener = DialogInterface.OnClickListener { dialog, which ->
binding.itemCategory.text = "${categoryInfo[which]}"
}
binding.itemCategory.setOnClickListener {
val builder = AlertDialog.Builder(this@RegisteritemActivity)
.setItems(categoryInfo, listener)
.show()
}
binding.backButton.setOnClickListener {
finish()
}
binding.itemimageUpload.setOnClickListener {
if(ContextCompat.checkSelfPermission(this@RegisteritemActivity.applicationContext, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
launcher.launch("image/*")
} else{
Toast.makeText(this@RegisteritemActivity, "접근 권한이 거부돼 있습니다. 설정에서 접근을 허용해주세요", Toast.LENGTH_SHORT).show()
ActivityCompat.requestPermissions(this@RegisteritemActivity, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), REQUEST_GET_IMAGE)
}
true
}
binding.confirmButton.setOnClickListener {
Toast.makeText(this, uri.toString(), Toast.LENGTH_SHORT).show()
uri?.let { it1 -> uploadImageToFirebase(it1!!) }
}
}
fun uploadImageToFirebase(uri: Uri){
//파이어베이스 스토리지 접근 위해 선언
var storage: FirebaseStorage? = FirebaseStorage.getInstance()
var fileName = "IMAGE_${SimpleDateFormat("yyyymmdd_HHmmss").format(Date())}_.png"
var imageRef = storage!!.reference.child("images/").child(fileName)
imageRef.putFile(uri!!).continueWithTask { task: Task<UploadTask.TaskSnapshot> ->
return@continueWithTask imageRef.downloadUrl
}.addOnSuccessListener {
var itemInfoDTO: ItemInfoDTO = ItemInfoDTO()
itemInfoDTO.imageUri = it.toString()
itemInfoDTO.item_name = binding.itemName.text.toString()
itemInfoDTO.itemAccount = binding.itemAccount.text.toString().toInt()
itemInfoDTO.category = binding.itemCategory.text.toString()
itemInfoDTO.uid = auth!!.currentUser!!.uid
itemInfoDTO.date = System.currentTimeMillis()
itemInfoDTO.item_text = binding.itemExplain.text.toString()
//위의 이미지와 내용 입력이 완료되었으면 파이어스토어에 내용이 들어가도록
FirebaseFirestore.getInstance().collection("Items").document().set(itemInfoDTO)
Toast.makeText(this, getString(R.string.upload_success), Toast.LENGTH_SHORT).show()
finish()
}.addOnFailureListener{
println(it)
Toast.makeText(this, getString(R.string.upload_fail), Toast.LENGTH_SHORT).show()
}
}
파이어스토어에 들어갈 내용들은 data class를 통해서 ItemInfoDTO에 세팅했다
data class ItemInfoDTO(
var uid : String? = null, //등록자 uid
var category: String? = null, //물품 카테고리.
var sellerId : String? = null, //등록자 닉네임
var item_name : String? = null, // 물품 이름
var imageUri : String? = null, //이미지 Uri
var date : Long? = null, //등록 날짜
var itemAccount: Int? = null, //물품 가격
var item_text: String? = null, //물품에 대한 내용
var likeCount: Int = 0
){
data class Comment(
val uid: String? = null,
val comment: String? = null,
val timestamp: Timestamp? = null,
val likeCount: Int? = null
)
}
파이어스토어에 등록되면 이렇게 recyclerview에 cardview를 적용해서 화면에 출력되도록 하였다. 현재는 등록된 순서대로 보이도록