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를 통해 카메라를 열 수 있도록 하였습니다.
카메라 버튼 클릭 시
갤러리 버튼 클릭 시
카메라로 사진을 찍은 후
사진 순으로 차례로 확인할 수 있었습니다!