[Android] Kotlin - 손전등

곽호택·2022년 12월 4일
0

안드로이드

목록 보기
16/16
post-thumbnail

! 혼자서 여러 기능(아무거나 내가 넣어보고 싶은 것들)을 가진 모듬을 만들고 있는데, 그 중 첫 번째가 손전등 기능이다.

일단, 의존성 주입은 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
    }
}
  1. 손전등을 키기 위해서는 cameraManager객체가 필요하다.
    private val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
  1. 손전등을 끄거나 킬때 카메라 ID가 필요한데 이는 init 생성자를 통해 클래스 초기화 시에 얻는다.
    카메라ID는 기기에 내장된 카메라마다 고유한 ID가 부여된다.
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 한다.

  1. setTorchMode를 통해 플래쉬를 끄거나 킨다.
    위에서 생성한 cameraId와 킬경우 true를, 끌경우 false를 넣어주면 된다.
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)
    }
profile
잘하고싶다

0개의 댓글