카메라 사용하기

Jiyoon Chae·2021년 6월 3일
0

안드로이드

목록 보기
2/23
  1. UI화면 만들고 권한 요청하기
<uses-permission android:name="android.permission.CAMERA"/>  //카메라 권한
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  //저장소 읽기
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> //저장소 쓰기
  1. 카메라 및 촬영한 사진을 저장할 외부 저장소 권한을 요청하는 코드
  • BaseActivity 상속 사용 - permissionGranted(), permissionDenied() 추상 메서드 사용!!
  • MainActivity에서 카메라 앱 호출하기
    • Intent에 카메라 앱을 호출하기 위한 플래그인 MediaStore.ACTION_IMAGE_CAPTURE를 담아 startActivityForResult() 메서드로 호출하면 카메라 앱 촬영화면 호출할 수 있음.
//카메라 요청
    fun openCamera() {
        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        startActivityForResult(intent, REQ_CAMERA) //101
}

카메라에서 찍은 사진을 외부저장소(포토갤러리)에 저장할 거면

setContentView 아랫줄에 저장소 권한을 요청하는 코드를 작성해야한다.

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        //외부 저장소 권한 요청
        requirePermissions(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),PERM_STORAGE) //99

}

카메라 앱 호출하기

외부 저장소 권한 요청(99) > 저장소 승인 시 실행할 코드(permissionGranted) or 승인 거부시 실행할코드 (permissionDenied) >

외부 저장소 권한이 승인되었을 때 호출 (setViews) > 버튼 클릭 시 카메라 권한 요청(100) (직접 호출이 아닌 결과에 따라 승인되었을 경우에만 permissionGranted()에서 카메라를 요청할 것.)

카메라 요청(101)하는 openCamera() 작성

권한 처리 메서드에서 각각의 코드 완성하기.

permissionGranted() 에서 > 카메라 권한 승인 시 > openCamera()


정리 : 외부 저장소 권한 요청 > 승인 > 카메라 권한 요청 > 승인 > 카메라 요청

외부 저장소 권한 요청 > 거부 > 토스트 메시지 > 앱 종료

외부 저장소 권한 요청 > 승인 > 카메라 권한 요청 > 거부 > 토스트 메시지

사진 촬영 > 결과값 > 이미지뷰에 출력


사진 촬영이 완료되면 onActivityResult() 메서드로 결괏값이 전달된다!!

  • 촬영한 사진 정보는 세번째 파라미터인 data에 인텐트로 전달이 된다.

  • 전달받은 data 파라미터에서 사진을 꺼내 이미지 뷰에 셋팅.

    :data 파라미터를 통해 전달되는 사진은 data.extras.get("data")로 꺼낼 수 있다. 꺼낸 값이 null이 아닌지 확인 후 Bitmap으로 형변환 하고 사용해야 한다. data.extras.get으로 꺼낸 값의 타입이 Object이므로 변환하지 않으면 이미지뷰에 사용할 수 없다. data나 extras가 null일 수 도 있기때문에 data?.extras?.get("data")로 null안정성 체크하기.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(resultCode == Activity.RESULT_OK)
            when(requestCode) {  
                REQ_CAMERA -> {
                    realUri?.let { uri ->
                        val bitmap = loadBitmap(uri)
                        binding.challengeWriteImage.setImageBitmap(bitmap)

                        if(findImageFileNameFromUri(uri)) {
                            Log.d("PICK_FROM_GALLERY","갤러리에서 절대주소 Pick 성공")
                        } else {
                        Log.d("PICK_FROM_GALLERY","갤러리에서 절대주소 Pick 실패")
                    }
                        realUri = null
                    }

                }
                REQ_STORAGE -> {
                    //갤러리에서 가져온 이미지데이터를 IMAGEPREVIEW에 할당
                    //(data의 data속성으로 해당 이미지의 uri가 전달)
                    data?.data?.let { uri ->
                        binding.challengeWriteImage.setImageURI(uri)
                       realUri = uri
                    }

                }
            }
    }
  • 위의 단계까지는 이미지 프리뷰가 data로 전달되어 흐리게 깨져 보임.
  • 실제 이미지를 미디어 스토어에 저장하고, 저장된 이미지를 가져와서 화면에 보여주는 코드
  • 이미지의 Uri 를 가져와서 저장할 프로퍼티 추가
var realUri : Uri? = null //uri 는 특정 리소스 자원을 고유하게 식별할 수 있는 식별자 의미.
  • 촬영한 이미지를 저장할 Uri를 미디어 스토어에 생성하는 메서드 생성 : CreateImageUri()
//이미지를 미디어 스토어에 생성
    fun createImageUri(filename:String, mimeType:String):Uri? {
        var values = ContentValues() //(파일명, 파일타입 입력)
        values.put(MediaStore.Images.Media.DISPLAY_NAME, filename)
        values.put(MediaStore.Images.Media.MIME_TYPE, mimeType)
        return contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values)
    }

//MediaStore.Images.Media.EXTERNAL_CONTENT_URI : 사진이 저장될 저장소의 이름이 상수로 정의되어 있는 것.
//db로 비교하면 테이블 이름과 같은 역할.

사진 촬영 > 파일명 생성 > 이미지 uri 생성 > 미디어 스토어에 저장 > uri를 사용해서 미디어 스토어에 저장된 이미지 읽어오기 >

profile
바닐라라떼 좋아☕

0개의 댓글