안드로이드 스튜디오 camera, gallery(with Kotlin)

Purang·2023년 2월 13일
0

Android Studio

목록 보기
26/28

Camera와 Gallery에 접근하는 방법을 공부하였습니다!


위와 같은 사진처럼 완성되는 데 버튼을 통해 카메라와 갤러리를 이동할 수 있도록 하였습니다.

먼저 카메라 기능을 사용하기 전에! Manifest의 permission을 설정해줍니다!

<uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera" android:required="true" />

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />

permission을 통해 사용자의 권한 설정을 받은 후에 사용이 가능합니다.

mBinding.chatFab.setOnClickListener {
            if (ContextCompat.checkSelfPermission(
                    this@MainActivity.applicationContext,
                    android.Manifest.permission.CAMERA
                ) == PackageManager.PERMISSION_GRANTED
            ) {
                Toast.makeText(this, "success", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "fail", Toast.LENGTH_SHORT).show()
            }

            if (ContextCompat.checkSelfPermission(
                    this@MainActivity.applicationContext,
                    android.Manifest.permission.READ_EXTERNAL_STORAGE
                ) == PackageManager.PERMISSION_GRANTED
            ) {
                Toast.makeText(this, "success", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "fail", Toast.LENGTH_SHORT).show()
            }

            val intent = Intent(this, CameraActivity::class.java)
            startActivity(intent)
        }
        ...
        fun requestPermission() {
        val per1 = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
        val per2 = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)

        if (per1 == PackageManager.PERMISSION_DENIED || per2 == PackageManager.PERMISSION_DENIED) {
            requestPermissions(
                arrayOf(
                    android.Manifest.permission.CAMERA,
                    android.Manifest.permission.READ_EXTERNAL_STORAGE
                ),
                1000
            )
        }
    }

우선 카메라액티비티 이동 전 mainActivity에서 권한 인증을 한 후 이동이 가능하도록 하였습니다.

그 후 카메라와 갤러리를 가질 액티비티를 생성해줍니다. 저는 CameraActivity를 생성하도록 하겠습니다.
xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CameraActivity">

  <Button
      android:id="@+id/cameraBtn"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="69dp"
      android:layout_marginBottom="55dp"
      android:text="카메라 열기"
      app:layout_constraintBottom_toTopOf="@+id/cameraIV"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintHorizontal_bias="0.264"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent" />

  <Button
      android:id="@+id/galleryBtn"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="69dp"
      android:layout_marginBottom="55dp"
      android:text="갤러리 열기"
      app:layout_constraintBottom_toTopOf="@+id/cameraIV"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintHorizontal_bias="0.709"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      app:layout_constraintVertical_bias="0.0" />

  <ImageView
      android:id="@+id/cameraIV"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:layout_marginBottom="278dp"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/cameraBtn" />

</androidx.constraintlayout.widget.ConstraintLayout>

실제 코드

private lateinit var cameraBinding: ActivityCameraBinding
    private var launcher = registerForActivityResult(ActivityResultContracts.GetContent()) {
            it -> setGallery(uri = it)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        cameraBinding = ActivityCameraBinding.inflate(layoutInflater)
        setContentView(cameraBinding.root)

        cameraBinding.cameraBtn.setOnClickListener {
            val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)//.also {
                /*imageCaptureIntent -> imageCaptureIntent.resolveActivity(packageManager)?.also {
                    activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult())  { result ->
                        print(result.resultCode)
                        if (result.resultCode == 1) {

                        }
                    }
                    }*/
            //}
            startActivityForResult(intent, requestCamera)
        }

        cameraBinding.galleryBtn.setOnClickListener {
            launcher.launch("image/*")
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == requestCamera && resultCode == RESULT_OK) {
            val imageBitmap = data?.extras?.get("data") as Bitmap

            cameraBinding.cameraIV.setImageBitmap(imageBitmap)
        }
    }

    fun setGallery(uri : Uri?) {
        cameraBinding.cameraIV.setImageURI(uri)
    }

launcher를 통해 갤러리를 이동할 수 있도록 하였고 intent의 MediaStore.ACTION_IMAGE_CAPTURE를 통해 카메라를 열 수 있도록 하였습니다.


카메라 버튼 클릭 시


갤러리 버튼 클릭 시


카메라로 사진을 찍은 후

사진 순으로 차례로 확인할 수 있었습니다!

profile
몰입의 즐거움

0개의 댓글