안녕하세요
이번 포스팅은 안드로이드 개발을 하던 중에 내부저장소, 외부저장소의 절대경로를 가져오는 방법이 궁금해서 제 개인적으로 정리해봤습니다
틀린 부분이 있을 수도 있으니 그 부분이 있다면 혹시라도 댓글 부탁드립니다
- 목차 -
내부저장소
내부 저장소 절대경로
외부 저장소
외부 저장소 절대경로 - 공용 영역
외부 저장소 절대경로 - 어플리케이션 고유 영역
전체 코드
결과 화면
내부 저장소
내부 저장소는 구동하는 어플리케이션에서만 접근이 가능한 저장소입니다
앱을 삭제하는 경우 내부 저장소에 있는 데이터도 모두 날라가게 됩니다
다른 앱에서 내부 저장소의 파일에 액세스하는것을 원하지 않는 경우 내부 저장소에 파일을 저장하는게 적합합니다
절대경로는 스마트폰의 기종에 따라 다를 수 있습니다
저는 Pixel 4 API 25 AVD의 절대경로를 예로 들었습니다
내부 저장소 절대경로
1. 캐시(Cache)
어플리케이션의 임시 파일을 저장합니다
경로 : /data/user/0/패키지명/cache
File fileCacheDir = getCacheDir();
String getCacheDir = fileCacheDir.getPath();
2. 데이터베이스(Database)
어플리케이션의 데이터베이스 파일들을 저장합니다
경로 : /data/user/0/패키지이름/databases/데이터베이스명
File fileDataBase = getDatabasePath("Android");
String getDatabasePath = fileDataBase.getPath();
3. 일반 파일
어플리케이션의 일반 파일들을 저장합니다
경로 : /data/user/0/패키지명/files
File fileFile = getFilesDir();
String getFile = fileFile.getPath();
4. 일반 파일 폴더
어플리케이션의 일반 파일이 저장되는 폴더를 가져옵니다
경로 : /data/user/0/패키지명/files/폴더명
File fileFileName = getFileStreamPath("Android");
String getFileName = fileFileName.getPath();
외부 저장소
외부 저장소는 어느 어플리케이션에서든 접근이 가능한 저장 공간입니다
앱을 삭제해도 데이터가 그대로 유지가 됩니다
액세스에 제한을 두지 않고 다른 앱과 파일을 공유해도 상관없는 경우 이 저장공간에 저장되게 구현합니다
외부 저장소 절대경로 - 공용 영역
1. 최상위 경로
외부 저장소의 최상위 경로를 가져옵니다
경로 : /storage/emulated/0/tmp
String getDirectory = Environment.getExternalStorageDirectory() + "/tmp";
2. 특정 데이터를 저장하는 폴더
여러 어플리케이션에서 공용으로 사용할 수 있는 데이터가 저장되는 영역입니다
어플리케이션 유형에 따라 타입이 약간씩 다릅니다
경로 : /storage/emulated/0/Alarms
File fileAlarms = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS);
String getAlarms = fileAlarms.getPath();
각 타입별 용도입니다
용도 | 설명 |
Environment.DIRECTORY_ALARMS | 알람 오디오 파일 폴더 |
Environment.DIRECTORY_DCIM | 카메라로 촬영한 사진 폴더 |
Environment.DIRECTORY_DOWNLOADS | 다운로드 파일 폴더 |
Environment.DIRECTORY_MUSIC | 음악 파일 폴더 |
Environment.DIRECTORY_MOVIES | 영상 파일 폴더 |
Environment.DIRECTORY_NOTIFICATIONS | 알람음으로 사용할 오디오 파일 폴더 |
Environment.DIRECTORY_PICTURES | 이미지 파일 폴더 |
Environment.DIRECTORY_PODCASTS | 팟캐스트 파일 폴더 |
위의 용도 외에도 여러가지가 있습니다
외부 저장소 절대경로 - 어플리케이션 고유 영역
1. 특정 데이터를 저장하는 폴더
타입은 위와 똑같다고 보면 됩니다
대신 파일을 배열로 받아서 써줘야하네요
경로 : /storage/emulated/0/Android/data/패키지명/Alarms
File[] fileAlarms2 = getExternalFilesDirs(Environment.DIRECTORY_ALARMS);
String getAlarms2 = fileAlarms2[0].getPath();
2. 캐시 데이터를 저장하는 폴더
임시 데이터를 외부에 저장합니다
경로 : /storage/emulated/0/Android/data/패키지명/cache/tmp
String getCache2 = getExternalCacheDir() + "/tmp";
전체 코드
절대경로를 어플리케이션에 띄어주게 구현했습니다
참고바랍니다!
package com.example.storagepath;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;
import java.io.File;
public class MainActivity extends AppCompatActivity {
TextView tvDirectory;
TextView tvDirectory1;
TextView tvDirectory2;
TextView tvDirectory3;
TextView tvDirectory4;
TextView tvDirectory5;
TextView tvDirectory6;
TextView tvDirectory7;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvDirectory = (TextView) findViewById(R.id.tvDirectory);
tvDirectory1 = (TextView) findViewById(R.id.tvDirectory1);
tvDirectory2 = (TextView) findViewById(R.id.tvDirectory2);
tvDirectory3 = (TextView) findViewById(R.id.tvDirectory3);
tvDirectory4 = (TextView) findViewById(R.id.tvDirectory4);
tvDirectory5 = (TextView) findViewById(R.id.tvDirectory5);
tvDirectory6 = (TextView) findViewById(R.id.tvDirectory6);
tvDirectory7 = (TextView) findViewById(R.id.tvDirectory7);
// 권한ID를 가져옵니다
int permission = ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
int permission2 = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE);
// 권한이 열려있는지 확인
if (permission == PackageManager.PERMISSION_DENIED || permission2 == PackageManager.PERMISSION_DENIED) {
// 마쉬멜로우 이상버전부터 권한을 물어본다
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 권한 체크(READ_PHONE_STATE의 requestCode를 1000으로 세팅
requestPermissions(
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
1000);
}
return;
}
/* 내부저장소 */
// 캐시(Cache)
File fileCacheDir = getCacheDir();
String getCacheDir = fileCacheDir.getPath();
tvDirectory.setText(getCacheDir);
// 데이터베이스(Database)
File fileDataBase = getDatabasePath("Android");
String getDatabasePath = fileDataBase.getPath();
tvDirectory1.setText(getDatabasePath);
// 일반 파일
File fileFile = getFilesDir();
String getFile = fileFile.getPath();
tvDirectory2.setText(getFile);
// 일반 파일 폴더
File fileFileName = getFileStreamPath("Android");
String getFileName = fileFileName.getPath();
tvDirectory3.setText(getFileName);
/* 외부저장소 - 공용 영역 */
// 최상위 경로
String getDirectory = Environment.getExternalStorageDirectory() + "/tmp";
tvDirectory4.setText(getDirectory);
// 특정 데이터를 저장
File fileAlarms = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS);
String getAlarms = fileAlarms.getPath();
tvDirectory5.setText(getAlarms);
/* 외부저장소 - 어플리케이션 고유 영역 */
// 특정 데이터를 저장
File[] fileAlarms2 = getExternalFilesDirs(Environment.DIRECTORY_ALARMS);
String getAlarms2 = fileAlarms2[0].getPath();
tvDirectory6.setText(getAlarms2);
// 캐시 데이터를 저장
String getCache2 = getExternalCacheDir() + "/tmp";
tvDirectory7.setText(getCache2);
}
// 권한 체크 이후로직
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grandResults) {
// READ_PHONE_STATE의 권한 체크 결과를 불러온다
if(requestCode == 1000) {
boolean check_result = true;
// 모든 퍼미션을 허용했는지 체크
for (int result : grandResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
check_result = false;
break;
}
}
// 권한 체크에 동의를 하지 않으면 안드로이드 종료
if(check_result == true) {
}
else {
finish();
}
}
}
}
결과 화면
여기까지 각 내부저장소, 외부저장소의 용도별 절대경로를 얻는 방법에 대해서 알아봤습니다
정리하다보다보니 생각보다 내용이 길어졌네요 ㅎㄷㄷ;;
안드로이드 개발을 하는 분들께 제 포스팅이 도움이 되었으면 좋겠습니다!
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[Android Studio] RuntimeException: Failure delivering result ResultInfo 에러 해결 (0) | 2021.05.08 |
---|---|
[Android Studio] android.content.ActivityNotFoundException: Unable to find explicit activity class 에러해결방법 (2) | 2021.05.07 |
[Android Studio] 권한(Permission) 얻기 (4) | 2021.05.06 |
[Android Studio] 현재 시간 가져오기 (0) | 2021.05.06 |
[Android Studio] 신규 프로젝트 만들기 (0) | 2021.05.05 |