! 혼자서 여러 기능(아무거나 내가 넣어보고 싶은 것들)을 가진 모듬을 만들고 있는데, 그 중 첫 번째가 손전등 기능이다.
일단, 의존성 주입은 Hilt를 사용했고, 손전등이 꺼져 있는지 안꺼져있는지 상태를 관찰하기 위해 ViewModel과 StateFlow를 사용해서 구현했다.
일단 Torch라는 코틀린 파일을 하나 만들어서 코드를 구현했다.
package com.assorted.presentation.light
import android.content.Context
import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager
import dagger.hilt.android.qualifiers.ActivityContext
import javax.inject.Inject
class Torch @Inject constructor(
@ActivityContext private val context: Context
) {
private var cameraId: String? = null
//1
private val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
//2
init {
cameraId = getCameraId()
}
//MainActivity에서 사용할 예정.
//3
fun flashCheck(value: Boolean) {
cameraManager.setTorchMode(cameraId.toString(), value)
}
//2
private fun getCameraId(): String? {
val cameraIds = cameraManager.cameraIdList
for (id in cameraIds) {
val info = cameraManager.getCameraCharacteristics(id)
val flashAvailable = info.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)
val lensFacing = info.get(CameraCharacteristics.LENS_FACING)
if (flashAvailable != null
&& flashAvailable
&& lensFacing != null
&& lensFacing == CameraCharacteristics.LENS_FACING_BACK
) return id
}
return null
}
}
private val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
init {
cameraId = getCameraId()
}
private fun getCameraId(): String? {
val cameraIds = cameraManager.cameraIdList
for (id in cameraIds) {
val info = cameraManager.getCameraCharacteristics(id)
val flashAvailable = info.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)
val lensFacing = info.get(CameraCharacteristics.LENS_FACING)
if (flashAvailable != null
&& flashAvailable
&& lensFacing != null
&& lensFacing == CameraCharacteristics.LENS_FACING_BACK
) return id
}
return null
}
이때 플래쉬가 이용가능한지 뒷면에 렌즈가 있는 카메라인지를 체크한다.
가능하다면 카메라 ID를 return 한다.
fun flashCheck(value: Boolean) {
cameraManager.setTorchMode(cameraId.toString(), value)
이렇게 Torch 클래스를 만든 뒤 MainActivity에서 이미지와 이벤트를 연결시켜 주면 끝난다!
@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding>(R.layout.activity_main) {
@Inject
lateinit var torch: Torch
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
clickLight()
setLight()
}
//손전등 클릭 이벤트
private fun clickLight() {
binding.btnLight.setOnClickListener {
mainViewModel.setLightCheck()
}
}
//손전등 관찰
private fun setLight() {
mainViewModel.lightCheck.flowWithLifecycle(lifecycle)
.onEach {
torch.flashCheck(it)
binding.btnLight.isSelected = it
}
.launchIn(lifecycleScope)
}