프로젝트에서 애플리케이션에서 사진을 찍어 해당 사진을 서버로 보내는 기능을 넣기로 했다.

코틀린을 처음 사용해서 제대로 못쓰는거 같다.

안드로이드에서 카메라를 사용하는 방법은 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를 사용하는 경우, 결과 사진이 회전되고 화질이 낮아서

해결하는 방법은 다음 게시글에 작성할 예정

+ Recent posts