Android 카메라 사용 방법 2탄 갤러리 추가
1탄 아래 보고오쟈!
***************************추가 소스코드
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)
}
}
}
}
'Kotlin > Kotlin 팁' 카테고리의 다른 글
안드로이드 서비스 활용 (0) | 2020.10.14 |
---|---|
Android 스레드와 루퍼 타이머 앱 만들기 (0) | 2020.10.12 |
Android 카메라 사용 방법 (0) | 2020.10.06 |
ANDROID SQLite 데이터 베이스 사용 방법 2편 (0) | 2020.09.29 |
ANDROID SQLite 데이터 베이스 사용 방법 1편 (0) | 2020.09.28 |
댓글