김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㄱ
  • 로컬저장소
  • 깃허브데스크탑
  • KMU_WINK
  • local저장소
  • Remote저장소
  • GitHubDesktop
  • 원격저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[안드로이드&코틀린] 앨범 만들기#4, 갤러리에서 이미지 가져오기, 안드로이드 SAF(Storage Access Framework)
•App/안드로이드 with Kotlin

[안드로이드&코틀린] 앨범 만들기#4, 갤러리에서 이미지 가져오기, 안드로이드 SAF(Storage Access Framework)

2022. 3. 21. 23:18
 

[안드로이드&코틀린] 앨범 만들기#3, 안드로이드 파일접근 권한 얻기, checkSelfPermission, shouldShowReque

[안드로이드&코틀린] 앨범만들기#2, 액티비티 생명주기, Activity LifeCycle, 안드로이드 라이프사이클 저번 포스팅에 이어서 정리하도록 하겠다. [안드로이드&코틀린] 앨범만들기#1, 코틀린 let, putExtra

devforyou.tistory.com


 

# 알게 된 것

-- 👇 이번 포스팅 👇--

  • Content Provider
    • 사진첩에서 선택한 이미지 액티비티로 보내기

 

# 결과물

설명을 위한 사진

 

## 이해하기

 지금껏 Intent를 통해서 액티비티간 전환을 했고, 그 전환 할때 putExtra를 이용해서 정보를 넘겨주기도 했다. 여기서 또한 Intent를 이용하지만, 지금껏 사용했던 Intent와는 다른 방식으로 사용했다.

 서로 다른 앱 사에서 파일등을 전송할때는 Content Provider라는 것을 사용한다고 한다. 이번 예제에서는 SAF(Storage Access Framework)를 사용한 것인데, 이러한 것들을 간단한 코드로 할 수 있게 해준다.

 

저장소 액세스 프레임워크를 사용하여 파일 열기  |  Android 개발자  |  Android Developers

저장소 액세스 프레임워크를 사용하여 파일 열기 Android 4.4(API 수준 19)에는 저장소 액세스 프레임워크(SAF)가 도입되었습니다. SAF는 사용자가 선호하는 문서 저장소 제공자 전체에서 문서, 이미지

developer.android.com

 

## 사진첩 연결

위와 같이, 사진 선택하기를 눌러서 사진첩에 접근한 후, 선택한 사진을 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라는 것을 사용하여 편하게 사용한거 같아서, 정확한 맥락의 이해가 되지는 않지만 어떤 메커니즘인지는 알거 같다.

 

 

안드로이드 - SAF(Storage Access Framework)로 파일 읽고 쓰는 방법

SAF(Storage Access Framework)는 문서 및 이미지 등 각종 파일을 탐색하고 저장하는 작업을 간편하게 하려고 도입하였습니다. 앱은 ACTION_OPEN_DOCUMENT, ACTION_CREATE_DOCUMENT 등의 인텐트로 파일을 읽고 쓸 수

codechacha.com

 

저작자표시 (새창열림)

'•App > 안드로이드 with Kotlin' 카테고리의 다른 글

[안드로이드&코틀린] 녹음기 만들기, Enum, set(value), run{...}, companion object, MediaRecorder, MediaPlayer, 커스텀 View 만들기  (0) 2022.03.25
[안드로이드&코틀린] 뽀모도로 타이머 , SeekBar의 활용, soundPool을 사용한 효과음, 익명객체 활용하기, 문자열포맷팅, "%02d", 슬라이드 바  (0) 2022.03.23
[안드로이드&코틀린] 앨범 만들기#3, 안드로이드 파일접근 권한 얻기, checkSelfPermission, shouldShowRequestPermissionRationale, requestPermissions, onRequestPermissionsResult  (0) 2022.03.21
[안드로이드&코틀린] 앨범만들기#2, 액티비티 생명주기, Activity LifeCycle, 안드로이드 라이프사이클 예제  (0) 2022.03.21
[안드로이드&코틀린] 앨범만들기#1, 코틀린 let, putExtra 여러개, 코틀린 timer, 안드로이드 animate(),  (0) 2022.03.21
    '•App/안드로이드 with Kotlin' 카테고리의 다른 글
    • [안드로이드&코틀린] 녹음기 만들기, Enum, set(value), run{...}, companion object, MediaRecorder, MediaPlayer, 커스텀 View 만들기
    • [안드로이드&코틀린] 뽀모도로 타이머 , SeekBar의 활용, soundPool을 사용한 효과음, 익명객체 활용하기, 문자열포맷팅, "%02d", 슬라이드 바
    • [안드로이드&코틀린] 앨범 만들기#3, 안드로이드 파일접근 권한 얻기, checkSelfPermission, shouldShowRequestPermissionRationale, requestPermissions, onRequestPermissionsResult
    • [안드로이드&코틀린] 앨범만들기#2, 액티비티 생명주기, Activity LifeCycle, 안드로이드 라이프사이클 예제
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바