안드로이드(스튜디오)/막 써
저장소 경로 가져오기 메소드
어비서
2018. 4. 6. 00:03
반응형
/**
* 저장소 경로 반환.
* @param context {@link Context}
* @param isGetExternalPath 외부 저장소 반환 여부
* @return 저장소 경로
*/
public static String getStoragePath(Context context, boolean isGetExternalPath) throws IOException{
String storagePath = "";
String internalPath = "";
String externalPath = "";
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
// /storage/저장소명/Android/data/패키지명 형식의 File 리스트 가져오기
File[] packageDirs = context.getExternalFilesDirs("");
// 우리나라는 드물지만 2개 이상의 저장소를 가진 디바이스가 있어
// 해당 디바이스는 따로 처리가 필요 할것으로 판단되어 오류 처리 함.
if (packageDirs.length > 2) {
throw new IOException("Can not find path. Cause device has more than 2 storage.");
}
for (int i = 0; i < packageDirs.length; i++) {
File packageDir = packageDirs[i];
if (packageDir != null) {
String tmpPackagePath = packageDir.getPath();
String tmpStoragePath = tmpPackagePath.substring(0, tmpPackagePath.indexOf("/Android"));
if (tmpStoragePath.toLowerCase().contains("emulated")) {
internalPath = tmpStoragePath;
} else {
externalPath = tmpStoragePath;
}
}
}
if(isGetExternalPath){
if(externalPath != null && externalPath.length() > 0){
storagePath = externalPath;
}else{
throw new IOException("Can not find path. Cause find storage path is null.");
}
}else{
if(internalPath != null && internalPath.length() > 0){
storagePath = internalPath;
}else{
throw new IOException("Can not find path. Cause find storage path is null.");
}
}
}else{
try {
internalPath = Environment.getExternalStorageDirectory().getPath();
File root = new File("/mnt");
File[] rootDir = root.listFiles();
for (File dir : rootDir) {
if (dir.canWrite()) {
String tmpPath = dir.getPath();
if (tmpPath.contains("legacy")){
continue;
}
if (!internalPath.equals(tmpPath)) {
externalPath = tmpPath;
break;
}
}
}
} catch (Exception e) {
throw new IOException("Can not find path. Cause " + e.getMessage());
}
if(isGetExternalPath){
if(externalPath != null && externalPath.length() > 0){
storagePath = externalPath;
}else{
throw new IOException("Can not find path. Cause find storage path is null.");
}
}else{
if(internalPath != null && internalPath.length() > 0){
storagePath = internalPath;
}else{
throw new IOException("Can not find path. Cause find storage path is null.");
}
}
}
return storagePath;
}
반응형