장터앱 구현(파이어스토어 연동해 이미지 및 내용 업로드)

호우·2022년 7월 19일
0

코틀린

목록 보기
2/8

파이어베이스를 활용해서 이미지는 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를 적용해서 화면에 출력되도록 하였다. 현재는 등록된 순서대로 보이도록

profile
뉴비 프로그래머

0개의 댓글