본문 바로가기
Kotlin/Kotlin 팁

Android 카메라 사용 방법 - 갤러리 추가

by MonoSoft 2020. 10. 8.
728x90
반응형

Android 카메라 사용 방법 2탄 갤러리 추가

 

1탄 아래 보고오쟈!

monoworld-1.tistory.com/72

 

Android 카메라 사용 방법

Android 카메라 사용 방법 우선 아래와 같이 화면을 꾸며준다. 이미지와 버튼을 올려놓고 적당한 id명과 text를 설정해준다 그리고 다음과 같이 코딩을 해주고 숙지한다. package com.monosoft.androidcamer

monoworld-1.tistory.com

***************************추가 소스코드 

 

1. 상수 

//갤러리 열기 함수
val FLAG_REQ_GALLERY = 102

 

2.리스터 추가 

buttonGallery.setOnClickListener {
//카메라 권한 체크
Log.d("갤러리","")
if(isPermitted(STORAGE_PERMISSION)) {
//갤러리 오픈
Log.d("갤러리","openGallery")
openGallery()
} else {
//권한요청
Log.d("갤러리","ActivityCompat")
ActivityCompat.requestPermissions(this,STORAGE_PERMISSION,FLAG_PERM_STORAGE)
}
}

 

 

//갤러리 열기 함수
fun openGallery() {
//갤러리도 이미 생성되어있어 상수 호출하면 됨
val intent = Intent(Intent.ACTION_PICK) //파일을 선택할수있는 창을 열어줌
//타입을 설정해준다.
intent.type = MediaStore.Images.Media.CONTENT_TYPE
//타입을 설정해주면 이미지들만 목록에 보여준다.
startActivityForResult(intent,FLAG_REQ_GALLERY)
//이후 onActivityResult 호출됨
}

 

//사진파일을 저장하는 함수 (파일명, 파일확장자, 비트맵)
fun saveImageFile(filename : String, mimeType:String, bitmap : Bitmap) : Uri? {

//MediaStore 에 있는 상수로 된 이름,확장자를 가져옴
var values = ContentValues()
values.put(MediaStore.Images.Media.DISPLAY_NAME,filename)
values.put(MediaStore.Images.Media.MIME_TYPE,mimeType)

//중복 사용을 막기 위함
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
values.put(MediaStore.Images.Media.IS_PENDING,1)
}

//내가 저장할 사진에 주소값을 생성해준다.
val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values)

try {

//uri null 아니면
if (uri != null) {
//쓰기모드로 파일을 열겠다!
var descriptor = contentResolver.openFileDescriptor(uri, "w")

if (descriptor != null) {
//파일 쓸 준비를 함
val fos = FileOutputStream(descriptor.fileDescriptor)
//비트맵을 JPED 방식으로 압축을 하는데 손실율 100. 70해도 눈으로 인지해도 상관없음
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
fos.close()

//리턴 후 exit
return uri
}
}
} catch (e:Exception) {
//예외 메세지 오류 확인
Log.e("Camera","${e.localizedMessage}")
}
return null
}

//새로운 파일명을 생성해주는 함수
fun newFileName() : String {
//시간으로 파일명을 만든다.
val sdf = SimpleDateFormat("yyyyMMdd_HHmmss")
val filename = sdf.format(System.currentTimeMillis())
return filename
}

 

 

//openCamera 함수에 startActivityForResult 실행수 카메라 찍은 사진을 아래 함수를 통해 돌려줌
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)

if(resultCode == Activity.RESULT_OK) { //정상일때만 체크
when (requestCode) {
//카메라 이벤트
FALG_REQ_CAMERA -> {
if(data?.extras?.get("data") != null) {
//data로 비트맵으로 사진이 넘어온걸 imagePreview 적용
val bitmap = data?.extras?.get("data") as Bitmap
Log.d("파일이름1","${bitmap}")
//새로운 파일명
val filename = newFileName()

//이미지 저장
var uri = saveImageFile(filename,"image/jpg",bitmap)
Log.d("파일이름1","${uri}")
imagePreview.setImageURI(uri)

imagePreview.setImageBitmap(bitmap) //바로 저장
}
}
//갤러리 이벤트
FLAG_REQ_GALLERY -> {
val uri = data?.data
imagePreview.setImageURI(uri)
}
}
}
}

 

 

728x90
반응형

댓글