인프런 커뮤니티 질문&답변

류재열님의 프로필 이미지
류재열

작성한 질문수

[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)

안드로이드 스튜디오 게시글 이미지 업로드 유무

작성

·

124

0

게시글을 올릴때 이미지를 업로드 하지 않으면, 안드로이드 스튜디오가 꺼집니다. 혹시 이미지를 업로드 하지 않아도 게시글을 작성하려면 코드를 어떻게 수정해야하나요?

 

package com.example.healthcareapplication.fragments

import android.app.Activity.RESULT_OK
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.os.Bundle
import android.provider.MediaStore
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import androidx.navigation.fragment.findNavController
import com.example.healthcareapplication.DATA.ContentData
import com.example.healthcareapplication.DATA.ContentModel
import com.example.healthcareapplication.R
import com.example.healthcareapplication.databinding.FragmentCommunityWriteBinding
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.ktx.Firebase
import com.google.firebase.storage.ktx.storage
import java.io.ByteArrayOutputStream
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale

class CommunityWriteFragment : Fragment() {
    private lateinit var binding: FragmentCommunityWriteBinding
    private lateinit var auth: FirebaseAuth
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_community_write, container, false)
        val view = binding.root
        auth = FirebaseAuth.getInstance()


        binding.writeBtn.setOnClickListener {
            val title = binding.title.text.toString()
            val content = binding.content.text.toString()
            fetchContent(title, content)


            findNavController().navigate(R.id.action_communityWriteFragment_to_communityFragment)

        }

        binding.ImageBtn.setOnClickListener {
            val gallery = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI)
            startActivityForResult(gallery, 100)
        }
        return view
    }

    private fun fetchContent(title:String, content:String){
        val userId = auth.currentUser?.uid ?: return
        val currentDateTime = Calendar.getInstance().time
        val dateFormat = SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.KOREA).format(currentDateTime)

        val key = ContentData.boardRef.push().key.toString()

        ContentData.boardRef
            .child(key)
            .setValue(ContentModel(title, content, userId, dateFormat))
        Toast.makeText(requireContext(), "게시글 업로드 성공!", Toast.LENGTH_SHORT).show()
        ImageUpload(key)
    }

    private fun ImageUpload(key:String){

        val storage = Firebase.storage
        val storageRef = storage.reference
        val mountainsRef = storageRef.child(key + ".png")
        val imageView = binding.imageArea

        // Get the data from an ImageView as bytes
        imageView.isDrawingCacheEnabled = true
        imageView.buildDrawingCache()
        val bitmap = (imageView.drawable as BitmapDrawable).bitmap
        val baos = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
        val data = baos.toByteArray()

        var uploadTask = mountainsRef.putBytes(data)
        uploadTask.addOnFailureListener {
            // Handle unsuccessful uploads
        }.addOnSuccessListener { taskSnapshot ->
                // taskSnapshot.metadata contains file metadata such as size, content-type, etc.
                // ...
        }
    }


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(resultCode == RESULT_OK && requestCode == 100){
            val selectedImageUri = data?.data
            selectedImageUri?.let { uri ->
                binding.imageArea.setImageURI(uri)
                val layoutParams = binding.imageArea.layoutParams
                layoutParams.width = 300 // 원하는 너비 설정
                layoutParams.height = 300 // 원하는 높이 설정
                binding.imageArea.layoutParams = layoutParams
            }
        }
    }

}

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

님의 안드로이드 스튜디오에서 이미지 업로드 없이 게시글을 작성할 수 있게 하려면, ImageUpload(key) 함수 호출 부분을 조건에 따라 실행하도록 수정해야 합니다. 현재 코드는 이미지가 있든 없든 상관없이 ImageUpload(key) 함수를 호출합니다. 이미지가 없는 경우에는 ImageUpload 함수를 호출하지 않도록 조건을 추가해주어야 합니다.

imageView.drawablenull인지 확인하는 조건을 추가하여 이미지가 있을 때만 ImageUpload(key)를 호출하도록 변경해 볼 수 있습니다. 이를 위해 fetchContent 함수에서 ImageUpload(key)를 호출하는 부분을 다음과 같이 수정할 수 있습니다.

    private fun fetchContent(title:String, content:String){
        val userId = auth.currentUser?.uid ?: return
        val currentDateTime = Calendar.getInstance().time
        val dateFormat = SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.KOREA).format(currentDateTime)

        val key = ContentData.boardRef.push().key.toString()

        ContentData.boardRef
            .child(key)
            .setValue(ContentModel(title, content, userId, dateFormat))
        Toast.makeText(requireContext(), "게시글 업로드 성공!", Toast.LENGTH_SHORT).show()
        
        // 이미지가 있을 경우에만 ImageUpload 호출
        if(binding.imageArea.drawable != null) {
            ImageUpload(key)
        }
    }

이 변동 사항은 binding.imageArea.drawablenull인 경우, 즉, 이미지가 선택되지 않았을 때 ImageUpload(key) 함수를 호출하지 않도록 변경했습니다. 이렇게 하면 이미지 없이 게시글을 업로드할 수 있게 됩니다.

류재열님의 프로필 이미지
류재열

작성한 질문수

질문하기