[AndroidStudio] 카메라앱 구동

han91·2024년 5월 29일

[AndroidStudio]

목록 보기
14/15

MainActivity.kt

class MainActivity : AppCompatActivity() {
    val binding by lazy {
        ActivityMainBinding.inflate(layoutInflater)
    }

    lateinit var cameraPermission: ActivityResultLauncher<String>
    lateinit var storagePermission: ActivityResultLauncher<String>
    // Uri에 접속할 수 있게 권한을 주기 위해 변수 선언
    lateinit var cameraLauncher: ActivityResultLauncher<Uri>
    lateinit var galleryLauncer: ActivityResultLauncher<String>

    // Uri 변수 선언 -> Uri 는 nullable 이면 안됨
    lateinit var photoUri:Uri

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        // 앱 실행시 앱을 사용하는 동안 권한에 관한 팝업을 띄워줌
        // it -> 결과 (boolean)
        storagePermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
            if (it) {
                setViews()
            } else {
                Toast.makeText(baseContext,
                    "외부 저장소 권한을 승인 해야 앱을 사용할 수 있습니다",
                    Toast.LENGTH_SHORT
                ).show()
                finish()
            }
        }
        // 앱 실행시 앱을 사용하는 동안 카메라 권한에 관한 팝업을 띄움
        cameraPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
            if(it) {
                openCamera()
            } else {
                Toast.makeText(baseContext,
                    "카메라 권한을 승인 해야 카메라를 사용할 수 있습니다",
                    Toast.LENGTH_SHORT
                ).show()
                finish()
            }
        }
        // it 대신 다른 operator 를 사용 해도 됨 대신 operator -> 로 작성
        cameraLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess ->
            if (isSuccess) binding.imageView.setImageURI(photoUri)
        }
        // 갤러리를 실행 했을 때 작동 하는 코드
        galleryLauncer = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->

        }

        storagePermission.launch(android.Manifest.permission.READ_MEDIA_IMAGES)
//        storagePermission.launch(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
    }
    fun setViews() {
        // 버튼을 눌렀을 때 permission 을 launch 해줌
        binding.btnCamera.setOnClickListener {
            cameraPermission.launch(android.Manifest.permission.CAMERA)
        }
        binding.btnGallery.setOnClickListener {
            openGallery()
        }
    }

    fun openCamera() {
        // createTempFile -> 임시 파일을 만들어 줌
        // prefix -> createTempFile 에서 뒤에 숫자를 붙여줌
        // suffix -> 확장자
        var photoFile = File.createTempFile(
            "IMG_",
            ".jpg",
            getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        )
        // file 의 uri 를 가져 와서 사용 -> File 이름과 구조를 Uri 로 바꿔줌
        photoUri = FileProvider.getUriForFile(
            this,
            "${packageName}.provider",
            photoFile
        )
        // launcher 를 launch 시켜줌
        cameraLauncher.launch(photoUri)
    }

    fun openGallery() {
        // 갤러리에서 선택한 이미지를 imageView 에 띄우기
        galleryLauncer.launch("image/*")
    }
}

AndroidManifest.xml


...

<uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>

...

</activity>
<!--    추가한 부분    -->
        <provider
            android:authorities="${applicationId}.provider"
            android:name="androidx.core.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
        </provider>

    </application>
profile
천방지축어리둥절빙글빙글돌아가는개발자

0개의 댓글