안드로이드

SAF(Storage Access Framework)

코딩하는후운 2021. 5. 25. 18:36
반응형

SAF(Storage Access Framework)는

문서 및 이미지 등 각종 파일을 탐색하고 저장하는 작업을 간편하게 하려고 도입하였습니다.

 

SAF의 특징은 다음과 같습니다.

  • 디바이스에는 여러 프로바이더가 존재할 수 있습니다.
  • 사용자는 프로바이더들이 제공하는 모든 파일을 탐색할 수 있습니다.
  • 앱은 프로바이더가 제공하는 문서에 대한 접근 권한을 가질 수 있습니다.
  • 이 접근 권한으로 앱은 파일을 추가, 편집, 저장 및 삭제할 수 있습니다.
  • USB가 연결되었을 때 USB의 데이터를 제공하는 프로바이더도 있습니다.

 

필요한 권한

파일에 접근할 때 SAF는 권한을 요구하지 않습니다. 대신 Selector UI를 띄워 사용자가 앱이 파일에 접근할 수 있도록 허락해야 합니다.

 

파일 읽기

먼저 Selector 화면을 띄워야 합니다.

다음은 Selector Activity를 실행하는 코드입니다.

 

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { // 1

    addCategory(Intent.CATEGORY_OPENABLE) // 2

    type = "image/*" // 3

}

startActivityForResult(intent, READ_REQUEST_CODE) // 4

 

  1. 파일을 열 때 Intent.ACTION_OPEN_DOCUMENT 액션을 사용합니다.
  2. 열 수 있는 파일들만 보고 싶을 때 Intent.CATEGORY_OPENABLE 를 카테고리로 넣어줍니다.
  3. 타입과 일치하는 파일들만 필터링해서 보여줍니다. "image/*" 타입으로 설정하면 이미지 파일만 보여줍니다.
  4. 인텐트로 실행된 화면에서 파일을 선택하면 그 파일의 Uri가 내 앱의 액티비티로 전달됩니다.

 

참고: ACTION_OPEN_DOCUMENT ACTION_GET_CONTENT를 대체할 목적으로 만들어진 것이 아닙니다. 어느 것을 사용해야 할지는 각자의 앱에 필요한 것이 무엇인지에 좌우됩니다.

  • 앱이 단순히 데이터를 읽거나 가져오도록 하려면 ACTION_GET_CONTENT를 사용합니다. 이 방식을 사용하면 앱은 데이터 사본(예: 이미지 파일)을 가져오게 됩니다.
  • 앱이 문서 제공자가 소유한 문서에 장기적, 지속적 액세스 권한을 가지기를 바라는 경우에는 ACTION_OPEN_DOCUMENT를 사용합니다. 일례로 사용자에게 문서 제공자에 저장된 이미지를 편집할 수 있게 해주는 사진 편집 앱이 있습니다.

저는 이미지를 가져온 다음에 파일을 삭제 까지 해야 해서 ACTION_OPEN_DOCUMENT를 사용했습니다.

 

파일 삭제

파일을 삭제하는 것은 Open과 비슷합니다. Open을 통해 Uri를 받고 데이터를 읽는 대신에 삭제를 하면 됩니다.

 

DocumentsContract.deleteDocument(contentResolver, uri)

// DocumentsContract.deleteDocument()에 ContentResolver와 Uri를 인자로 전달하면 해당 Uri를 삭제합니다.

 

 

궁금한점.

Android 11이 되면서 Storage Scope를 적용하는데

안드로이드 Q이상에서 권한이 없을 때 securityException.userAction.actionIntent.intentSender로 파일삭제에 대한 권한을 허용 받아오는 것 같은데 

DocumentsContract.deleteDocument로 삭제하면 securityException가 발생할지..

 

아시는분이 있다면 좀 알려주세요

 

 

참조 :

https://codechacha.com/ko/android-storage-access-framework/

https://developer.android.com/guide/topics/providers/document-provider?hl=ko 

반응형

'안드로이드' 카테고리의 다른 글

StorageScope 작업하면서 직면한 문제  (0) 2021.06.16
Android Clean Architecture란?  (0) 2021.05.27
[Android] 이미지 로딩 라이브러리 - Coil  (0) 2021.05.17
Storage Scope  (0) 2021.05.14
ViewBinding  (0) 2021.05.13