π± dreaming DiNO
[Kotlin] Scoped Storage(λ²μμ§μ μ μ₯μ) μ 리 (Legacy Storageμ μ°¨μ΄μ μ 리) λ³Έλ¬Έ
[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/
μ§κΈκΉμ§ λ§μ λλ¦° λ²μμ§μ μ μ₯μμ μν μ μ₯κ³΅κ° λ³νλ‘ μΈλΆμ μ₯μλ₯Ό μ¬μ©νλ λ§μ μ±λ€μ΄ μν₯μ λ°κ³ λμμ΄ νμνμ΅λλ€.
κ°λ°μλ€μ΄ 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
μλλ‘μ΄λ Q Scoped Storage μ΄ν΄νκΈ°
κ°λ°μλ₯Ό μν μλλ‘μ΄λ Q #2 | κ°λ°μλ₯Ό μν μλλ‘μ΄λ Q #6 μλλ‘μ΄λ Q Scoped Storageμμ μ΄μλ¨κΈ° μμνκΈ° μ μ... λ³Έ ν¬μ€νΈλ Scoped Storage κ΄λ ¨λ λ΄μ©μ λ€λ£¨λ©°, 3μ 14μΌ κ³΅κ°λ μλλ‘μ΄οΏ½
brunch.co.kr
www.youtube.com/watch?v=RjyYCUW-9tY
μ΄μ λ 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