무물컴 앱개발기록

개발일지 32 -3/16

망또또의 언냐 2022. 3. 17. 01:42

현생이 너무 바빠 요즘 일지 쓸 시간도 없다ㅜ

그래도 최대한 쓰긴 하는데, 더불어 2기 동아리까지 진행하려니 앞이 막막....

 

코딩질문 -> 비트맵, 바이트로 변화해 전달해주기 성공

하지만 api연결이 안된다.

저번에 또 골 썩이던 formdata가 문제..

뷰페이저 부분도 얼른 해결이 됐으면ㅠㅠ

 

    //카메라 앨범 이미지 가져오기
    @RequiresApi(Build.VERSION_CODES.N)
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (resultCode == RESULT_OK) {
//            var imagePath = data?.getStringExtra("path")!!
            var imagePath = data?.getByteArrayExtra("path")!!
//            path=data?.getParcelableExtra("path")!!

            Log.d("ppp/get", imagePath.toString())

            //데이터적용
            photoList.apply {
                add( 0, Photo(imagePath))
                Log.d("SEND/path", imagePath.toString())
                count++
                Log.d("path/count", count.toString())
            }
            Log.d("GETGET", photoList.toString())

            if (imagePath!=null) {
                val sendImage = imagePath.toRequestBody("image/*".toMediaTypeOrNull())
                val multibody: MultipartBody.Part=MultipartBody.Part.createFormData("images", "image.jpeg", sendImage)
                images.add(multibody)
            }

                //set되는 부분-파이어베이스
//                if (imagePath != null) {
//                    var fileName =
//                        SimpleDateFormat("yyyyMMddHHmmss").format(Date()) // 파일명이 겹치면 안되기 떄문에 시년월일분초 지정
//                    storage.getReference().child("image").child(fileName).putFile(imagePath.toUri())
//                        //어디에 업로드할지 지정
//                        .addOnSuccessListener { taskSnapshot -> // 업로드 정보를 담는다
//                            taskSnapshot.metadata?.reference?.downloadUrl?.addOnSuccessListener { it ->
//                                var imageUrl = it.toString()
//                                var photo = Photo(imageUrl)
//                                firestore.collection("coding-images")
//                                    .document().set(photo)
//                                    .addOnSuccessListener {
//                                    }
//                                Log.d("gege/imageUrl", imageUrl)
//                                Log.d("gege/photo", photo.toString())
//                                images.add(imageUrl)
//
//                            }
//                        }
//
//                }

            //이미지가 5개부터는 추가 불
            if (count>=5){
                //추가버튼
                binding.checkcodingquestionPlusIv.setOnClickListener {
                    Toast.makeText(this, "이미지는 최대 5개까지 넣을 수 있습니다", Toast.LENGTH_SHORT).show()
                }
            }


            // 뷰페이저 어댑터 생성
            viewPagerAdapter = ViewPagerAdapter(this, photoList)
            binding.checkcodingquestionVp.adapter = viewPagerAdapter
            binding.checkcodingquestionVp.orientation = ViewPager2.ORIENTATION_HORIZONTAL
            binding.checkcodingIndicator.setViewPager(binding.checkcodingquestionVp)

        }

    }

 

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == RESULT_OK) { // 결과가 있을 경우
            var bitmap: Bitmap? = null
            when (requestCode) {
                GALLERY -> {
                    if (requestCode == GALLERY) { // 갤러리 선택한 경우
//          1) data의 주소 사용하는 방법
                        imagePath =
                            data?.dataString!! // "content://media/external/images/media/7215"
                        data?.data?.let{ // 결과가 제대로 들어왔을때 (이미지 주소를 잘 가져왔을때) 실행
                                uri->
                            path = null // 앨범에서 가져올때마다 초기화
                            val inputStream = uri.let{
                                contentResolver.openInputStream(
                                    it
                                )
                            }
                            bitmap = BitmapFactory.decodeStream(inputStream)
                        }
                    }
                    if (imagePath.length > 0) {
                        Glide.with(this)
                            .load(bitmap)
                            .into(binding.ivPre)
                        binding.ivPre.visibility = View.VISIBLE
                        Log.d("gallery /ppp", bitmap.toString())
                    }
                }
                CAMERA -> {
                    val options = BitmapFactory.Options()
                    options.inSampleSize = 2 // 이미지 축소 정도. 원 크기에서 1/inSampleSize 로 축소됨
                    bitmap = BitmapFactory.decodeFile(imagePath, options)
//                    imagePath= bitmap.toString()
                    binding.ivPre.visibility = View.VISIBLE
                }
            }
//            binding.ivPre.setImageBitmap(bitmap)
            //사진이 회전되므로 보여줄떈 imagepath, 넘겨줄땐 bitmap
            Glide.with(this)
                .load(imagePath)
                .into(binding.ivPre)
            Log.d("camara/ppp", bitmap.toString())
            Log.d("pathpath", imagePath)

            //삭제버튼
            binding.camerashootingturnIb.setOnClickListener {
                imagePath=""
                binding.ivPre.visibility=View.INVISIBLE
                binding.camerashootingCheckIb.setOnClickListener {
                    Toast.makeText(this, "이미지를 넣어주세요", Toast.LENGTH_SHORT).show()
                }
            }


            //이미지가 null값이 아니어야 체크버튼 클릭 가능
            if(imagePath!="") {
                binding.ivPre.visibility=View.VISIBLE
                binding.camerashootingCheckIb.setOnClickListener {
                    val uploadBitmap = Bitmap.createScaledBitmap(bitmap!!,500,400,true)
                    val stream = ByteArrayOutputStream()
                    uploadBitmap.compress(Bitmap.CompressFormat.JPEG,100,stream)
                    val byteArray = stream.toByteArray()
                    intent.putExtra("path", byteArray)
                    setResult(RESULT_OK, intent);
                    finish()
                    Log.d("PUT/path", byteArray.toString())

                }
            }

//            //삭제버튼
//            binding.camerashootingturnIb.setOnClickListener {
//                imagePath=""
//                binding.ivPre.visibility=View.INVISIBLE
//                binding.camerashootingCheckIb.setOnClickListener {
//                    Toast.makeText(this, "이미지를 넣어주세요", Toast.LENGTH_SHORT).show()
//                }
//            }
        }
    }

 

 


 

https://velog.io/@dev_thk28/Android-Retrofit2-Multipart%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-Java

 

[Android] Retrofit2 Multipart사용하기 (Java)

Multipart 사용하기

velog.io

 

다 리퀘스트 바디를 사용하라는데 팀원분은 사용하지 않고도 하셨다.

어느 부분에서 오류가 나는 걸까?

 

 


뷰페이저 추가 부분을 성공했다!

이거때문에 몇주를 붙잡고 있었는데 항상 해결을 간단했다.

인터페이스를 이용했다.

 

viewpageradater에서 추가버튼이 리스트 사이즈에 따라 보이게 해놨다.

package com.example.mumulcom //패키지명

import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.Toast
import androidx.annotation.NonNull
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.mumulcom.databinding.ItemSliderBinding


//코딩질문 개념질문 답변하기 작성자 어댑터
//  class ViewPagerAdapter(var context: Context, var photoList: ArrayList<Photo>, private var photoClickLister: PhotoClickLister) : RecyclerView.Adapter<ViewPagerAdapter.ViewHolder>(){
//
//    var onItemClickListener:OnItemClickListener?=null
//
//
//    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
//        val imageIv: ImageView =itemView.findViewById<ImageView?>(R.id.imageSlider)
//        val plusIv: ImageView =itemView.findViewById<ImageView?>(R.id.view_Plus_Iv)
//        fun bind(photo:Photo){
//            Glide.with(context).load(photo.imageUrl).into(imageIv)
//            imageIv.setOnClickListener {
//                if(onItemClickListener!=null)
//                    onItemClickListener?.onItemClick(photo)
//            }
//        }
//
//    }
//
//
//    interface OnItemClickListener{
//        fun onItemClick(photo:Photo)
//    }
//
//    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
//    : ViewHolder {
//        val view=LayoutInflater.from(context).inflate(R.layout.item_slider,parent,false)
//        return ViewHolder(view)
//
//    }
//
//    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
//    var photo= photoList.get(position)
//    holder.bind(photo)
//        holder.imageIv.setOnClickListener { view ->
//            Toast.makeText(
//                view.context,
//                position.toString(),
//                Toast.LENGTH_SHORT
//            ).show()
//
//        }
//    if (position!=0){
//        holder.plusIv.visibility=View.VISIBLE
//    }
//        Log.d("size", photoList.size.toString())
//    holder.plusIv.setOnClickListener {
//
//    }
//        holder.plusIv.setOnClickListener { view ->
//            intArrayOf()
//        }
////        holder.bind(photoList[position])
////        holder.imageIv.setOnClickListener {
////            val intent=Intent(context, CodingCameraShootingActivity::class.java)
////        }
//
//    }
//
//
//    override fun getItemCount(): Int {
//        return photoList.size
//    }
//
//
//
//    @SuppressLint("NotifyDataSetChanged")
//    fun addlist(photoList: ArrayList<Photo>){
////        this.photoList.clear()
//        notifyDataSetChanged()
//    }
//
//}

class ViewPagerAdapter(var context: Context, var photoList: ArrayList<Photo>, private var photoClickLister: PhotoClickLister) :
    RecyclerView.Adapter<ViewPagerAdapter.PhotoViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = PhotoViewHolder(
        ItemSliderBinding.inflate(LayoutInflater.from(parent.context), parent, false),
        this.photoClickLister
    )


    override fun onBindViewHolder(holder: PhotoViewHolder, position: Int) {
        var photo= photoList.get(position)
        holder.bindWithView(photo)

        if (photoList.size==2) {
            if (position == 1) {
                holder.photoplus.visibility = View.VISIBLE
            }
        }
        if (photoList.size==3) {
            if (position == 2) {
                holder.photoplus.visibility = View.VISIBLE
            }
        }
        if (photoList.size==4) {
            if (position == 3) {
                holder.photoplus.visibility = View.VISIBLE
            }
        }
        if (photoList.size==5) {
            if (position == 4) {
                holder.photoplus.visibility = View.VISIBLE
            }
        }
        if (photoList.size==6){
            if (position == 5) {
                holder.photoplus.visibility = View.VISIBLE
            }
        }
    }

    inner class PhotoViewHolder(
        private val viewBinding: ItemSliderBinding,
        private var photoClickLister: PhotoClickLister
    ) :
        RecyclerView.ViewHolder(viewBinding.root) {

        private val photoImageView = viewBinding.imageSlider
        val photoplus=viewBinding.viewPlusIv

        fun bindWithView(photo: Photo) {
            Glide
                .with(photoImageView.context)
                .load(photo.imageUrl)
                .into(photoImageView)

            if (photoList.size<=5) {
                photoplus.setOnClickListener {
                    this.photoClickLister.onPhotoClicked(photo)
                }
            }
            else{
                photoplus.setOnClickListener { view ->
                    Toast.makeText(view.context, "이미지는 최대 5개까지 넣을 수 있습니다", Toast.LENGTH_SHORT)
                        .show()
                }
            }
        }

    }

    override fun getItemCount(): Int {
        return photoList.size
    }
}

 

인터페이스 구축!

 

interface PhotoClickLister {
    fun onPhotoClicked(photo: Photo)
}

 

그다음 액티비티에서 연결시켜주면 되는 간단한 문제 이다!

'무물컴 앱개발기록' 카테고리의 다른 글

내가 이 프로젝트를 진행하면 배운 것들  (0) 2022.06.18
개발일지 33 -3/18  (0) 2022.03.27
개발일지 31 - 3/14  (0) 2022.03.16
개발일지 30- 3/10  (0) 2022.03.13
개발일지 29 - 3/6  (0) 2022.03.08