getExternalFilesDir과 getExternalStorageDirectory ()의 차이점


89

ExternalFiles는 API 8 이상에서 사용되고 getExternalStorageDirectory는 7 이하에서 사용된다는 것을 이해합니다. 그러나 나는 사용 사이에 약간 혼란 스럽습니다. 예를 들어, 존재하는 폴더가 있는지 확인하고 싶었고 이전에는 다음과 같은 것을 사용했습니다.

File ChildFolder = new File(Environment.getExternalStorageDirectory() + "/ParentFolder/Child");

그러나 내가 보는 모든 예제는 getExternalFilesDir (null), File.ext를 사용하도록 말합니다. API 8 이상이므로이 방법을 사용하고 싶지만 폴더를 어떻게 확인합니까? 다른 지점에서 파일이 있는지 확인하지만 지금은 폴더가 있는지 확인하고 싶습니까 ??

답변:


132
getExternalFilesDir()

SD 카드의 Android / data / data / your_package / 내부 파일 폴더 의 경로를 반환합니다 . 앱에 필요한 모든 파일 (예 : 웹 또는 캐시 파일에서 다운로드 한 이미지)을 저장하는 데 사용됩니다. 앱이 제거되면이 폴더에 저장된 모든 데이터도 사라집니다.

getExternalStorageDirectory()

SD 카드의 루트 경로를 반환합니다 (예 : mnt / sdcard / ). 이 경로에 데이터를 저장하고 앱을 제거하면 해당 데이터가 손실되지 않습니다.


4
Google Android는 프레임 워크 내에서 제공하는 모든 것을 사용하기를 원합니다. 따라서 선택 및 설계 요구 사항에 달려 있습니다. 앱이 제거 될 때 파일이 남아있는 것을 원하지 않으면 getExternalFilesDir () 또는 getExternalCacheDir ()
waqaslam

5
API 8에서는 음악, 사진, 벨소리 등과 같은 폴더에서 데이터를 스캔 할 수있는 고급 미디어 스캐너 기능을 도입했기 때문입니다. 이러한 디렉토리는 getExternalFilesDir () 을 사용하는 경우에만 자동으로 생성됩니다 . 이 기능은 API 7에서 사용할 수 없었기 때문에 getExternalStorageDirectory () 사용을 권장했습니다 . 단순 ...
waqaslam

2
그 좋아, 시간을 좀 줘봐, 곧있을 것 유레카의 순간 :
waqaslam

3
그것은 그 아는 것이 중요합니다 getExternalStorageDirectory()않습니다 필요는 없다 어쩌면 - 일반적으로하지 - ". 당신의 SD 카드에 경로의"를 반환 대신 "기본 외부 저장소 디렉터리"를 반환합니다. 워드 프로세서 ( developer.android.com/reference/android/os/...는 ) 말 :
LarsH

2
'참고 : 여기에서 "외부"라는 단어로 혼동하지 마십시오. 이 디렉토리는 미디어 / 공유 저장소로 생각하는 것이 좋습니다. 비교적 많은 양의 데이터를 보유 할 수 있고 모든 애플리케이션에서 공유되는 파일 시스템입니다 (권한을 적용하지 않음). 일반적으로 이것은 SD 카드 이지만 보호 된 내부 저장소와는 별개이며 컴퓨터의 파일 시스템으로 마운트 할 수있는 장치에 내장 저장소로 구현 될 수도 있습니다. '
LarsH

69

우선 내부 저장소, 외부 저장소 (일명 기본 외부 저장소) 및 보조 외부 저장소의 차이점을 이해해야합니까?

내부 저장소 : 설치된 앱 (또는 기기 루팅)을 제외하고는 사용자가 액세스 할 수없는 저장소입니다. 예 : data / data / app_packageName

기본 외부 저장소 : "사용자가 USB 케이블을 연결하고 호스트 컴퓨터에 드라이브로 마운트하여 액세스 할 수있는"내장 공유 저장소에 있습니다. 예 : Nexus 5 32GB라고 할 때.

보조 외부 저장소 : 이동식 저장소. 예 : SD 카드.

getExternalFilesDir (String type)

기본 외부 저장소의 Android / data / data / your_package / 내부 파일 폴더 경로를 반환합니다. 내장 스토리지입니다.

Environment.getExternalStorageDirectory(type)

보조 외부 저장소 디렉터리의 경로를 반환합니다.


다양한 스토리지 유형을 설명해 주셔서 감사합니다. 그러나 내부 저장소 항목을 편집하여 해당 값을 가져 오는 메서드 호출이 getFilesDir ()임을 언급 할 수 있습니다. 글쎄, 그 메소드는 실제로 data / data / app_packageName / files를 반환하지만 여전히 내부 저장소입니다.
raddevus

3
약 적어주세요 @VicJordan File getExternalStoragePublicDirectory (String type)File getFilesDir ()뿐만 아니라
ANV

2
감사합니다 빅. Environment.getExternalStorageDirectory () 출력 / storage / emulated / 0
gimmegimme

기본 외부 저장소는 항상 내장되어 있고 보조는 항상 제거 가능하다는 설명에 대한 문서가 있습니까? 나는 그것들이 독립적 인 문제라고 생각했다. 일부 휴대폰에는 "외부"저장소가 내장되어 있지 않습니다.이 경우 기본 외부 저장소는 이동식 SD 카드 일 수 있습니다.
LarsH

@LarsH, 내 지식에 따르면 현재 시장에는 기본 외부 저장소가 내장되어 있지 않거나 가까운 장래에 전화가 없습니다. 진저 브레드 당시에는 그런 전화기가 있었지만 지금은 아니었던 전화기가있었습니다. "기본 외부 저장소"가 내장되지 않은 "일부"전화기의 이름을 말씀해 주시겠습니까?
Vikasdeep Singh 2017-06-07

17

! 중요 업데이트! 이 질문을 접하는 사람을 위해.

이것은 다소 오래된 질문이므로 추가 정보를 제공하고 싶었습니다. KitKat은 WRITE_EXTERNAL_STORAGE 권한이 있는 앱도 외부 저장소의 Android / data / data / your_package / 에만 있기 때문에 일명 getExternalFilesDir()

쓰기를 시도하면 getExternalStorageDirectory() + "/somefolder/anotherfolder/"대부분의 장치에서 SecurityException이 발생합니다.


9
문서에 따르면 WRITE_EXTERNAL_STORAGE 권한이있는 앱은 자체 패키지가 아닌 다른 패키지의 외부 저장소에 쓸 수 있습니다. 자신의 디렉터리에만 쓸 수있는 권한이없는 앱입니다. developer.android.com/reference/android/content/… "KITKAT에서 시작하면 반환 된 경로를 읽거나 쓰는 데 권한이 필요하지 않습니다. 항상 그렇습니다. 호출 앱에 액세스 가능 ... 다른 패키지에 속한 경로에 액세스하려면 WRITE_EXTERNAL_STORAGE 및 / 또는 READ_EXTERNAL_STORAGE가 필요합니다. "
Oded

Android 문서가 아이디어를 일반화함에 따라 '대부분의 기기에서'가 중요하기 시작하지만 제조업체는 때때로 InternalStorage (앱 데이터 용 내장 스토리지), ExternalStorage-Primary ( 더 큰 액세스 범위를 가진 내장 스토리지) 와 같은 것을 가지고 있습니다. 및 ExternalStorage-Secondary (SD 카드와 같은 마운트 항목). 이제 외부 StorageDirectory가 반환 하는 경로를 추측 할 수 있습니다.
SGal

7
그것은 당신의 대답에있는 잘못된 정보를 다루지 않습니다. "KitKat에서는 WRITE_EXTERNAL_STORAGE 권한이있는 앱도 외부 저장소의 Android / data / data / your_package /에만 쓸 수 있으므로 getExternalFilesDir ()이라고도합니다." 문서에 따르면 이것은 잘못되었습니다. WRITE_EXTERNAL_STORAGE를 사용하면 앱이 모든 외부 저장소에 쓸 수 있습니다.
Oded

1
@ Oded, 이것을 테스트 했습니까? 문서에 대한 나의 이해와 KitKat 및 이후 장치에 대한 나의 경험이 귀하와 다릅니다. (지금 모든 세부 사항을 해시 할 시간이 있었으면 좋겠어요. 나중에.) 제 경험은 SGal이 옳다는 것입니다. 그리고 약간 다른 롤리팝도 있습니다.
LarsH

2
Android 문서에 따르면이 대답은 노골적으로 거짓입니다. developer.android.com/reference/android/…를 참조하십시오. "API 레벨 19부터이 권한은 getExternalFilesDir (String) 및 getExternalCacheDir ()에서 반환 된 애플리케이션 별 디렉토리의 파일을 읽고 쓰는 데 필요하지 않습니다." (API 레벨 19 = KitKat에 유의하십시오.) 얼마나 많은 찬성 투표를 받았는지 모릅니다.
Ajedi32

6

!! 중요 !!

Environment.getExternalStorageDirectory()더 이상 사용되지 않으며 Context # getExternalFilesDir (String), MediaStore 또는 Intent # ACTION_OPEN_DOCUMENT를 대신 사용해야합니다.

이 메소드는 API 레벨 29에서 더 이상 사용되지 않습니다. 사용자 개인 정보를 개선하기 위해 공유 / 외부 저장 장치에 대한 직접 액세스는 더 이상 사용되지 않습니다. 앱이 Build.VERSION_CODES.Q를 대상으로하는 경우이 메서드에서 반환 된 경로는 더 이상 앱에서 직접 액세스 할 수 없습니다. 앱은 Context # getExternalFilesDir (String), MediaStore 또는 Intent # ACTION_OPEN_DOCUMENT와 같은 대안으로 마이그레이션하여 공유 / 외부 저장소에 저장된 콘텐츠에 계속 액세스 할 수 있습니다.

https://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory ()

또한 Android.M부터 개발자는 런타임에 권한을 요청해야합니다.

더 많은 문서에서 자세한 내용을 참조하십시오 여기에이 질문을

Environment.getExternalStorageDirectory ()는 API 레벨 29 Java에서 더 이상 사용되지 않습니다.


누군가가 스택 오버플로 링크를 찾고 있고 Google 문서에서 붙여 넣은 사본이 아닌 경우 여기를 참조하십시오. stackoverflow.com/questions/57116335/…
Rowan Berry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.