Skip to content

승완 문의 하기, 약속 하기

wandukong edited this page Jan 15, 2021 · 3 revisions

안드 커밋대장 그의 이름

양 승 완

1. 문의에 필요한 사진 업로드 기능 구현

갤러리 접근 권한 확인

private fun picturesFromGallery() {  
	binding.btnPictureGallery.setOnClickListener {  
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
			if(checkSelfPermission(requireContext(), android.Manifest.permission.READ_EXTERNAL_STORAGE) 
			== PackageManager.PERMISSION_DENIED){  
				val permissions = arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE)
				// show popup to request runtime permission  
				requestPermissions(permissions, PERMISSION_CODE_IMAGE)  
			}else{   
				selectImageFromGallery()  
			} 
		}else{  // OS is < Marshmallow  
			selectImageFromGallery()  
		}  
	}  
}

갤러리에서 사진 불러오기

private fun selectImageFromGallery() {  
	val intent = Intent(Intent.ACTION_PICK)  
	intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)  
	intent.type = "image/*"  
	val chooserIntent = Intent.createChooser(intent, "Select Pictures")  
	startActivityForResult(chooserIntent, IMAGE_PICK_CODE)  
}

불러온 사진 처리

@RequiresApi(Build.VERSION_CODES.KITKAT)  
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {  
	super.onActivityResult(requestCode, resultCode, data)  
	if(resultCode == Activity.RESULT_OK) {  
		when(requestCode){
			IMAGE_PICK_CODE -> {  
				filesAdapter.uriData.clear()  
					if (data?.clipData != null) {  
						val filesSize = data.clipData!!.itemCount  
						var uriList: MutableList<Uri> = mutableListOf()  

						if (filesSize > 5) {  
							Toast.makeText(requireContext(), "이미지 첨부는 5장까지만 가능합니다.", 
								Toast.LENGTH_SHORT).show()  
							for (i in 0 until 5) {  
								var dataUri = data.clipData!!.getItemAt(i).uri  
								filesAdapter.uriData.add(dataUri)  
								uriList.add(absolutelyPath(dataUri).toUri())  
							}  
							viewModel.changeFilesUri(uriList as ArrayList<Uri>)  
						} 
						else {  
							for (i in 0 until filesSize) {  
								var dataUri = data.clipData!!.getItemAt(i).uri  
								filesAdapter.uriData.add(dataUri)  
								uriList.add(absolutelyPath(dataUri).toUri())  
							}  
							viewModel.changeFilesUri(uriList as ArrayList<Uri>)  
						}  binding.rvPicture.visibility = View.VISIBLE  
					binding.clLoadCamera.visibility = View.INVISIBLE  
				}
			}
		}
	}
}

서버로 이미지 업로드

if(!viewModel.issueFilesUri.value.isNullOrEmpty()){  
	for (i in 0 until viewModel.issueFilesUri.value!!.size) {  
		val file = File(viewModel.issueFilesUri.value!![i].toString())  
		var requestBody : RequestBody = RequestBody.create(MediaType.parse("image/*"), file)  
		imageParts.add(MultipartBody.Part.createFormData("issue_img", file.name, requestBody))  
	}  
	filesCall = HousingServiceImpl.service.postCommunicationFiles(token, imageParts)  
}
else{  
	filesCall = HousingServiceImpl.service.postCommunicationNoFiles(token)  
}  
filesCall.enqueue(object : Callback<ResponseAskFileData> {  
	override fun onResponse(call: Call<ResponseAskFileData>, response: Response<ResponseAskFileData>) {  		
		response.takeIf { it.isSuccessful }  
			?.body()  
			?.let {  
				Log.e("asd", it.data.issue_id.toString())  
				requestContent(token, it.data.issue_id)  
			}?:showError(response.errorBody())  
	}  
	override fun onFailure(call: Call<ResponseAskFileData>, t: Throwable) {  
	}
})

2. 카메라에서 필요한 사진 업로드 기능 구현

카메라 접근 권한 확인

private fun picturesFromGallery() {  
	binding.btnPictureGallery.setOnClickListener {  
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
			if(checkSelfPermission(requireContext(), android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED){  
				// permission denied  
				val permissions = arrayOf(android.Manifest.permission.CAMERA)  
				// show popup to request runtime permission  
				requestPermissions(permissions, PERMISSION_CODE_CAMERA)  
			}else{  
				takeImage()  
			}
		}else{  // OS is < Marshmallow  
			takeImage()
		}  
	}  
}

사진 찍기

private fun takeImage() {  
  val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)  
  startActivityForResult(intent, CAMERA_CAPTURE_CODE)  
}

불러온 사진 처리

@RequiresApi(Build.VERSION_CODES.KITKAT)  
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {  
	super.onActivityResult(requestCode, resultCode, data)  
	if(resultCode == Activity.RESULT_OK) {  
		when(requestCode){
			CAMERA_CAPTURE_CODE -> {  
				var bmp = data?.extras!!.get("data") as Bitmap  
				binding.ivPictureLoadPicture.setImageBitmap(bmp)  
				binding.clLoadCamera.visibility = View.VISIBLE  
				binding.rvPicture.visibility = View.INVISIBLE  
				viewModel.changeFileBitmap(bmp)  
			}
		}
	}
}

서버로 이미지 업로드

if(viewModel.issueFileBitmap.value != null){  
	val bitmap = viewModel.issueFileBitmap.value  
	val file = savebitmap(bitmap!!)  
	var requestBody : RequestBody = RequestBody.create(  
		MediaType.parse("image/*"),  
		file  
	)  
	imageParts.add(  
		MultipartBody.Part.createFormData("photo", file!!.name, requestBody)  
	)  
	filesCall = HousingServiceImpl.service.postCommunicationFiles(token, imageParts)  
}
filesCall.enqueue(object : Callback<ResponseAskFileData> {  
	override fun onResponse(call: Call<ResponseAskFileData>, response: Response<ResponseAskFileData>) {  		
		response.takeIf { it.isSuccessful }  
			?.body()  
			?.let {  
				Log.e("asd", it.data.issue_id.toString())  
				requestContent(token, it.data.issue_id)  
			}?:showError(response.errorBody())  
	}  
	override fun onFailure(call: Call<ResponseAskFileData>, t: Throwable) {  
	}
})

3. 날짜 및 시간 선택 다이얼로그 구현

데이트 피커

private fun selectDate() {  
	val calendar = Calendar.getInstance()  
	val year = calendar.get(Calendar.YEAR)  
	val month = calendar.get(Calendar.MONTH)  
	val day = calendar.get(Calendar.DATE)  

	val minDate = Calendar.getInstance()  
	minDate.set(year, month, day)  

	editTextIsChanged(binding.edtTimeDate)  

	binding.edtTimeDate.setOnFocusChangeListener { _, chk ->  
		if(chk){  
			val datePickerDialog = DatePickerDialog(this,{ _, year, month, day ->  
				promiseDate = changeDateFormat(year,month+1, day)  
				binding.edtTimeDate.setText(promiseDate)  
			}, year, month, day)  
			datePickerDialog.datePicker.minDate = minDate.time.time  
			datePickerDialog.show()  
			binding.edtTimeDate.clearFocus()  
		}  	
	}  
}

타임 피커

private fun selectTime(edt: EditText) {  
  
	editTextIsChanged(edt)  
	val dialogBinding : DialogTimePickerBinding = DataBindingUtil.inflate(  
						LayoutInflater.from(this), R.layout.dialog_time_picker, null, false )  

	edt.setOnFocusChangeListener { _, chk ->  
		if(chk){  
			edt.clearFocus()  
			val alertDialog = AlertDialog.Builder(this)  
			val dialog: AlertDialog = alertDialog.create()  

			if(dialogBinding.root.parent != null){  
				val viewGroup : ViewGroup = dialogBinding.root.parent as ViewGroup  
				viewGroup.removeView(dialogBinding.root)  
			}  
			dialogBinding.btnDatePickerCancel.setOnClickListener {  
				dialog.dismiss()  
				dialog.cancel()  
				edt.clearFocus()  
			}  
			dialogBinding.btnDatePickerOk.setOnClickListener {  
				val tempTime = changeHourFormat(dialogBinding.pckHour.value, 
								dialogBinding.pckMeridian.value)  
				edt.setText(tempTime + "")  
				dialog.dismiss()  
				dialog.cancel()  
				edt.clearFocus()  

				if(edt == binding.edtTimeStartTime){  
					promiseStartTime = tempTime  
				}
				else{  
					promiseEndTime = tempTime  
				}  
			}  
			dialogBinding.pckHour.wrapSelectorWheel = false  
			dialogBinding.pckMeridian.wrapSelectorWheel = false  

			dialogBinding.pckMeridian.minValue = 0  
			dialogBinding.pckMeridian.maxValue = 1  
			dialogBinding.pckMeridian.displayedValues = arrayOf("AM", "PM")  

			dialogBinding.pckHour.minValue = 1  
			dialogBinding.pckHour.maxValue = 12  

			dialog.setView(dialogBinding.root)  
			dialog.show()  
		}  	
	}  
}