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

외장메모리 경로입니다.

+1 추천
제가 안드로이드 2.2 프로요를 쓰거든요. 모토로라 디파이구요
 
이걸로 기기 테스트를 쭉 해왔는데 잘되다가 혹시나 해서 젤리빈 폰에다가 테스트 해봤는데 죽네요 ㅠㅠㅠ
 
온클릭메소드에 캡쳐 기능에서 죽던데
거기에서 저장경로 때문에 죽는거 같습니다.
 
제가 /sdcard/이렇게 박아 놓았거든요..
 
환경을 구분해서 메모리 경로를 바꾸게 구성을 해야될꺼같습니다.
 
그런데 구분을 어떻게 해야하나요?
 
검색해보니 API8 부터는 getExternalStoragePublicDirectory() 이경로를 쓴다고 하더라구요 
 
2.2가 딱 API8 부터 지원하던데 현재 getExternalStorageDirectory() 이걸로 쓰고 있는데 getExternalStoragePublicDirectory()  이걸 넣으면 에러가 뜨구요.
 
 
String sdPath;
String ext = Environment.getExternalStorageState();
  if(ext.equals(Environment.MEDIA_MOUNTED)) {
   
   sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
  } else {
   
   sdPath = Environment.MEDIA_UNMOUNTED;
  }


try {
File path = new File("/sdcard/temp"); //+sdPath+"/temp" 이런식으로 바꿔줘야될꺼 같습니다.
if(!path.isDirectory()){
path.mkdirs();
}

 

 
 
이렇게 하면 되는거 아닌가요?
 

 

브루스웨인 (8,580 포인트) 님이 2013년 6월 16일 질문
어떤 에러가 발생하는지 logcat 내용을 올려주세요.
06-16 13:31:27.580: E/AndroidRuntime(20734): FATAL EXCEPTION: main
06-16 13:31:27.580: E/AndroidRuntime(20734): java.lang.NullPointerException
06-16 13:31:27.580: E/AndroidRuntime(20734):     at com.example.faceon.ResultActivity.onClick(ResultActivity.java:820)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at android.view.View.performClick(View.java:3524)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at android.view.View$PerformClick.run(View.java:14226)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at android.os.Handler.handleCallback(Handler.java:605)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at android.os.Looper.loop(Looper.java:137)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at android.app.ActivityThread.main(ActivityThread.java:4526)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at java.lang.reflect.Method.invokeNative(Native Method)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at java.lang.reflect.Method.invoke(Method.java:511)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
06-16 13:31:27.580: E/AndroidRuntime(20734):     at dalvik.system.NativeStart.main(Native Method)
온클릭에 있는 캡쳐 부분소스입니다.
try {
                File path = new File("/sdcard/temp");
                if(!path.isDirectory()){
                    path.mkdirs();
                }
               
                fos = new FileOutputStream("/sdcard/temp/-"+str_name+"-.jpeg");
                captureView.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            }catch (FileNotFoundException e) {
               
                e.printStackTrace();
               
            }


820번째 줄소스는
captureView.compress(Bitmap.CompressFormat.JPEG, 100, fos);
이부분입니다.

5개의 답변

0 추천
 
채택된 답변
Environment.getExternalStorageDirectory().getAbsolutePath() 를 쓰시면 됩니다.

( getExternalStoragePublicDirectory 가 아닙니다. )

버전 별로 구분할 필요없이 위 함수를 쓰면 잘 됩니다.
익명사용자 님이 2013년 6월 17일 답변
브루스웨인님이 2013년 6월 18일 채택됨
+1 추천

젤리빈부터 sdcard0인가 이상한 숫자가 붙었던 기억이 나네요 그리고 단말에 따라 sdcard가 있을수도 없을수도 있답니다. 그러므로 외장메모리가 사용 가능한지 검사하는 로직을 넣는것이 좋아 보입니다. 

예를들면

String ext = Environment.getExternalStorageState();
if (ext.equals(Environment.MEDIA_MOUNTED))
{
	path = Environment.getExternalStorageDirectory().getAbsolutePath();
}
  (11,920 포인트) 님이 2013년 6월 17일 답변
sdcard0 은 확장 sdcard 입니다. ics 부터 방식이 바뀌어 기본 메모리 공간이 sdcard 가 존재하게 되고 확장으로 micro sdcard  을 넣을 때 sdcard0 식으로 바뀝니다. 해당 label 명은 업체마다 다릅니다.
그럼 API레벨로 구분을 해서 각각 다른 구문을 실행하게 해줘야겠군요ㅕ.ㅠ
0 추천
우선 /sdcard/temp/ 디렉토리가 젤리빈 기기에 있는지부터 확인하세요.
monal (4,210 포인트) 님이 2013년 6월 16일 답변
위에 이프문에서 없으면 폴더를 만들게 해놓았는데도 그러네요..

궁금한건 2.2 프로요 기기에서는 잘됩니다.
젤리빈에서는 안되구요.
그런데 둘 다 파일관리자 들어가면 sdcard경로가 /mnt/sdcard 라고 되어있습니다. 이게 문제가 될까요?
0 추천
당연히 문제가 생깁니다...

 

저렇게 절대경로로 박아넣으시면 안되요.

 

외장저장장치 패스 얻어오는 메소드 getexternalstorage 어쩌구 사용하시던가하세요.
마플 (3,720 포인트) 님이 2013년 6월 17일 답변
0 추천

path.isDirectory() => path.exists()

 

해당 경로의 유무는 exists 로 확인 합니다. 2.x 버전에서 된 경우는 해당 폴더에 디렉토리가 존재해서 그런것 입니다.

 

aucd29 (218,390 포인트) 님이 2013년 6월 17일 답변
...