개발/안드로이드
[Kotlin] 안드로이드 카메라 구현 예제
크리쓰마스
2020. 10. 14. 09:12
프로젝트에서 애플리케이션에서 사진을 찍어 해당 사진을 서버로 보내는 기능을 넣기로 했다.
코틀린을 처음 사용해서 제대로 못쓰는거 같다.
안드로이드에서 카메라를 사용하는 방법은 2가지가 있다고 하는데
Surfaceview로 커스텀해서 카메라 프리뷰를 만드는 방법은 좀 어렵다고 하니
구현하기 쉬운 Intent로 구현한다.
AndroidManifest.xml
1
2
3
4
5
6
7
8
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
|
cs |
저장소 관련 권한과, 카메라 권한을 준다.
MainActivity.kt
1
2
3
4
5
6
7
8
9
10
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 카메라 실행 부분
if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(cameraIntent, 1)
} else {
Log.d("test", "권한 설정 요청")
ActivityCompat.requestPermissions(this@MainActivity, arrayOf<String?>(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
}
}
|
cs |
카메라 및 저장소 접근 권한을 확인하고,
카메라 인텐트를 만들어 시작하면 끝.
MainActivity.kt - onActivityResult
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//findViewById(R.id.result_image).setImageURI(photoUri);
try {
when (requestCode) {
REQUEST_TAKE_PHOTO -> {
if (resultCode === Activity.RESULT_OK) {
val file = File(mCurrentPhotoPath)
myBitmap = MediaStore.Images.Media
.getBitmap(contentResolver, Uri.fromFile(file))
}
}
}
} catch (error: Exception) {
error.printStackTrace()
}
|
cs |
onActivityResult에서 카메라 intent의 결과를 받아와서, Bitmap으로 불러온다.
이후 imageView에 넣어도 되고.. 자유롭게 사용하면 된다.
결과
카메라 intent를 사용하는 경우, 결과 사진이 회전되고 화질이 낮아서
해결하는 방법은 다음 게시글에 작성할 예정