[안드로이드] 이런…. 무책임한 개발환경 같으니…

하루를 정리하고… 퇴근 직전.. 잠시 안드로이드를 공부하던 차에.. 문제가 발생했습니다.. 물론.. 모든 문제의 책임은 개발자에게 있지만… 어느 정도.. 힌트를 줘야 문제를 잡지… Error Log에 달랑 아래와 같은 에러 로그만 찍어주고.. 어디 소스 파일에 문제인지 알려주지 않으니.. 도통 나같은 안드로이드 입문자에게.. 에러 잡기는 서울서 김서방 찾기로군…

사용자 삽입 이미지

이래.. 저래.. 소스 코드며.. xml  파일이며 하나 하나, 한줄 한줄 다 뒤진 끝에.. xml에 문제가 있다는 것을 알았습니다.. 그 xml은 레이아웃을 정의하는 것이고… 다음과 같습니다..

...

; 
  
;

...

보니.. Button인데.. Buttom이죠.. 프로젝트가 방대해지고.. 정신없이 개발하고 있다면.. 어떤 힌트가 제공하지 않는… 이런 성의없는 에러로그로는 정말 당혹스러워질법도 한데요..

이런 상황을 대비해서.. 다시금 에러로그를 살펴봅니다.. org.eclipse.jdt.ui에 Internal Error는.. ui를.. 즉, 레이아웃을 정의하는 기능 내부의 에러라는 의미이고… 그 하단에 딸린 추가 로그 정보인 gen [in tstAndroid] does not exist는.. 무언가 존재하지 않는다는 의미라고 생각할 수 있겠는데요.. 바로 실수로 입력한 Buttom에 대한 ui가 존재하지 않는다는 생각할 수 있겠습니다..

이런 경우에는….. 레이아웃을 정의하는 xml에 태그명이 잘못되었으니.. 이곳에서서 문제를 찾아볼것! 이라고 정리해봅니다.. 아이코…… 벌써.. 11시가 넘었습니다.. 퇴근해야죠…… 내일을 위해서…

[안드로이드] SD 카드에 파일 생성

안드로이드는 보안상의 이유로 모바일 디바이스의 내장 메모리를 통한 파일을 여러개의 어플리케이션에서 공유하는 것이 여러모로 불편하게 되어 있습니다. 하지만 외장 메모리인 SD 카드의 경우는 이러한 제약이 존재하지 않습니다. 이 글은 안드로이드에서 SD 카드에 파일을 생성하는 것에 대한 정리입니다.

먼저 안드로이드에 SD 카드의 사용 가능 여부를 판단하기 위한 코드는 아래와 같습니다.

String ess = Environment.getExternalStorageState();
String sdCardPath = null;
if(ess.equals(Environment.MEDIA_MOUNTED)) {
    sdCardPath = Environment.getExternalStorageDirectory().getAbsolutePath();
    showMsg("SD Card stored in " + sdCardPath);
} else {
    showMsg("SD Card not ready!");
}

showMsg는 안드로이드의 Toast 기능을 좀더 쉽게 사용하기 위한 사용자 정의 매서드로써 아래와 같습니다.

private void showMsg(String msg)
{
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}

Toast는 디바이스 화면에 일정 시간 동안 메세지를 띠워주는 기능입니다. 다시 본론으로 돌아가서.. 정적 클래스인 Environment의 getExternalStorageState 매서드의 반환값이 Environment.MEDIA_MOUNTED 인 경우가 SD 카드를 사용할 수 있다는 의미이고 사용 가능하다면 SD 카드가 마운트된 디렉토리 명을 얻기 위해 다시 Environment의 getExternalStorageDirectory 매서드를 사용합니다. 이렇게 얻은 디렉토리에는 보안상의 제약 없이 자유롭게 파일을 읽고 쓸 수 있습니다. 여기서는 파일을 쓰는 코드에 대해 살펴보겠습니다.

File file = new File(sdCardPath + "/test.txt");
try {
    FileOutputStream fos = new FileOutputStream(file);
    String msg = "이 파일은 SD 카드에 저장된 메세지입니다.";
    fos.write(msg.getBytes());
    fos.close();
} catch(FileNotFoundException fnfe) {
    showMsg("지정된 파일을 생성할 수 없습니다.");
} catch(IOException ioe) {
    showMsg("파일에 데이터를 쓸 수 없습니다.");
}

안드로이드는 자바 언어를 통해 플랫폼의 API를 사용할 수 있습니다. 이런 맥락으로 SD 카드에 파일을 생성하고 읽고, 쓰기는 자바의 API를 그대로 사용할 수 있습니다.

끝으로 SD 카드를 사용하기 위해서는 매니페스트 파일에 다음과 같은 설정값을 추가해줘야 합니다.


이 설정값이 없다고 해도 SD 카드를 사용할 수 있다고 나오지만 실제로 파일을 쓰거나 읽을 수 없으니.. 반드시 이 설정값을 추가하기 바랍니다.