Development record of developer who study hard everyday.

레이블이 안드로이드scopedstorage인 게시물을 표시합니다. 모든 게시물 표시
레이블이 안드로이드scopedstorage인 게시물을 표시합니다. 모든 게시물 표시
, , , , , , , , ,

안드로이드 10 이전 legacy storage 개념 총 정리

 


안드로이드 10이전 Legacy Storage 활용

내부저장소 사용하기

안드로이드 10 이전 LegacyStorage를 사용할 때 내부저장소에 접근할 때는 권한이 필요 없습니다.

그리고 앞의 글에서 이야기했듯이 안드로이드 10 이전과 이후, 내부저장소의 개념은 달라진게 없습니다.

따라서 해왔던 것처럼 

getFilesDir() : 내부저장소의 앱 개별 공간 경로

getCacheDir() : 내부저장소의 임시 캐시파일 저장소 경로

위 2개의 함수를 사용하여 앱의 내부저장소에 접근하면 됩니다.


외부저장소 공유공간 사용하기 

외부저장소의 공유공간에 접근해봅시다.

Legacy Storage에서는 외부저장소에 접근하기 위해서 권한이 필요합니다.


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

위와 같이 manifest.xml 파일에 권한을 선언해줍니다.

참고로 Legacy Storage에서는 WRITE_EXTERNAL_STORAGE 권한만 있으면 외부저장소에 접근 가능합니다.

한 마디로 보안이 취약하다는 뜻입니다.

그 다음 외부저장소가 사용가능한지 getExternalStorageState() 함수를 호출하여 확인합니다.

public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}

이제 외부저장소 공유공간 경로를 가져오겠습니다.

getExternalStorageDirectory() 또는 getExternalStoragePublicDirectory(String type)  함수를 사용하면 됩니다.

getExternalStorageDirectory() 는 외부저장소 SD카드(빌트인)의 최상위 경로를 반환합니다.

getExternalStoragePublicDirectory(String type) 는 외부저장소의 공유디렉터리 경로를 반환합니다.

아래는 예시입니다.

//폴더 저장 경로
public static final String STRSAVEPATH = Environment.getExternalStorageDirectory() + "/MyDirectory/";
public static final String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();

getExternalStoragePublicDirectory() 함수의 매개변수로 던져줄 String타입의 type 변수의 종류는 아래와 같습니다. null을 넘겨주는 것도 가능합니다.

안드로이드 Legacy Strorage

외부저장소 앱 개별공간 사용하기

외부저장소의 앱 개별공간을 사용하고 싶을 때는 getExternalStorageDirectory() 와 getExternalStoragePublicDirectory(String type) 함수대신 getExternalFilesDir(String type) 함수를 사용하면 됩니다.

나머지는 똑같습니다.

이 경우 앱 개별공간이기 때문에 앱을 삭제하면 외부저장소의 앱 개별공간에 있던 파일들도 사라지게 됩니다.


Share:
Read More
, , , , , , , , ,

안드로이드 10 이상 저장소 개념 총 정리


안드로이드 10 이상 저장소 개념 총 정리

회사에서 프로젝트를 하나 수정하게 되었다.

BLE로 데이터를 측정 후에 저장하고 이메일로 보내고 측정 데이터를 핸드폰으로 옮겨서 import해서 볼 수 있는 앱이다.

근데 앱이 워낙 오래되어서 측정 데이터를 활용하는 모든 기능에 수정이 필요했다. ㅜㅜ

평소에도 파일 입출력을 많이 다뤄보지 않아서 걱정이 많았는데 이번에 빡세게 공부했다.

우선, 안드로이드10(Q)이전의 저장소 개념부터 알아보자.

1. 안드로이드 10 이전의 저장소

안드로이드에서는 내부저장소와 외부저장소가 있다.

내부저장소: 말 그대로 기기 내부의 저장소이다.

외부저장소: 단어 말 뜻 자체만 보면 기기 외부의 저장소일 것 같지만!! 그렇지않다.

SD카드 같은 기기 외부의 저장소일 수도 있고 내부저장소가 아닌 기기 내부에 있는 저장소를 외부저장소라고도 한다.

헷갈린다면 그냥 내부저장소가 아닌 것은 다 외부저장소라고 생각해도 큰 문제 없다.

그렇다면 안드로이드 스튜디오에서 외부저장소를 살펴보자

/mnt/sdcard

/sdcard

/storage/self/primary

/mnt/sdcard, /sdcard, /storage/self/primary 3가지의 경로를 캡쳐화면으로 확인했다.

전부 다 같은 공간을 나타내고 빌트인 외부저장소에 해당한다.

그리고 캡쳐화면에 /Pictures, /DCIM, /Movies 처럼 우리가 흔히 접하는 폴더들이 보인다.

이런 폴더들은 안드로이드에서 제공하는 빌트인 외부저장소의 공유공간에 해당하는 곳이다.

그리고 외부저장소에도 내부저장소 처럼 앱 개별 공간이 별도로 존재한다.

(내부저장소보다 외부저장소가 볼륨이 크기 때문에 용량이 큰 컨텐츠는 외부저장소에 따로 보관할 수 있게 만들었다고 한다.)

이번엔 내부저장소를 살펴보자

/data/data
/data/data 경로로 들어가보면 내부저장소가 나온다.

안드로이드 10 이전 저장소
안드로이드 10 이전의 저장소

안드로이드 10 이전의 저장소 개념을 한눈에 정리한 그림이다.
보통 이것을 Legacy Storage라고 부른다.

2. 안드로이드 10 이상의 저장소 

안드로이드 10부터는 Scoped Storage라는 개념이 생겼습니다.

Scoped Storage

Scoped Storage에서는 내부저장소에 앱별 저장소를 제공합니다.

다른 앱이 액세스해서는 안되는 민감한 정보를 여기에 저장하면 됩니다.

안드로이드 10 이전과 동일합니다.

외부저장소가 조금 달라졌는데요.


외부저장소 구조의 변화

안드로이드 10 이전에는 EXTERNAL_STORAGE 권한으로 다른 앱의 개별공간을 접근했지만 이제는 접근 자체가 불가능합니다.

그리고 개별 앱 공간을 이용할 때는 어떠한 권한도 필요가 없습니다.

오늘은 여기까지 정리하고 다음 글에서는 각 저장소의 공간에 어떻게 접근하는지에 대해서 정리해보도록 하겠습니다.


Share:
Read More