Notice
Recent Posts
Recent Comments
Link
Β«   2025/04   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

🌱 dreaming DiNO

[Kotlin] Scoped Storage(λ²”μœ„μ§€μ • μ €μž₯μ†Œ) 정리 (Legacy Storage와 차이점 정리) λ³Έλ¬Έ

Android/Android Studio

[Kotlin] Scoped Storage(λ²”μœ„μ§€μ • μ €μž₯μ†Œ) 정리 (Legacy Storage와 차이점 정리)

MK_____ 2023. 5. 19. 17:07

μ°Έκ³ κΈ€ : https://beeyoo0o0ncha.tistory.com/30

 

μ•ˆλ“œλ‘œμ΄λ“œ λ‚΄λΆ€μ €μž₯μ†Œ μ™ΈλΆ€μ €μž₯μ†Œ μ΄ν•΄ν•œκ²ƒ 정리

μ•ˆλ“œλ‘œμ΄λ“œμ—μ„  앱에 μ €μž₯μ†Œκ°€ 2κ°€μ§€κ°€μžˆλ‹€. λ‚΄λΆ€ μ €μž₯μ†Œ(Internal Storage) , μ™ΈλΆ€ μ €μž₯μ†Œ(External Storage) λ‚΄λΆ€μ €μž₯μ†Œ ν•΄λ‹Ή μ•±μ˜ private 곡간이며 λ‹€λ₯Έμ•±μ—μ„œ 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€ λ…ΈμΆœλ˜λ©΄ μ•ˆλ˜λŠ” μ•±μ˜

beeyoo0o0ncha.tistory.com

https://brunch.co.kr/@huewu/8#comment

 

 

[2021-06-04 μ—…λ°μ΄νŠΈ]

 

 

이전에 μ•ˆλ“œλ‘œμ΄λ“œ 11에 λŒ€ν•΄ κ³΅λΆ€ν–ˆλ˜ λ‚΄μš© 쀑 μ•ˆλ“œλ‘œμ΄λ“œ 10μ—μ„œ λ‚˜μ˜¨ κ±°μ§€λ§Œ 11μ—μ„œλ„ μ–ΈκΈ‰λœ λ²”μœ„ 지정 μ €μž₯μ†Œ(Scoped Storage)에 κ΄€λ ¨ 사항듀에 λŒ€ν•΄ μ •λ¦¬ν•΄λ³΄λ €ν•©λ‹ˆλ‹€. γ…Žγ…Ž

 

κ·Έλ¦Όκ³Ό ν•¨κ»˜ κ°„λ‹¨ν•˜κ²Œ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 

 

 

1.Scoped StorageλŠ” μ•ˆλ“œλ‘œμ΄λ“œ 10 λ²„μ „μ—μ„œ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€.

 

2. λ‚΄λΆ€μ €μž₯μ†Œμ˜ κ°œλ³„ μ•± 곡간은 이전과 λ™μΌν•©λ‹ˆλ‹€ (κ°œλ³„μ•± 곡간 κ³΅μš©κ³΅κ°„ κ΄€λ ¨ν•˜μ—¬λŠ” λ’€μ—μ„œ λ‹€λ£° μ˜ˆμ •μ΄λ‹ˆ 그림보며 μ•±μ˜ 개인적인 μ €μž₯κ³΅κ°„μ΄κ΅¬λ‚˜λΌκ³  μ΄ν•΄ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€)

 

3. μ™ΈλΆ€μ €μž₯μ†Œμ˜ κ°œλ³„ μ•± κ³΅κ°„이 μƒŒλ“œλ°•μŠ€ ν˜•μ‹μœΌλ‘œ κ²©λ¦¬λ©λ‹ˆλ‹€.

 

4. μ™ΈλΆ€μ €μž₯μ†Œμ˜ κ³΅μš©κ³΅κ°„μ΄ 사진 및 λ™μ˜μƒ, μŒμ•…, λ‹€μš΄λ‘œλ“œ ꡬ쑰둜 λΆ„λ¦¬λ˜κ³  이 μ•ˆμ—μ„œ μ•± νŒ¨ν‚€μ§€ λ³„λ‘œ 또 κ΅¬λΆ„λ˜μ–΄ μ €μž₯되게 λ³€ν–ˆμŠ΅λ‹ˆλ‹€.

+)기쑴의 κ°œλ°œμžκ°€ 자유둭게 νŒŒμΌμ„ μ €μž₯ν•  수 있던 Public Files κ³΅μš© 곡간이 사진 μŒμ•… λ‹€μš΄λ‘œλ“œλ‘œ 4개의 μ‘°μ§ν™”λœ μˆ˜μ§‘κ³΅κ°„μœΌλ‘œ λ‚˜λˆ„μ–΄ 관리가 λ˜λŠ” 거라 λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€.

 

4λ²ˆμ— μ˜ν•΄ λ²”μœ„μ§€μ •μ €μž₯μ†ŒλŠ” κΈ°μ‘΄ 곡간과 파일 μ†Œμœ μž(ownership)κ°€ λͺ…ν™•νžˆ λΆ„λ¦¬λ˜μ–΄ 관리가 μ‰¬μ›Œμ§€κ³  μ•±μ΄ μ–Όλ§ˆλ‚˜ λ§Žμ€ μ €μž₯ 곡간을 μ°¨μ§€ν•˜κ³  μžˆλŠ”지 μ‰½κ²Œ 확인 이 κ°€λŠ₯ν•΄μ§„λ‹€λŠ” μž₯점이 μƒκΉλ‹ˆλ‹€. λ³΄μ•ˆλ„ μ’‹μ•„μ§€κ³ μš”.

 

* κ·Έλ¦Όμ—μ„œ μ™ΈλΆ€μ €μž₯μ†Œμ— κ³΅μš©κ³΅κ°„(사진,μŒμ•…,λ‹€μš΄λ‘œλ“œ)에 νŒ¨ν‚€μ§€ 그림도 μžˆμ–΄μ„œ ν–‡κ°ˆλ¦΄κΉŒλ΄ μΆ”κ°€ μ„€λͺ…을 ν•˜λ©΄ 사진 및 λ™μ˜μƒμ•ˆμ— 각각의 μ•± 데이터듀이 λ“€μ–΄κ°„λ‹€λŠ”κ±°μ§€ μ•±μ˜ 디렉토리가 μƒκΈ°λŠ”κ²Œ μ•„λ‹™λ‹ˆλ‹€. 즉 μ™ΈλΆ€μ €μž₯μ†Œμ—μ„œ κ³΅μš©κ³΅κ°„κ³Ό μ•±νŒ¨ν‚€μ§€λ³„λ‘œμ˜ 개인 κ³΅κ°„μœΌλ‘œ λ‚˜λ‰œλ‹€λ³΄λ©΄λ©λ‹ˆλ‹€. 

 

[μ°Έκ³ ]

μƒŒλ“œλ°•μŠ€ κ΅¬μ‘°λž€ μ™ΈλΆ€λ‘œλΆ€ν„° λ“€μ–΄μ˜¨ ν”„λ‘œκ·Έλž¨μ΄ 보호된 μ˜μ—­μ—μ„œ λ™μž‘ν•΄ μ‹œμŠ€ν…œμ΄ λΆ€μ •ν•˜κ²Œ μ‘°μž‘λ˜λŠ” 것을 λ§‰λŠ” λ³΄μ•ˆ ν˜•νƒœλ₯Ό λ§ν•©λ‹ˆλ‹€.

 

그리고 μ‚¬μ§„ 및 λ™μ˜μƒ, μŒμ•…μ„ ν•©μ³μ„œ λ―Έλ””어라 ν†΅μΉ­ν•˜κ³  λ―Έλ””μ–΄ μ™Έμ˜ λͺ¨λ“  λ¬Έμ„œ, zip 파일 λ“±μ€ λ‹€μš΄λ‘œλ“œμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

 

 

 


. ꡬ글 IO μ˜μƒμ—μ„œ λ°œν‘œν•œ ppt μ˜μƒμ˜ 사진인데 μ°Έκ³ ν•˜λ©΄ 쒋을 것 κ°™μ•„ 가지고 μ™”μŠ΅λ‹ˆλ‹€. 

 

κ΅¬κΈ€μ—μ„œλŠ” 참고둜 Scoped Storageλ₯Ό λΆ„ν™”ν•œ μ»¬λ ‰μ…˜μœΌλ‘œ κ΅¬λΆ„ν•˜κ³  κ΄‘μ—­ μ €μž₯μ†Œμ— λŒ€ν•œ 접근을 μ œν•œν•œλ‹€λŠ” κ°œλ…μ΄λΌκ³  μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€

 

 

 

 


 

μ €λŠ” μ²˜μŒμ— Scoped Storage에 λŒ€ν•΄ μ•Œμ•„λ³Ό λ•Œ λ‹€μŒκ³Ό 같은 λΉ„μœ κ°€ κ°€μž₯ μ™€λ‹Ώμ•„μ„œ κ°€μ Έμ™€λ΄€μŠ΅λ‹ˆλ‹€. γ…Žγ…Ž

κΈ°μ‘΄μ—λŠ” μ°½κ³ (κ³΅μš©κ³΅κ°„) μ•ˆμ— λ¬Όν’ˆλ“€μ΄(데이터) λ§‰ λ‹΄κ²¨μžˆκ³ , μ—΄μ‡ λ§Œ(κΆŒν•œ) μžˆλ‹€λ©΄ λˆ„κ΅¬λ‚˜ κ°€μ Έκ°€μ„œ μ“Έ 수 μžˆλŠ” μƒνƒœμ§€λ§Œ λ²”μœ„μ§€μ •μ €μž₯μ†Œ λΆ€ν„°λŠ” μ‚¬λ¬Όν•¨μ²˜λŸΌ λ¬Όν’ˆλ“€μ΄ μ’…λ₯˜λ³„λ‘œ λΆ„λ₯˜λ˜μ–΄ μžλ¬Όμ‡ κ°€ μ±„μ›Œμ Έ 있고, κ°κ°μ˜ μ—΄μ‡ κ°€ μžˆμ–΄μ•Ό κ°€μ Έλ‹€ μ“Έ 수 μžˆλŠ” ν˜•νƒœλΌκ³  보면 λ©λ‹ˆλ‹€.

 

 

 

 

 

 

 

 


https://developer.android.com/training/data-storage

λ²”μœ„μ§€μ •μ €μž₯μ†Œλ‘œ μ €μž₯μ†Œ ꡬ쑰가 λ°”λ€Œλ©΄μ„œ νŒŒμΌμ ‘κ·Ό κ΄€λ ¨ν•΄μ„œλ„ λ³€ν™”κ°€ μƒκ²ΌλŠ”λ°μš”.

λ²”μœ„μ§€μ •μ €μž₯μ†Œμ˜ 각 곡간에 λŒ€ν•œ μ ‘κ·Ό 방법을 μ •λ¦¬ν•œ ν‘œμž…λ‹ˆλ‹€.

ν•˜λ‚˜μ”© μ •λ¦¬ν•˜λ©° μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

 


 

λ¨Όμ € κ°œλ³„ μ•± 곡간 μ ‘κ·Ό λ°©λ²•μž…λ‹ˆλ‹€.

-> 자기 μžμ‹ μ˜ κ°œλ³„μ•± κ³΅κ°„μ˜ 접근을 μœ„ν•œ κΆŒν•œμš”청이 ν•„μš” μ—†κ³  getExnternalFilesDir() μ„ 톡해 접근이 κ°€λŠ₯ν•˜λ©° μ•± μ‚­μ œμ‹œ ν•¨κ»˜ μ œκ±°λ©λ‹ˆλ‹€.

 

 

 

Scope Storage μ΄μ „μ˜ λ ˆκ±°μ‹œ μ €μž₯μ†Œμ™€ λΉ„κ΅ν•΄λ΄€μŠ΅λ‹ˆλ‹€.

[차이점]

Scoped Storage 이후 μƒŒλ“œλ°•μŠ€ κ΅¬μ‘°λ‘œ λ˜λ©΄μ„œ EXTERNAL_STORAGE κΆŒν•œμœΌλ‘œ μžμ‹ μ˜ 앱이 μ•„λ‹Œ λ‹€λ₯Έ κ°œλ³„ μ•± κ³΅κ°„을 λ§ˆμŒλŒ€λ‘œ 읽고 μ“Έ 수 μ—†λ‹€λŠ” κ±° 외에 큰 차이점이 μ—†μŠ΅λ‹ˆλ‹€.

[곡톡점]

1. κ°œλ³„ μ•± 곡간(Private Files)은 κΆŒν•œ 없이 읽기/μ“°κΈ° μ ‘κ·Ό κ°€λŠ₯

2. μ•± μ‚­μ œμ‹œ ν•¨κ»˜ 제거됨

3. getExternalFilesDir() ν˜Ήμ€ getExternalCacheDir() λ‘œ μ ‘κ·Ό

 

λ§Œμ•½ μ•± μ‚­μ œμ‹œμ—λ„ νŒŒμΌμ„ λ³΄μ‘΄ν•˜κ³  μ‹Άλ‹€λ©΄ MediaStoreλ₯Ό ν†΅ν•΄ νŒŒμΌμ„ μƒμ„±ν•œ ν›„ λ©”타데이터λ₯Ό μΆ”κ°€ν•΄μ•Όν•©λ‹ˆλ‹€.

μ•„λ‹ˆλ©΄ manifest에 android:allowBackup="true” λ₯Ό μ„€μ • μ‹œ μ•± 정보λ₯Ό ꡬ글 ν΄λΌμš°λ“œμ— μ €μž₯ν•˜κ²Œ λ˜λŠ”데

μ΄λ ‡κ²Œ ν•˜λ©΄ 앱을 μž¬μ„€μΉ˜ ν–ˆμ„ λ•Œ ν΄λΌμš°λ“œμ—μ„œ 데이터λ₯Ό 볡원할 수 μžˆμŠ΅λ‹ˆλ‹€.


 

 

λ‘λ²ˆμ§Έλ‘œ λ―Έλ””μ–΄μ—μ„œμ˜ μ ‘κ·Ό λ°©λ²•μž…λ‹ˆλ‹€.

λ―Έλ””μ–΄μ—μ„œλŠ” μžμ‹ μ˜ μ•±μ΄ μ•„λ‹Œ λ‹€λ₯Έ μ•± νŒŒμΌμ— μ ‘κ·Ό 및 μ½μ–΄μ˜¬ λ•ŒλŠ” READ_EXTERMAL_STORAGE κΆŒν•œμ΄ ν•„μš”ν•˜κ³ 

이 κΆŒν•œ 외에도 READ_MEDIA라고 μƒˆλ‘œ μΆ”κ°€λœ κΆŒν•œμ΄ μžˆλŠ”λ° 그건 λ’€μ—μ„œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

접근은 MediaStore API λ₯Ό μ‚¬μš©ν•˜κ³  μ•±μ΄ μ‚­μ œλ˜λ„ μ œκ±° λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” νŠΉμ§•μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

MediaStore APIλž€ μ‚¬μš©μžκ°€ 가지고 μžˆλŠ” νŒŒμΌλ“€μ„ λ‹€λ₯Έ μ•±μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€κ³„λœ API μž…λ‹ˆλ‹€.

MediaStore API μ™Έμ— File API, Storage Access Framework λ₯Ό ν†΅ν•΄μ„œλ„ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‚˜ κ΅¬κΈ€μ—μ„œλŠ” λ‹€μŒ 사진과 같이 MediaStore μ‚¬μš©μ„ κΆŒκ³ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

 

 

이전 Legacy Storage와 λΉ„κ΅ν•΄μ„œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ ˆκ±°μ‹œ μŠ€ν† λ¦¬μ§€λŠ”

READ_EXTERNAL_STORGE, WRITE_EXTERNAL_STORGE λ₯Ό μ‚¬μš©ν•΄μ•Ό μ™ΈλΆ€ 곡용 μ €μž₯μ†Œ(Public Files) μ ‘근이(읽기, μ“°κΈ°) κ°€λŠ₯ν–ˆκ³  μ΄ κΆŒν•œμ΄ 있으면 λˆ„κ°€ μƒμ„±ν•œ νŒŒμΌμ΄λ“ , μ–΄λ–€ κ²½λ‘œμ— μ €μž₯된 νŒŒμΌμ΄λ“  관계없이 λͺ¨λ“  νŒŒμΌμ— μ ‘κ·Ό 및 μ‘°μž‘μ΄ κ°€λŠ₯ ν–ˆμŠ΅λ‹ˆλ‹€.

이게 말둜 λ“€μœΌλ©΄ 무적 같은 λŠλ‚Œμ΄λΌ 되게 μ’‹μ•„ λ³΄μ΄λŠ”λ° λ‹€λ₯Έ 앱에 λ§ˆμŒλŒ€λ‘œ μ ‘κ·Ό ν•  μˆ˜ μžˆλ‹€λŠ” 것은 λ³΄μ•ˆμƒ 쒋지 μ•Šλ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

 

λ²”μœ„μ§€μ •μ €μž₯μ†ŒλŠ” 

λ―Έλ””μ–΄μ½œλ ‰μ…˜ μ•ˆμ—μ„œ μžμ‹ μ˜ 앱에 ν•΄λ‹Ήν•˜λŠ” 곳은 μ ‘κ·Ό κΆŒν•œ μš”μ²­μ—†μ΄ 접근이 κ°€λŠ₯ν•˜λ‹€λŠ” μ°¨μ΄μ μ΄μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό 톡해 기쑴의 λΆˆν•„μš”ν•œ μ‚¬μš©μž κΆŒν•œ μš”μ²­μ„ 쀄일 수 μžˆλ‹€λŠ” μž₯점도 μƒκ²ΌμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λ‹€λ₯Έ μ•±μ΄ μƒμ„±ν•œ λ―Έλ””μ–΄ νŒŒμΌμ— μ ‘κ·Όν•˜λŠ” κ²½μš°λŠ” κΆŒν•œμ΄ ν•„μš”ν•˜κ³  λ ˆκ±°μ‹œμ™€ 차이점이 μžˆμŠ΅λ‹ˆλ‹€. μ΄μ— λŒ€ν•΄ μ΄μ–΄μ„œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

 

λ‹€λ₯Έ 앱이 μƒμ„±ν•œ λ―Έλ””μ–΄μ—μ‚¬μ˜ νŒŒμΌμ— μ ‘κ·Όν•˜λŠ” κ²½μš°λŠ” κΆŒν•œμ΄ ν•„μš”

λ‹€λ₯Έ 앱이 μƒμ„±ν•œ λ―Έλ””μ–΄ νŒŒμΌμ— λŒ€ν•œ μ ‘κ·Ό κΆŒν•œλ²•μ„ μš”μ•½ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

-MediaStore μ‚¬μš©ν•  경우(10 λ²„μ „μ—μ„œ μƒˆλ‘œ 생김)

READ_MEDIA_IMAGES 

READ_MEDIA_VIDEO

READ_MEDIA_AUDIO 

 READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO λŠ” μ•ˆλ“œλ‘œμ΄λ“œ Q 베타 3 λ²„μ „μ—μ„œ μ‚­μ œλ˜μ–΄ 정식 μΆœμ‹œλ˜μ§€ μ•Šμ€ νΌλ―Έμ…˜μž…λ‹ˆλ‹€.

 

-MediaStore ν˜Ήμ€ MediaStore μ™Έμ˜ 방법을 μ‚¬μš©ν•  경우

READ_EXTERNAL_STORAGE

 

-더 이상 μΆ”κ°€ μ—‘μ„ΈμŠ€ 제곡 X-

WRITE_EXTERNAL_STORAGE

WRITE_MEDIA_STORAGE

 

앱이 μƒμ„±ν•œ λ―Έλ””μ–΄ νŒŒμΌμ— μ ‘κ·Όν•˜λŠ” κ²½μš°λŠ” κΆŒν•œμ΄ ν•„μš”ν•œλ° READ_MEDIA_IMAGES,  READ_MEDIA_VIDEO ,READ_MEDIA_AUDIOλ₯Ό μ‚¬μš©ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

이것듀은 μ•ˆλ“œλ‘œμ΄λ“œ 10μ—μ„œ μƒˆλ‘œ μΆ”κ°€λœ κΆŒν•œμ΄κ³  각각 사진, λ™μ˜μƒ, μŒμ„±μ„ μ½λŠ”λ° ν•„μš”ν•©λ‹ˆλ‹€.

기쑴의 READ_EXTERNAL_STORAGE λ‘œλ„ κ°€λŠ₯ν•œ μΌμ΄μ—ˆμ§€λ§Œ κ΅¬κΈ€μ€ μ•±μ—μ„œ λ―Έλ””μ–΄ 파일둜 μž‘μ—…ν•  λ•ŒλŠ” κ΄‘λ²”μœ„ν•œ κΆŒν•œμš”μ²­μ΄μ•„λ‹Œ ν•„μš”ν•œ κΆŒν•œλ§Œ μš”μ²­ν•˜λΌκ³  κΆŒκ³ ν•˜κ³ μžˆμŠ΅λ‹ˆλ‹€

ν•˜μ§€λ§Œ READ_EXTERNAL_SOTRAGE λ₯Ό ν˜„μž¬ μ‚¬μš©ν•˜κ³  계셔도 μ•ˆλ“œλ‘œμ΄λ“œ 11λ²„μ „μ—μ„œ μž˜ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— 계속 μ‚¬μš©ν•˜μ…”λ„ λ¬΄κ΄€ν•©λ‹ˆλ‹€.

 

MediaStore μ™Έμ˜ λ‹€λ₯Έ λ°©λ²•μ„ μ‚¬μš©ν•  경우라면 λ˜‘κ°™μ΄ READ_EXTERNAL_STORAGEλ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

앱이 Android 11을 νƒ€κ²ŸνŒ…ν•˜λŠ” 경우 WRITE_EXTERNAL_STORAGE κΆŒν•œ 및 WRITE_MEDIA_STORAGE λ…점 κΆŒν•œμ€ 더 이상 μΆ”κ°€ μ•‘μ„ΈμŠ€λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점에 μ£Όμ˜ν•˜μ…”μ•Όν•©λ‹ˆλ‹€. WRITE κΆŒν•œμ΄μ§€λ§Œ μ•ˆλ“œλ‘œμ΄λ“œ 11μ—μ„œλŠ” WRITE κΈ°λŠ₯을 λͺ»ν•œλ‹€κ³  λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€.  11버전 λΆ€ν„°λŠ” λ―Έλ””μ–΄ κ³΅κ°„μ—μ„œ λ‹€λ₯Έ 앱을 μˆ˜μ •ν•˜λŠ” 방법이 λ³€κ²½λ˜μ—ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ΄μ— λŒ€ν•΄μ„œλŠ” λ°”λ‘œ λ’€μ—μ„œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μ •λ¦¬ν•˜λ©΄ μ•ˆλ“œλ‘œμ΄λ“œ 11을 νƒ€κ²ŸνŒ… μ‹œ μœ„μ—μ„œ μ–ΈκΈ‰ν•œ(μ£Όν™© 배경색) μˆœμ„œλŒ€λ‘œ μš°μ„ μ‹œν•˜μ—¬ μ‚¬μš©ν•˜μ‹œκΈΈ μΆ”μ²œ ν•˜μ§€λ§Œ .READ_EXTERNAL_STORAGE μ„ μ‚¬μš©ν•˜μ…”λ„ λ¬΄λ°©ν•©λ‹ˆλ‹€.

그리고 WRITE_EXTERNAL_STORAGE μ‚¬μš©μ‹œ μΆ”κ°€μ—‘μ„ΈμŠ€ μ œκ³΅μ„ μ•ˆν•œλ‹€λŠ”μ μ„ μ£Όμ˜ν•˜μ…”μ•Όν•©λ‹ˆλ‹€.

 

[ꡬ글 λ¬Έμ„œ μ°Έκ³ ]

 

 

 

 

μˆ˜μ •λ°©λ²•

λ―Έλ””μ–΄ μŠ€ν† μ–΄μ™€ κ΄€λ ¨λœ READ_MEDIA κΆŒν•œμ€ 말 κ·ΈλŒ€λ‘œ 읽기만 κ°€λŠ₯ν•˜κ³  WRITE_EXTERNAL_STORAGE  κΆŒν•œμ€ μΆ”κ°€ μ—‘μ„ΈμŠ€λ₯Ό μ œκ³΅ν•˜μ§€ μ•Šκ²Œ λ°”λ€Œμ—ˆλ‹€κ³  ν–ˆλŠ”λ°μš”.

λ§Œμ•½ λ‹€λ₯Έ μ•±μ˜ μˆ˜μ •μ„ μ›ν•œλ‹€λ©΄ μ•ˆλ“œλ‘œμ΄λ“œ 10μ—μ„œ μΆ”κ°€λœ μ—­ν• (role) μ΄λΌλŠ” ν•΄λ‹Ή κΈ°λŠ₯을 μœ„ν•œ κΈ°λ³Έ 앱이 λ˜μ–΄μ•Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.

https://brunch.co.kr/@huewu/8 μ°Έκ³ 

 

 

 

 

 

 

[MediaStore APIμ°Έκ³ ]

λ―Έλ””μ–΄ μŠ€ν† μ–΄ μ‚¬μš©λ°©λ²•μ— λŒ€ν•œ μ°Έκ³  링크λ₯Ό 남겨 λ†“μŠ΅λ‹ˆλ‹€. 

codechacha.com/ko/android-mediastore-read-media-files/

 

μ•ˆλ“œλ‘œμ΄λ“œ - MediaStoreμ—μ„œ λ―Έλ””μ–΄ 파일 정보 μ½λŠ” 방법

Media providerλŠ” 단말에 μ €μž₯된 이미지, λ™μ˜μƒ, μ˜€λ””μ˜€ 파일의 정보λ₯Ό μ œκ³΅ν•˜λŠ” ν”„λ‘œλ°”μ΄λ”μž…λ‹ˆλ‹€. MediaStoreλŠ” 앱이 Media providerκ°€ μ œκ³΅ν•˜λŠ” νŒŒμΌλ“€μ„ μ ‘κ·Όν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” APIλ“€μ˜ λ¬ΆμŒμž…λ‹ˆλ‹€

codechacha.com

github.com/android/storage-samples/tree/master/MediaStore

 

android/storage-samples

Multiple samples showing the best practices in storage APIs on Android. - android/storage-samples

github.com

developer.android.com/training/data-storage/files/media?hl=ko

 

μ™ΈλΆ€ μ €μž₯μ†Œμ— μžˆλŠ” 파일 μž‘μ—…ν•˜κΈ°  |  Android 개발자  |  Android Developers

MediaStore APIλŠ” λ‹€μŒκ³Ό 같은 잘 μ •μ˜λœ μœ ν˜•μ˜ λ―Έλ””μ–΄ νŒŒμΌμ— μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. MediaStoreλŠ” λ˜ν•œ MediaStore.FilesλΌλŠ” μ»¬λ ‰μ…˜λ„ ν¬ν•¨ν•˜λ©°, 이 μ»¬λ ‰μ…˜μ„ 톡해 λͺ¨λ“  μœ ν˜•μ˜ λ―ΈοΏ½οΏ½

developer.android.com

 

 

 

 

ꡬ글 μ•ˆλ“œλ‘œμ΄λ“œ κ°œλ°œμžλ¬Έμ„œμ— μžˆλŠ” MediaStore API μƒ˜ν”Œμ„ κ°–κ³ μ™€λ΄€μŠ΅λ‹ˆλ‹€.

μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

1. λ¨Όμ € λ‹€λ₯Έ μ•±μ˜ λ―Έλ””μ–΄μŠ€ν† μ–΄μ— μ ‘κ·Όν•˜λ €λŠ”κ±°λ©΄ READ_EXTERNAL_STORAGE κ°™μ€ μ™ΈλΆ€μ €μž₯μ†Œ μ ‘κ·ΌκΆŒν•œμ΄ ν•„μš”ν•©λ‹ˆλ‹€.

 

2. λ―Έλ””μ–΄ μ €μž₯μ†Œ 좔상화와 μƒν˜Έμž‘μš©ν•˜λ €λ©΄ ContentResolverλ₯Ό μ‚¬μš©ν•΄ queryλ₯Ό ν•΄μ•Όν•˜λŠ”λ° κ²€μ€μƒ‰ μŠ€λ‹ˆνŽ«μ„ λ³΄μ‹œλ©΄ Query λ©”μ†Œλ“œκ°€ 5개의 νŒŒλΌλ―Έν„°λ₯Ό ν•„μš”ν•©λ‹ˆλ‹€. κ°κ°μ˜ νŒŒλΌλ―Έν„°λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

 Uri: μ°Ύκ³ μžν•˜λŠ” λ°μ΄ν„°μ˜ Uriμž…λ‹ˆλ‹€.

 Projection: DB의 columnκ³Ό κ°™μŠ΅λ‹ˆλ‹€. κ²°κ³Όλ‘œ λ°›κ³  싢은 λ°μ΄  ν„°μ˜ μ’…λ₯˜λ₯Ό μ•Œλ €μ€λ‹ˆλ‹€.

 Selection: DB의 where ν‚€μ›Œλ“œμ™€ κ°™μŠ΅λ‹ˆλ‹€. μ–΄λ–€ 쑰건으둜 ν•„ν„°λ§λœ κ²°κ³Όλ₯Ό 받을 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

 Selection args: Selectionκ³Ό ν•¨κ»˜ μ‚¬μš©λ˜λ©° selctionμ—μ„œ λ¬ΌμŒν‘œμ— λ“€μ–΄κ°ˆ κ°’μž…λ‹ˆλ‹€. λ§Žμ΄ 보신 ꡬ쑰일 κ²λ‹ˆλ‹€.

 Sort order: μΏΌλ¦¬ κ²°κ³Ό 데이터λ₯Ό sortingν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

이 νŒŒλΌλ―Έν„°λ“€μ„ μ‚¬μš©ν•˜μ—¬ λ―Έλ””μ–΄ νŒŒμΌμ„ μΏΌλ¦¬ν•˜κ³  검색 κ²°κ³Όλ₯Ό λ°›μ•„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

λ‹€μŒμ€ 5λΆ„ μ΄μƒμ˜ 길이λ₯Ό 가진 λ―Έλ””μ–΄λ₯Ό κ²€μƒ‰ν•˜λŠ” λ―Έλ””μ–΄ μ»¬λ ‰μ…˜ 쿼리 예제인데 참고둜 κ°€μ Έμ™€λ΄€μŠ΅λ‹ˆλ‹€.

 

 

 

λ§ˆμ§€λ§‰ MediaStore κ΄€λ ¨ 참고둜  κ΅¬κΈ€μ—μ„œ MediaStoreλ₯Ό λ°€μ–΄μ£ΌλŠ” 만큼 μ•ˆλ“œλ‘œμ΄λ“œ 11μ—μ„œ MediaStore API κ΄€λ ¨ method 듀이 μΆ”κ°€λœκ²Œ μžˆμŠ΅λ‹ˆλ‹€. 

 

 

λ‹€μŒ ꡬ글 λ¬Έμ„œ λ§ν¬μ—μ„œ 더 μžμ„Ένžˆ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

developer.android.com/preview/privacy/storage?hl=ko#media-file-access

 

Android 11의 μ €μž₯μ†Œ μ—…λ°μ΄νŠΈ  |  Android 개발자  |  Android Developers

Android 11μ—μ„œλŠ” ν”Œλž«νΌμ„ λ”μš± κ°•ν™”ν•˜μ—¬ μ™ΈλΆ€ μ €μž₯μ†Œμ˜ μ•± 및 μ‚¬μš©μž 데이터λ₯Ό 보닀 μ•ˆμ „ν•˜κ²Œ λ³΄ν˜Έν•©λ‹ˆλ‹€. 미리보기 μΆœμ‹œμ—μ„œλŠ” μ§€λ‚œν•΄ Android Dev Summitμ—μ„œ λ°œν‘œν•œ λ―Έλ””μ–΄μ˜ μ›μ‹œ 파일 경둜 μ•‘μ„Έ

developer.android.com

 


 

 

λ§ˆμ§€λ§‰μœΌλ‘œ λ―Έλ””μ–΄ 파일 외에 λͺ¨λ“  νŒŒμΌλ“€μ΄ μ €μž₯λ˜λŠ” λ‹€μš΄λ‘œλ“œ 곡간 μ ‘κ·Ό 방법 μž…λ‹ˆλ‹€.

μ—¬κΈ°λŠ” κΆŒν•œμ€ ν•„μš”μ—†κ³   μ €μž₯μ†Œ μ—‘μ„ΈμŠ€ ν”„λ ˆμž„μ›Œν¬(SPA)와 μ‹œμŠ€ν…œ 파일 선택기λ₯Ό 톡해 μ‚¬μš©μžκ°€ λͺ…μ‹œμ μœΌλ‘œ νŒŒμΌμ„ μ„ νƒν•œ 경우 접근이 κ°€λŠ₯ν•˜λ©° μ•± μ‚­μ œμ‹œ μ œκ±°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ꡬ글은 μ•žμ„œ λ―Έλ””μ–΄ μŠ€ν† μ–΄ μ‚¬μš©μ„ κΆŒκ³ ν•˜λŠ” κ²ƒμ²˜λŸΌ μ—¬κΈ°μ„œλŠ” μŠ€ν† λ¦¬μ§€ μ—μ„ΈμŠ€ ν”„λ ˆμž„μ›Œν¬(SPA)λ₯Ό μ‚¬μš©μ„ κΆŒκ³ ν•˜κ³ μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

 

μ €μž₯μ†Œ μ—‘μ„ΈμŠ€ ν”„λ ˆμž„μ›Œν¬(Storage Access Framewrok)에 λŒ€ν•΄ κ°„λž΅ν•˜κ²Œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ‹€μš΄λ‘œλ“œ 곡간에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ©° ν¬κ²Œ λ¬Έμ„œμ œκ³΅μž, μ„ νƒκΈ° UI, ν΄λΌμ΄μ–ΈνŠΈ μ•±μœΌλ‘œ κ΅¬μ„±λ˜λ©° μ‚¬μš©μžκ°€ μΌκ΄€λœ λ°©μ‹μœΌλ‘œ νŒŒμΌμ„ νƒμƒ‰ν•˜κ³ , μ½κ³  μ“Έ 수 μžˆλŠ” ν™˜κ²½μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

그리고 μ™Όμͺ½ κ·Έλ¦Όμ—μ„œ λ³΄μ‹œλŠ”κ±°μ™€ 같이 ν΄λΌμ΄μ–ΈνŠΈμ•±κ³Ό μ œκ³΅μžμ™€ ν”„λ‘œλ°”μ΄λ”λŠ” μ„œλ‘œ μ§μ ‘μ μœΌλ‘œ μƒν˜Έμž‘μš©ν•˜μ§€ μ•Šκ³  μ‹œμŠ€ν…œ μœ μ•„μ΄λ₯Ό 톡해 μƒν˜Έμž‘μš©ν•˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μƒν˜Έμž‘μš©μ„ μœ„ν•΄μ„œλŠ” ACTION_OPEN_DOCUMENT λ˜λŠ” ACTION_CREATE_DOCUMENT μΈν…νŠΈλ₯Ό μ‹€ν–‰μ‹œλ©΄ λ©λ‹ˆλ‹€.

참고둜 였λ₯Έμͺ½μ— μΌκ΄€λœ λ°©μ‹μœΌλ‘œ νŒŒμΌμ„ νƒμƒ‰ν•œλ‹€λŠ” λœ»μ€ 였λ₯Έμͺ½ 그림처럼 선택기 UIκ°€ μ‹œμŠ€ν…œ μ•±μœΌλ‘œ μœ μΌν•˜κ²Œ μ œκ³΅λœλ‹€λŠ” μ μž…λ‹ˆλ‹€.

 (가러리λ₯Ό 예둜 λ“€λ©΄ λ˜‘κ°™μ΄ 생긴 이미지 νŒŒμΌμ„ νƒ UIλ₯Ό λ³΄μ—¬μ€€λ‹€κ³ λ³΄μ‹œλ©΄λ©λ‹ˆλ‹€.)

 

 

 

 

SPA의 예제 μ½”λ“œλ„ λ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ™Όμͺ½μ€ ACTION_OPEN_DOCUMENTλ₯Όμ‚¬μš©ν•˜μ—¬ 이미지 파일이 λ“€μ–΄ μžˆλŠ” λ¬Έμ„œ 제곡자λ₯Ό κ²€μƒ‰ν•˜λŠ” μ½”λ“œμ΄κ³ 

였λ₯Έμͺ½μ€ μ‚¬μš©μžκ°€ μ„ νƒκΈ°μ—μ„œ λ¬Έμ„œλ₯Ό μ„ νƒν•œ ν›„ onActivityResult() ν†΅ν•΄ μ„ νƒν•œ λ¬Έμ„œ URI μ‘λ‹΅λ°›λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

였λ₯Έμͺ½μ€ μ‚¬μš©μžκ°€ μ„ νƒκΈ°μ—μ„œ λ¬Έμ„œλ₯Ό μ„ νƒν•œ ν›„ onActivityResult()κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€resultData λ§€κ°œλ³€μˆ˜μ—λŠ” μ„ νƒν•œ λ¬Έμ„œλ₯Ό κ°€λ¦¬ν‚€λŠ” URIκ°€ ν¬ν•¨λ©λ‹ˆλ‹€getData()λ₯Ό μ‚¬μš©ν•˜μ—¬ URIλ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€. μ΄μ œ μΆ”μΆœν•œ URIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” λ¬Έμ„œλ₯Ό κ²€μƒ‰ν•˜λ©΄ λ©λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€

 

 

μ €μž₯μ†Œ μ ‘κ·Ό ν”„λ ˆμž„μ›Œν¬μ— λŒ€ν•΄μ„œλŠ” λ‹€μŒ μ‚¬μ΄νŠΈμ—μ„œ 더 μžμ„Ένžˆ 보싀 수 μžˆμŠ΅λ‹ˆλ‹€.

곡식 λ¬Έμ„œ : developer.android.com/guide/topics/providers/document-provider?hl=ko

λΈ”λ‘œκ·Έ : codechacha.com/ko/android-storage-access-framework/

brunch.co.kr/@huewu/14

 

 


 

μ§€κΈˆκΉŒμ§€ 말씀 λ“œλ¦° λ²”μœ„μ§€μ •μ €μž₯μ†Œμ— μ˜ν•œ μ €μž₯곡간 λ³€ν™”λ‘œ μ™ΈλΆ€μ €μž₯μ†Œλ₯Ό μ‚¬μš©ν•˜λ˜ λ§Žμ€ 앱듀이 영ν–₯을 λ°›κ³  λŒ€μ‘μ΄ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

κ°œλ°œμžλ“€μ΄ Scoped Storage μ— λ°”λ‘œ λŒ€μ‘ν•˜λŠ”λ° μ‹œκ°„μ΄ 걸리고 νž˜λ“ μ μ„ μ•ŒκΈ° λ–„문에 κ΅¬κΈ€μ—μ„œλŠ” μ•ˆλ“œλ‘œμ΄λ“œ 10 λ²„μ „μ—μ„œ requestLegacyStorage λ₯Ό true둜 μ„€μ •μ‹œ μ˜μ–΄ 해석 κ·ΈλŒ€λ‘œ  λ ˆκ±°μ‹œ μŠ€ν† λ¦¬μ§€ λͺ¨λΈμ„ μ‚¬μš©ν•  수 있게 ν•΄μ€¬μ—ˆμŠ΅λ‹ˆλ‹€.

 

[μ°Έκ³ ]

Target을 Android 10 (API level 29)둜 올린 μ•±μ΄, 10μ΄μƒμ˜ 단말에 μƒˆλ‘œ μ„€μΉ˜λ˜λŠ” κ²½μš°μ—λ§Œ Storage modeκ°€ ν™œμ„±ν™” λ©λ‹ˆλ‹€. Android의 μ €μž₯μ†Œ 정책은 μ•±μ΄ μ²˜μŒ μ„€μΉ˜ν–ˆμ„λ•Œμ˜ μƒνƒœλ₯Ό μœ μ§€ν•΄μ€€λ‹€κ³  ν•©λ‹ˆλ‹€. λ§Œμ•½μ— Android P λ‹¨λ§μ—μ„œ μ—¬λŸ¬λΆ„μ˜ μ•±μ΄ μ„€μΉ˜κ°€ 되고, μ‚¬μš©μžμ˜ 단말이 Android 10 λ””λ°”μ΄μŠ€λ‘œ μ—…κ·Έλ ˆμ΄λ“œκ°€ λ˜κ±°λ‚˜, μ•±μ„ Target level 29둜 λ³€κ²½ν•˜μ—¬ μ—…κ·Έλ ˆμ΄λ“œκ°€ λ˜μ—ˆμ„λ•Œλ„κΈ°μ‘΄κ³Ό λ™μΌν•œ Storage mode둜 λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

 

 

 

κ·ΈλŸ¬λ‚˜ !!!!

μ•ˆλ“œλ‘œμ΄λ“œ 11 λΆ€ν„°λŠ” 이 ν”Œλž˜κ·Έλ₯Ό λ¬΄μ‹œν•˜κ²Œ λ©λ‹ˆλ‹€. λ”°λΌμ„œ Scoped Storage μ— λŒ€μ‘ν•˜κ³  κΈ°μ‘΄ 데이터 ν•„μš” μ‹œ

λ””λ ‰ν„°λ¦¬λ‘œ 데이터 이전 ν•˜λŠ” μž‘μ—…μ΄ ν•„μš”ν•©λ‹ˆλ‹€

μ•±μ˜ λ§€λ‹ˆνŽ˜μŠ€νŠΈμ—μ„œ preserveLegacyExternalStorage μ†μ„±μ„ true둜 ν•˜λ©΄ Android 11을 νƒ€κ²ŸνŒ…ν•˜λŠ” μ•±μ˜ μƒˆ λ²„μ „μœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œν•  λ•Œ λ ˆκ±°μ‹œ μ €μž₯μ†Œ λͺ¨λΈμ„ 보쑴할 수 있으며 μ‚¬μš©μžκ°€ 이전에 데이터λ₯Ό μ €μž₯ν–ˆλ˜ 디렉터리에 μ €μž₯된 μ•± 데이터에 μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” κΆŒν•œμ„ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ 이에 λŒ€ν•œ ꡬ글 λ¬Έμ„œ λ‚΄μš©μž…λ‹ˆλ‹€.

 

https://developer.android.com/preview/privacy/storage?hl=ko

 

 

 

 

λ‹€μŒλ§ν¬μ—μ„œ μ €μž₯μ†Œ 이전 κ΄€λ ¨ν•˜μ—¬ 더 μžμ„Ένžˆ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

developer.android.com/preview/privacy/storage#migrate-data-for-scoped-storage

 

Android 11의 μ €μž₯μ†Œ μ—…λ°μ΄νŠΈ  |  Android 개발자  |  Android Developers

Android 11μ—μ„œλŠ” ν”Œλž«νΌμ„ λ”μš± κ°•ν™”ν•˜μ—¬ μ™ΈλΆ€ μ €μž₯μ†Œμ˜ μ•± 및 μ‚¬μš©μž 데이터λ₯Ό 보닀 μ•ˆμ „ν•˜κ²Œ λ³΄ν˜Έν•©λ‹ˆλ‹€. 미리보기 μΆœμ‹œμ—μ„œλŠ” μ§€λ‚œν•΄ Android Dev Summitμ—μ„œ λ°œν‘œν•œ λ―Έλ””μ–΄μ˜ μ›μ‹œ 파일 경둜 μ•‘μ„Έ

developer.android.com

 

www.youtube.com/watch?v=RjyYCUW-9tY

 

 


 

[보좩 자료]

 

좔가적인 λ‚΄μš©μœΌλ‘œ μ•ˆλ“œλ‘œμ΄λ“œ 11λΆ€ν„° μ €μž₯μ†Œ μ ‘κ·Ό λ‚΄μš©μ΄ μ’€ λ°”κΌˆμŠ΅λ‹ˆλ‹€. 

μ•ˆλ“œλ‘œμ΄λ“œ 11λΆ€ν„°λŠ”  λ²”μœ„ 지정 μ €μž₯μ†Œλ₯Ό 선택 ν•΄μ œν•˜μ§€ μ•Šμ€ 앱이 READ_EXTERNAL_STORAGEκΆŒν•œμ„ μš”μ²­ν•˜λŠ” 경우 Android 10κ³Ό λ‹€λ₯Έ λŒ€ν™”μƒμžκ°€ μ‚¬μš©μžμ—κ²Œ ν‘œμ‹œλ©λ‹ˆλ‹€.

λ°‘ 사진은 μ œκ°€ ν…ŒμŠ€νŠΈ ν•΄λ³Έ 화면인데 κΈ°μ‘΄ Photo μ™€ media and files μ—μ„œ photo, files둜  κΆŒν•œ λ‚΄μš©μ΄ λ³€κ²½λœ 점과

같은 μ•ˆλ“œλ‘œμ΄λ“œ 10이여도 λ²”μœ„μ§€μ •μ €μž₯μ†Œλ₯Ό μ μš©ν–ˆλƒ μ•ˆν–ˆλƒμ—λ”°λΌ λ‹€λ₯Έ λŒ€ν™”μƒμžκ°€ λœΈμ„ λ³Ό 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

[κ·Έ μ™Έ μΆ”κ°€ 정보]

 

앱이 Android 11을 νƒ€κ²ŸνŒ…ν•˜λŠ” 경우 WRITE_EXTERNAL_STORAGE κΆŒν•œλ° WRITE_MEDIA_STORAGE λ…점 κΆŒν•œμ€ 더 이상 μΆ”κ°€ μ•‘μ„ΈμŠ€λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠμŒ

 

이λ₯Ό λŒ€μ²΄ν•˜κΈ° μœ„ν•΄ λͺ¨λ“  파일 μ—‘μ„ΈμŠ€ν•˜λŠ” 방법이 μƒˆλ‘œ μƒκ²ΌμŠ΅λ‹ˆλ‹€.

일뢀 μ•±μ—λŠ” 파일 κ΄€λ¦¬λ‚˜ λ°±μ—… 및 볡원 μž‘μ—…κ³Ό 같이 κ΄‘λ²”μœ„ν•œ 파일 μ•‘μ„ΈμŠ€κ°€ ν•„μš”ν•œ 핡심 μ‚¬μš© 사둀가 μžˆλŠ”λ°

μ΄λŸ¬ν•œ 앱은 λ°‘κ³Ό 같은 κ³Όμ •μœΌλ‘œ λͺ¨λ“  파일 μ•‘μ„ΈμŠ€ κΆŒν•œμ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  νŒŒμΌ μ•‘μ„ΈμŠ€

1. MANAGE_EXTERNAL_STORAGE κΆŒν•œμ„ μ„ μ–Έ (μ•ˆλ“œλ‘œμ΄λ“œ 11μ—μ„œ 생김)

2. ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION μΈν…νŠΈ μž‘μ—…μ„ μ‚¬μš©ν•˜μ—¬ 앱에 λͺ¨λ“  νŒŒμΌ 관리 μ•‘μ„ΈμŠ€ ν—ˆμš©μ˜΅μ…˜μ„ μ‚¬μš© μ„€μ •ν•  수 μžˆλŠ” μ‹œμŠ€ν…œ μ„€μ • νŽ˜μ΄μ§€λ‘œ μ‚¬μš©μžλ₯Ό μ•ˆλ‚΄

developer.android.com/about/versions/11/privacy/storage#all-files-access

 

Android 11의 μ €μž₯μ†Œ μ—…λ°μ΄νŠΈ  |  Android 개발자  |  Android Developers

Android 11(API μˆ˜μ€€ 30)μ—μ„œλŠ” ν”Œλž«νΌμ„ ν•œμΈ΅ 더 κ°•ν™”ν•˜μ—¬ μ™ΈλΆ€ μ €μž₯μ†Œμ˜ μ•± 및 μ‚¬μš©μž 데이터λ₯Ό λ”μš± μ•ˆμ „ν•˜κ²Œ λ³΄ν˜Έν•©λ‹ˆλ‹€. 이 λ²„μ „μ—λŠ” λ―Έλ””μ–΄μ˜ μ›μ‹œ 파일 경둜 μ•‘μ„ΈμŠ€ 선택, λ―Έλ””μ–΄μ˜ 일괄 수

developer.android.com

 

 

 


 

[μ΅œμ’…μš”μ•½]

 

λ§ˆμ§€λ§‰μœΌλ‘œ μ•ˆλ“œλ‘œμ΄λ“œ 11의 μ €μž₯곡간 관련을 μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

1.μ•ˆλ“œλ‘œμ΄λ“œ 11버전 νƒ€μΌ“νŒ…μ‹œ Scoped Storage λŒ€μ‘

 

2.MediaStore API, SAF μ§€μ†μ μΈ 지원할 κ²ƒμ΄λ‹ˆ μ• μš©

 

3.μžμ‹ μ˜ μ•± 파일인 경우 접근이 더 μžμœ λ‘œμ›Œμ‘Œμ§€λ§Œ λ‹€λ₯Έ μ•± 파일의 μ ‘κ·Όν•  κ²½μš°λŠ” 더 엄격해짐

 

 

 

 

이상 κ³΅λΆ€ν•œ λ‚΄μš©μ— λŒ€ν•΄ 정리λ₯Ό λλ§ˆμΉ˜κ² μŠ΅λ‹ˆλ‹€.


[μ°Έκ³ ]

developer.android.com/training/data-storage/files/external-scoped?hl=ko

 

λ²”μœ„κ°€ μ§€μ •λœ μ™ΈλΆ€ μ €μž₯μ†Œ μ•‘μ„ΈμŠ€ κ΄€λ¦¬ν•˜κΈ°  |  Android 개발자  |  Android Developers

μ‚¬μš©μžμ—κ²Œ 파일의 더 λ§Žμ€ κΆŒν•œμ„ μ œκ³΅ν•˜κ³  파일이 λ³΅μž‘ν•΄μ§€λŠ” 것을 μ œν•œν•˜κΈ° μœ„ν•΄, Android 10(API 레벨 29) 이상을 νƒ€κ²ŸνŒ…ν•˜λŠ” 앱은 μ™ΈλΆ€ μ €μž₯μ†Œλ‘œ λ²”μœ„κ°€ μ§€μ •λœ μ•‘μ„ΈμŠ€ λ˜λŠ” λ²”μœ„ 지정 μ €μž₯μ†ŒοΏ½οΏ½

developer.android.com

www.youtube.com/watch?v=UnJ3amzJM94

brunch.co.kr/@huewu/8

 

μ•ˆλ“œλ‘œμ΄λ“œ Q Scoped Storage μ΄ν•΄ν•˜κΈ°

개발자λ₯Ό μœ„ν•œ μ•ˆλ“œλ‘œμ΄λ“œ Q #2 | 개발자λ₯Ό μœ„ν•œ μ•ˆλ“œλ‘œμ΄λ“œ Q #6 μ•ˆλ“œλ‘œμ΄λ“œ Q Scoped Storageμ—μ„œ 살아남기 μ‹œμž‘ν•˜κΈ° 전에... λ³Έ ν¬μŠ€νŠΈλŠ” Scoped Storage κ΄€λ ¨λœ λ‚΄μš©μ„ 닀루며, 3μ›” 14일 곡개된 μ•ˆλ“œλ‘œμ΄οΏ½

brunch.co.kr

www.youtube.com/watch?v=RjyYCUW-9tY

 

medium.com/@chapi79/%EC%9D%B4%EC%A0%9C%EB%8A%94-android-scoped-storage%EB%A5%BC-%EC%A4%80%EB%B9%84%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%95%8C-3d5c22a5a0a9

 

μ΄μ œλŠ” Android Scoped Storageλ₯Ό μ€€λΉ„ν•΄μ•Ό ν•  λ•Œ

Android 10μ—μ„œ μ™ΈλΆ€μ €μž₯μ†Œμ— λŒ€ν•΄ Scoped Storage Modeκ°€ μ†Œκ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이에 영ν–₯을 λ°›λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 2020λ…„ μƒλ°˜κΈ°κΉŒμ§€λŠ” Scoped mode에 λŒ€ν•œ μ€€λΉ„κ°€ λ˜μ–΄μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

medium.com

developer.android.com/training/data-storage#scoped-storage

 

데이터 및 파일 μ €μž₯μ†Œ κ°œμš”  |  Android 개발자  |  Android Developers

AndroidλŠ” λ‹€λ₯Έ ν”Œλž«νΌμ˜ λ””μŠ€ν¬ 기반 파일 μ‹œμŠ€ν…œκ³Ό μœ μ‚¬ν•œ 파일 μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€. μ‹œμŠ€ν…œμ€ μ•± 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ λ‹€μŒκ³Ό 같은 μ—¬λŸ¬ μ˜΅μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 앱별 μ €μž₯μ†Œ: λ‚΄λΆ€ μ €μž₯μ†Œ λ³ΌοΏ½οΏ½

developer.android.com

 

[파일경둜]

https://android.stackexchange.com/questions/205430/what-is-storage-emulated-0

 

What is /storage/emulated/0/?

Recently, I've figured out that if I delete files from /sdcard/Download it deletes files from /storage/emulated/0/Download. And if I add the files into /sdcard/Download it duplicates them in /storage/

android.stackexchange.com

https://imnotyourson.com/which-storage-directory-should-i-use-for-storing-on-android-6/

 

Which storage directory should I use for storing on Android 6+

Android File System Structure Android uses the Linux file system structure which has a single root. So, both internal storage and external storage are directories which are partition in Android file system. Partitions There's some storage related partition

imnotyourson.com

 

좜처: https://youngest-programming.tistory.com/386