관리 메뉴

드럼치는 프로그래머

[안드로이드] SD카드에 저장, 불러오기 기능 수행 본문

★─Programing/☆─Android

[안드로이드] SD카드에 저장, 불러오기 기능 수행

드럼치는한동이 2012. 6. 28. 15:37

#. 현재 디바이스의 상태를 받아와서 Mount되었는지 아닌지를 판단한다.

 //시스템의 현재 상태를 받아와서 ext에 저장한다.
  String ext = Environment.getExternalStorageState();
  if (ext.equals(Environment.MEDIA_MOUNTED)) {
   mSDpath = Environment.getExternalStorageDirectory()
     .getAbsolutePath();
  } else {
   mSDpath = Environment.MEDIA_UNMOUNTED;
  }
 }


#. sdcard내 특정 폴더가 쓰기 가능한지 체크하기

 

private static boolean checkFsWritable() {
    String directoryName = Environment.getExternalStorageDirectory().toString() + "/DCIM";
    File directory = new File(directoryName);
    if(!directory.isDirectory())
    {
        if(!directory.mkdirs()){
            return false;
        }
    }
    File f = new File(directoryName, ".probe");
    try {
        if(f.exists()){
            f.delete();
           
        }
        if(!f.createNewFile()){
            return false;
        }
        f.delete();
        return true;
    } catch (IOException e) {
        return false;
        // TODO: handle exception
    }
   
}

(안드로이드 개발, 사용자 모임 카페에서 에디터님의 글을 copy했습니다)

 

#. SD카드에는 많은 디렉토리가 있으므로 디렉토리의 절대값을 받아오는 방법을 알아봅시다.

  String rootdir = Environment.getRootDirectory().getAbsolutePath();
   String datadir = Environment.getDataDirectory().getAbsolutePath();
   String cachedir = Environment.getDownloadCacheDirectory().getAbsolutePath();

Environment클래스에 있는 get메소드를 이용해서 루트데이터와 데이터 캐쉬데이터의 주소값을 받아올 수 있고 그것의 절대값을 요구하여 String으로 저장하였다.

 

#. 디렉토리를 만들어서 저장하는 과정.

 case R.id.save:
   File dir = new File(mSDpath + "/dir");
   dir.mkdir();
   File file = new File(mSDpath + "/dir/file.txt");
   FileOutputStream fos = null;
   try {
    fos = new FileOutputStream(file);
    String str = "ASDQWODKQWDPOKQWDPOKQwd";
    fos.write(str.getBytes());
    mEdit.setText("write success");
   }catch(FileNotFoundException e){
    mEdit.setText("File not Found"+e.getMessage());

세이브 버튼을 눌렀을 경우에 일어나는 동작입니다.

우선 File로 mSDpath<<<절대값 주소에 /dir 디렉토리라는 객체 dir를 만듭니다.

그 후에 dir/file.txt라는 파일을 만들고 그 객체 file을 선언합니다.

 

그 다음에 파일에 출력할 객체를 FileOutputStream이라는 클래스의fos라는 객체를 선언한 뒤에 파일에 텍스트를 쓸 준비를 합니다. file의 객체(파일)에 fos 을 스트림 객체로 받은 후에 write로 str을 byte단위로 넣습니다.

 

이것까지 하면 파일을 만들어서 그 안에 "ASDQWODKQWDPOKQWDPOKQwd" 문자열이 들어가게 된다.

 

#. sdcard내 파일 저장

 

   File root = Environment.getDownloadCacheDirectory();
    if(root.canWrite()){
        File gpxfile = new File(root, "gpxfile.gpx");
        FileWriter gpxwriter = new FileWriter(gpxfile);
        BufferedWriter out = new BufferedWriter(gpxwriter);
        out.write("hello world");
        out.close();

(안드로이드 개발, 사용자 모임 카페에서 에디터님의 글을 copy했습니다)

예외 처리가 되지 않았습니다. try-catch로 저 구문을 묶어줘야 합니다.

 

 

그 다음에 연 파일을 close해주고 몇가지 예외처리를 하면 끝납니다.

 

#. 예제 소스 전체

: 이 소스에는 파일을 만들어서 저장하는 과정만 나와있습니다. 로드하는 것과 지우는 것 역시 쉬우니 한번 해보시기 바랍니다^^

 

package com.android.dev;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;

public class Z2SDcardActivity extends Activity {
 /** Called when the activity is first created. */
 EditText mEdit;
 String mSDpath;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  mEdit = (EditText) findViewById(R.id.edt);
//시스템의 현재 상태를 받아와서 ext에 저장한다.
  String ext = Environment.getExternalStorageState();
  if (ext.equals(Environment.MEDIA_MOUNTED)) {
   mSDpath = Environment.getExternalStorageDirectory()
     .getAbsolutePath();
  } else {
   mSDpath = Environment.MEDIA_UNMOUNTED;
  }
 }

 public void mOnClick(View v) {
//  Toast.makeText(this, mSDpath, Toast.LENGTH_LONG).show();
  switch (v.getId()) {
  case R.id.test:
   String rootdir = Environment.getRootDirectory().getAbsolutePath();
   String datadir = Environment.getDataDirectory().getAbsolutePath();
   String cachedir = Environment.getDownloadCacheDirectory()
     .getAbsolutePath();

   mEdit.setText(String.format(
     "ext = %s root = %s data = %s cache=%s", mSDpath,
     rootdir, datadir, cachedir));
   break;
  case R.id.save:
   File dir = new File(mSDpath + "/dir");
   dir.mkdir();
   File file = new File(mSDpath + "/dir/file.txt");
   FileOutputStream fos = null;
   try {
    fos = new FileOutputStream(file);
    String str = "ASDQWODKQWDPOKQWDPOKQwd";
    fos.write(str.getBytes());
    mEdit.setText("write success");
   }catch(FileNotFoundException e){
    mEdit.setText("File not Found"+e.getMessage());
   }catch(SecurityException e){
    mEdit.setText("SecurityException"+e.getMessage());
   }catch(Exception e){
    mEdit.setText("기타 에러"+e.getMessage());
   }
   finally{
   
    if(fos!=null)
     try {
      fos.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
   }
   break;
   
  case R.id.load:
  break
  }
 }

}

 

[출처]  http://blog.naver.com/ijoos?Redirect=Log&logNo=60133247191

Comments