Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- stylesheet
- React
- Java
- GoogleMaps
- 랜덤번호
- Kotlin
- TextView
- array
- 스프링부트
- SpringBoot
- npm
- 안드로이드
- RecyclerView
- 오버라이딩
- button
- fragment
- 랜덤넘버
- Android
- 자바스크립트
- Javscript
- JS
- TypeScript
- scrollview
- 코틀린
- JavaScript
- nodejs
- Linux
- 구글맵스
- 리액트
- Hook
Archives
- Today
- Total
타닥타닥 개발자의 일상
Kotlin 코틀린 안드로이드 화면에 카메라 연결하고 촬영하기, 촬영된 사진 및 저장된 사진 불러와서 화면에 연결하기 본문
코딩 기록/Kotlin
Kotlin 코틀린 안드로이드 화면에 카메라 연결하고 촬영하기, 촬영된 사진 및 저장된 사진 불러와서 화면에 연결하기
NomadHaven 2022. 2. 16. 21:59파일 경로 및 폴더 위치
AndroidManifest.xml
기존의 AndroidManifest에 아래의 부분을 적용하였다.
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
적용한 전체코드
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.camera">
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<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.Camera">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:layout_width="500dp"
android:layout_height="500dp"
tools:srcCompat="@tools:sample/avatars"
android:id="@+id/avatars"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.496"
app:layout_constraintVertical_bias="0.563"/>
<Button
android:text="picture"
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/picture"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHorizontal_bias="0.69"
app:layout_constraintVertical_bias="0.082"/>
<Button
android:text="camera"
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/camera"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHorizontal_bias="0.273"
app:layout_constraintVertical_bias="0.082"/>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
package com.example.camera
import android.Manifest
import android.app.Activity
import android.content.ContentValues
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.Camera
import android.net.Uri
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Button
import android.widget.ImageView
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.io.FileOutputStream
import java.text.SimpleDateFormat
class MainActivity : AppCompatActivity() {
// storage 권한 처리에 필요한 변수
val CAMERA = arrayOf(Manifest.permission.CAMERA)
val STORAGE = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
val CAMERA_CODE = 98
val STORAGE_CODE = 99
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 카메라
val camera = findViewById<Button>(R.id.camera)
camera.setOnClickListener {
CallCamera()
}
// 사진 저장
val picture = findViewById<Button>(R.id.picture)
picture.setOnClickListener {
GetAlbum()
}
}
// 카메라 권한, 저장소 권한
// 요청 권한
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode){
CAMERA_CODE -> {
for (grant in grantResults){
if(grant != PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "카메라 권한을 승인해 주세요", Toast.LENGTH_LONG).show()
}
}
}
STORAGE_CODE -> {
for(grant in grantResults){
if(grant != PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "저장소 권한을 승인해 주세요", Toast.LENGTH_LONG).show()
}
}
}
}
}
// 다른 권한등도 확인이 가능하도록
fun checkPermission(permissions: Array<out String>, type:Int):Boolean{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
for (permission in permissions){
if(ContextCompat.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, permissions, type)
return false
}
}
}
return true
}
// 카메라 촬영 - 권한 처리
fun CallCamera(){
if(checkPermission(CAMERA, CAMERA_CODE) && checkPermission(STORAGE, STORAGE_CODE)){
val itt = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(itt, CAMERA_CODE)
}
}
// 사진 저장
fun saveFile(fileName:String, mimeType:String, bitmap: Bitmap):Uri?{
var CV = ContentValues()
// MediaStore 에 파일명, mimeType 을 지정
CV.put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
CV.put(MediaStore.Images.Media.MIME_TYPE, mimeType)
// 안정성 검사
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
CV.put(MediaStore.Images.Media.IS_PENDING, 1)
}
// MediaStore 에 파일을 저장
val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, CV)
if(uri != null){
var scriptor = contentResolver.openFileDescriptor(uri, "w")
val fos = FileOutputStream(scriptor?.fileDescriptor)
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
fos.close()
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
CV.clear()
// IS_PENDING 을 초기화
CV.put(MediaStore.Images.Media.IS_PENDING, 0)
contentResolver.update(uri, CV, null, null)
}
}
return uri
}
// 결과
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val imageView = findViewById<ImageView>(R.id.avatars)
if(resultCode == Activity.RESULT_OK){
when(requestCode){
CAMERA_CODE -> {
if(data?.extras?.get("data") != null){
val img = data?.extras?.get("data") as Bitmap
val uri = saveFile(RandomFileName(), "image/jpeg", img)
imageView.setImageURI(uri)
}
}
STORAGE_CODE -> {
val uri = data?.data
imageView.setImageURI(uri)
}
}
}
}
// 파일명을 날짜 저장
fun RandomFileName() : String{
val fileName = SimpleDateFormat("yyyyMMddHHmmss").format(System.currentTimeMillis())
return fileName
}
// 갤러리 취득
fun GetAlbum(){
if(checkPermission(STORAGE, STORAGE_CODE)){
val itt = Intent(Intent.ACTION_PICK)
itt.type = MediaStore.Images.Media.CONTENT_TYPE
startActivityForResult(itt, STORAGE_CODE)
}
}
}
실행화면
'코딩 기록 > Kotlin' 카테고리의 다른 글
Comments