마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 ndk sdcard 경로 관련 질문드립니다.

0 추천

지금 /sdcard 경로 얻어오는 작업이 필요한데 이상한점이 있어서 질문드립니다.

일단 "/sdcard" 경로를 사용했을때 이상한 점이 있습니다.

void AssetManager::copyToDevice(const char* dest, const char* fname) {
	char* buf = nullptr;
	FILE* fp = android_fopen(fname, "rb");
 
	if (fp == NULL) return;
 
	int fileSize = AAsset_getLength(asset);
 
	if (fileSize == 0) return;
 
	buf = new char[fileSize + 1];
 
	AAsset_read(asset, buf, fileSize);
 
	AAsset_close(asset);
 
	FILE* destFP = fopen(dest, "wb");
 
	if (destFP == NULL) 
		return;
	fwrite(buf, 1,fileSize, destFP);
 
	delete buf;
//	fclose(fp);
	fclose(destFP);
}

이코드는 정상작동 합니다.

그런데

 

void MusicContainer::findMusicFiles(const char* path) {
	DIR* dp;
	struct dirent* entry;
 
	dp = opendir(path);
 
	if (dp == NULL) {
		_isLoaded = true;
		return;
	}
	.
        .
        .
        .
}

이 코드에 경로를 /sdcard로 주면, dp가 널값이 되버립니다.

무엇이 문제인지 힌트 좀 주실수 있나요?

rhaps20 (6,010 포인트) 님이 2018년 10월 21일 질문

1개의 답변

0 추천
/sdcard 라고 하는 곳은 내부 저장 장치의 경로 이고요

외부저장 장치의 경로가 아닙니다.

내부저장 장치에 파일 읽기 쓰기는 어플리케이션 하위 디렉토리에서만 가능하고요

(그러므로 당연히 /sdcard 의 하위 파일이나 디렉토리를 읽지도 못하고 쓰지도 못합니다.)

외부저장 장치에 파일 읽기 쓰기는 권한을 얻어야 합니다.

외부저장 장치의 경로는 제조업체마다 제각각이라서 외부저장창지 경로 가져오는

함수를 사용해야 하는데 구글에 뒤져보면 있을겁니다.
쮁쓰뻬로우 (240 포인트) 님이 2018년 10월 22일 답변
내부저장장치 관련해서 드린 질문이에요.
메니페스트 파일에서 target api 버전을 19로 낮추면 정상작동하는데
그 상위에서는 위에 말씀드린것과 같은 문제가 발생합니다.
안드로이드 버전업 하면서 변동이 생긴거 같은데 어떻게 해결해야할지 모르겠네요.
하도 안되서 편법을 사용해봤습니다.

/sdcard/Music
/sdcard/mp3
/sdcard/...

sdcard내에 최상위 폴더들 죄다 탐색...

지금 다른 폰이 없어서 확인은 못해보는데

아무래도 동작할거 같네요.
동작 안하네요 -_-
/sdcard/Android/data/com.xxx만 접근됩니다
...