デジモノ狂想曲!

デジタルデバイスの活用方法を模索しています。
最近、OpenSocialを勉強中です!
[相互リンク募集中です!!]
コメント、リンク大歓迎!!
.

2009年06月21日

Android を使って micoSD 上にファイルとフォルダを作ってみた


GDD Phone を使って長時間のデータ記録をして、PCと連携したい用途があったので、どうしても microSD にアクセスしてファイルを読み書きする事が必要でした。

参考書には載ってないやり方だったのですが、なんとかできたみたいなのでここに書いておきます。

Androidがサポートするデータアクセス方法

Androidが提供するデータアクセス方法は、

  • プリファレンス
  • ローカルファイルアクセス
  • SQ-Lite
      :
      :

等といった。ものがあるようです。参考書 に紹介されているやり方だと、どれもmicroSDにアクセスする事が出来ないみたいです。
ネット上を調べていると、外部ストレージへのファイルハンドルを取得する方法(下記リンク)があったので、がんばればできるのでは?と思い関連項目を調べていました。

※外部ストレージへのファイルハンドルを取得する方法: http://www.adakoda.com/android/000134.html

結果として、めでたくmicroSDへのファイルアクセスに成功しました。

microSDへファイルアクセスを行う方法

try and error の結果下記のような手順を踏めば、microSDへのアクセスが可能だと言うことが分かりました。

  1. 外部ストレージのパスを取得する
  2. java.io.File の File クラスのインスタンスを生成する。コンストラクタに "1."のパスとファイル名を指定する。
  3. FileOutputStream(FileInputStream)クラスのインスタンスを生成する。コンストラクタに File クラスのインスタンスを指定する。
  4. FileOutputStream クラスの write() を使ってデータを書き込む。
  5. 書き込みが終わったら、 close() する。

ちなみに、File クラスメンバのmkdirs()を使えば、ディレクトリの作成も出来ます。

下記に、androidで作成したファイル/フォルダをWindows上で表示した様子を示します。

ScreenShot-20090621031138.PNG

ここで、microSDをUSBマスストレージとしてマウントしているのですが、これをしているときはプログラムからmicroSDのアクセスはできません。
このままandroidからファイルアクセスを使用とすると、例外で落っこちてしまいます。(というか、落っこちました・・・・)
このため、ディバッグを進める場合は、必ず端末(HT-03A, GDD Phone)側でUSB接続を切っておいて下さい。

 

ソースコードサンプル

下記に、microSDへのアクセスを行う為のサンプルコードを記載します。参考にしていただけると嬉しいです。

package jp.hews.testforstrageaccess;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Formatter;
import java.util.Calendar;
import android.os.Environment;


public class TestForStrageAccess extends Activity {
    /** Called when the activity is first created. */
 private final String TAG   = "FileIOTest";
 private final String APPDIR_PATH ="AppDirectory/FileTest/01"; //microSD以下に作成されるディレクトリ。

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String FileName;
        setContentView(R.layout.main);
        Log.i(TAG,"Started!");
        //microSDへのハンドルを得る
        //引数に、microSDのディレクトリ名と、作りたいディレクトリ名を指定。
        File file_to_basedir = new File(Environment.getExternalStorageDirectory(),APPDIR_PATH);
      
        try {
         //初回起動時にフォルダを作る
         //mkdirs()を使うと、ルートから順番に一個ずつ造らなくても、ディレクトリをまとめて作ってくれる。
         //例:"AppDirectory/FileTest/01"
         if(file_to_basedir.mkdirs()){
          //成功!
          Log.i(TAG,"DirectoryHasCreated!");
         } else {
          //サンプルなので例外はスルー
          Log.i(TAG,"Cannot Create Directory");
         }
         //ファイル名は YYYYMMSS-hhmmss.txt の形式
         FileName ="";
            File file_to_appdir = new File(file_to_basedir.getPath() ,getFileNameByDateAndTime());
         if(file_to_appdir.createNewFile() == true){
           FileOutputStream fileoutput = new FileOutputStream(file_to_appdir);
           fileoutput.write('a');
           fileoutput.flush();
           fileoutput.close();
          }
         } catch (IOException e) {
         // TODO Auto-generated catch block
          e.printStackTrace();
         }
    }
 private final String getFileNameByDateAndTime(){
  Formatter formatter = new Formatter();

  Calendar calendar = Calendar.getInstance();
  int year = calendar.get(Calendar.YEAR);
  int month = calendar.get(Calendar.MONTH);
  int day = calendar.get(Calendar.DAY_OF_MONTH);
  int hour = calendar.get(Calendar.HOUR_OF_DAY);
  int minute = calendar.get(Calendar.MINUTE);
  int second = calendar.get(Calendar.SECOND);
  
  //YYYYMMSS-hhmmss.txt
  formatter.format("%04d%02d%02d-%02d%02d%02d.txt", year, month, day, hour, minute, second);
     Log.i(TAG,"FileName; " +formatter.toString());
    
  return formatter.toString();
  
 }
 
}

 

 






投稿: はせこう。 at 03:31 | Comment(0) | TrackBack(0) | Android
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/29951673

この記事へのトラックバック

ランキング投票!

RSS取得