-
안드로이드 앱에서 내장 카메라로 촬영하기IT 생활/안드로이드 앱 개발 2020. 11. 27. 00:38
집에 안쓰는 안드로이드 스마트폰이 있어서 어떻게 활용해볼까 앱을 하나 만들어 보려고 합니다.
그래서 제가 안드로이드 앱 개발 카테고리도 만들고 안드로이드 개발 환경을 구성하면서 포스팅을 했었습니다.
취미로 공부도 할 겸 집에서 사용할 CCTV앱을 하나만들어 보려고 합니다.
새로운 플랫폼 (안드로이드)에서 개발하는 경험도 쌓고, 새로운 언어 (코틀린)도 배워서 개발자로서 역량도 키우고, 앱을 완성하면 앱스토어에 올려서 부수입을 얻을 수 있지 않을까 하는 얄팍한 생각입니다.
아직은 시작한지 얼마 되지도 않았고 퇴근 후에 잠깐 밖에 못하기 때문에 많이는 못하고 있습니다만, 앱을 만들어 가면서 알아가는 내용을 블로그에도 정리를 하려고 합니다.
안드로이드 개발자 사이트에 있는 "Take photos" 에 보면 안드로이드 앱에서 카메라 기능을 이용하여 사진 촬영하는 방법에 대해서 자세하게 설명하고 있습니다. 그런데 국문으로 번역된 것을 보면 한글로 써 있는대도 이해가 잘 가지 않았습니다. 그래서 이 글에서는 "Take photos"과 블로그로 통해서 확인한 내용을 설명하고자 합니다. 확신은 없지만 이해하기 쉽게 써보도록 하겠습니다.
서문
개발하려는 앱에 사진을 사용하는 기능이 필요한 경우가 있을 것인데, 안드로이드로 구동되는 장비들 (스마트폰이나 태블릿)에는 최소한 한개의 카메라가 장착되어 있을 겁니다. 특히 요즘에는 스마트폰 제조사는 경쟁하듯이 카메라의 갯수를 늘리고 있는 걸 보면 그만큼 카메라를 사용하는 사용자들이 많다고 볼 수 있습니다.
Request the camera feature (카메라 기능 요청)
manifest파일에 <uses-feature> 태그를 이용하여 카메라 기능을 사용한다고 명시적으로 나타낼 수 있습니다.
app/manifests에 있는 AndroidManifest.xml의 내용은 다음과 같습니다.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <uses-feature android:name="android.hardware.camera2" android:required="true"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApplication"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
<uses-feature>로 카메라 기능을 명시해 놓으면 구글 플레이 스토어에서 카메라가 없는 기기에서는 앱이 보여지지 않게 됩니다.
카메라 기능을 사용하긴 하나 필수가 아닌 경우에는 andorid:requered="false"로 설정하면 됩니다.
작성한 앱이 설치된 기기에서 오작동을 하지 않도록 미리 필터링해 줄 수 있게 됩니다.
앱에서 카메라 기능을 사용한다는 의미일 뿐이지 <uses-feature>에서 명시하지 않아도 앱에서 카메라 기능을 사용할 수 있습니다.
카메라 유무 확인하기
menifest파일에서 카메라 기능 사용을 명시하지 않았거나 andorid:requered="false"로 설정한 경우에는 앱에서 기기에 카메라가 있는지 직접 확인한 뒤 카메라 기능을 사용해야 합니다.
Android API에는 이를 위해서 hasSystemFeature(PackageManage.FEATURE_CAMERA_ANY)를 제공하고 있습니다.
Kotlin을 사용하는 경우에는 다음과 같이 하시면 됩니다.
import android.content.pm.PackageManager; if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { // do something with camera }
내장 카메라 기능 사용하기
안드로이드에서는 카메라 앱을 내장하고 있으며 일반적인 사진 및 동영상 촬영은 내장 카메라앱을 사용하는 것이 일반적입니다.
내장 카메라 앱을 사용하기 위해서는 Intent를 사용하면 됩니다.
java 디렉토리에 위치하는 MainActivity.kt의 내용은 다음과 같습니다.
package com.example.myapplication import android.content.ActivityNotFoundException import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.provider.MediaStore import android.content.pm.PackageManager const val REQUEST_IMAGE_IMAGE_CAPTURE = 1 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { dispatchTakePictureIntent() } } private fun dispatchTakePictureIntent() { val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) try { startActivityForResult(takePictureIntent, REQUEST_IMAGE_IMAGE_CAPTURE) } catch (e: ActivityNotFoundException) { // display error state to the user } } }
앱 테스트
내장 카메라 기능을 통해서 카메라를 사용하고 사진 촬영이 되는지 확인하도록 합시다.
안드로이드 스마트폰을 준비한 뒤 디버깅 모드로 설정하여 컴퓨터와 연결을 해줍니다.
제가 맥을 사용하는 관계로 이전에 맥에서 안드로이드 스마트폰을 연결하는 방법에 대해서 포스팅했었는데요.
이전 글들을 참고하시기 바랍니다.
2020/11/15 - [IT 생활/안드로이드 앱 개발] - 맥에서 안드로이드 스튜디오와 스마트폰을 무선으로 연결하는 방법
2020/11/18 - [IT 생활/Mac Life] - 맥에서 안드로이드폰 연결하는 법
안드로이드 스튜디오에서 스마트폰에 앱을 설치하여 구동하면 바로 카메라 촬영 화면으로 들어가지게 됩니다.
촬영을 하게 되면 촬영 내용을 확인할 수 있게 되지만, 이 후에는 카메라 기능 사용이 끝나고 앱의 원래 화면으로 돌아가게 됩니다.
이상으로 안드로이드에 내장된 카메라 기능을 활용하는 방법에 대해서 알아보았습니다.
단순하게 사진을 찍는 것만 할 수 있었는데요. 다음 글에서는 찍은 사진을 저장하는 법에 대해서 다뤄보도록 하겠습니다.
'IT 생활 > 안드로이드 앱 개발' 카테고리의 다른 글
맥에서 안드로이드 스튜디오와 스마트폰을 무선으로 연결하는 방법 (0) 2020.11.15 안드로이드 앱 개발을 위한 Kotlin 기초 (0) 2020.10.19 안드로이드 앱 스마트폰에서 테스트하기 (feat. 갤럭시S5) (0) 2020.10.10 생애 첫 안드로이드 앱 만들기 (feat. Android Virtual Device) (0) 2020.10.08 구형 노트북으로 앱 개발하기 - Ubuntu에 안드로이드 스튜디오 설치하기 (0) 2020.09.22