# 알게 된 것
-- 👇 이번 포스팅 👇--
- Content Provider
- 사진첩에서 선택한 이미지 액티비티로 보내기
# 결과물
## 이해하기
지금껏 Intent를 통해서 액티비티간 전환을 했고, 그 전환 할때 putExtra를 이용해서 정보를 넘겨주기도 했다. 여기서 또한 Intent를 이용하지만, 지금껏 사용했던 Intent와는 다른 방식으로 사용했다.
서로 다른 앱 사에서 파일등을 전송할때는 Content Provider라는 것을 사용한다고 한다. 이번 예제에서는 SAF(Storage Access Framework)를 사용한 것인데, 이러한 것들을 간단한 코드로 할 수 있게 해준다.
## 사진첩 연결
위와 같이, 사진 선택하기를 눌러서 사진첩에 접근한 후, 선택한 사진을 MainActivity로 가져와 저장을 하는 것이다. 이를 위해서 어떤 코드가 쓰였는지 먼저 보도록 하자.
//navigatePhotos()함수를 버튼클릭이벤트에 부착시키면 된다.
private fun navigatePhotos() {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "image/*"
startActivityForResult(intent,2000)
}
Intent("인자")에 인자로 줄 수 있는 것들은 공식문서를 보면 꽤 있는데, 단순히 데이터를 읽거나 가져오도록 하려면 ACTION_GET_CONTENT를 사용하라고 한다.
이후 type에 모든 image들을 받아온다고 명시해주면 이미지들을 검색할 수 있다. 그후
startActivityForResult(intent, 2000)
을 호출한다. startActivity와는 다르게 새로운 액티비티(여기서는 사진첩)에서 호출한 액티비티로 결과를 반환한다. 그리고 2000코드로 식별 할 수 있다.
## 사진첩에서 사진 받아오기
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode != Activity.RESULT_OK) {
Toast.makeText(this,"잘못된 접근입니다",Toast.LENGTH_SHORT).show()
return
}
when(requestCode) {
2000 -> {
val selectedImageURI : Uri? = data?.data
if(imageUriList.size == 6 ) {
Toast.makeText(this,"이미지가 가득 찼습니다.",Toast.LENGTH_SHORT).show()
return
}
if( selectedImageURI != null) {
imageUriList.add(selectedImageURI)
imageViewList[imageUriList.size -1].setImageURI(selectedImageURI)
}else {
Toast.makeText(this,"사진을 가져오지 못했습니다",Toast.LENGTH_SHORT).show()
}
} else -> {
Toast.makeText(this,"잘못된 접근입니다",Toast.LENGTH_SHORT).show()
}
}
}
onActivityResult함수를 override해서 어떤 결과를 반환시킬지를 정의한다. 사진은 data인자안에 data에 담아오는데 Uri타입으로 오게 된다. 이 Uri를 만들었던 리스트에 추가해주어 사진 정보를 가지고 있게 하면 된다.
그리고 ImageView에 직접 접근하여, setImageURI를 통해서 이미지를 바꿔주자. 별다른 변환없이 바꿀 수 있는거 같았다.
imageViewList[imageUriList.size -1].setImageURI(selectedImageURI)
아직 콘탠트 프로바이더를 정확히 쓰기보다는 SAF라는 것을 사용하여 편하게 사용한거 같아서, 정확한 맥락의 이해가 되지는 않지만 어떤 메커니즘인지는 알거 같다.