GDD Phone を使って長時間のデータ記録をして、PCと連携したい用途があったので、どうしても microSD にアクセスしてファイルを読み書きする事が必要でした。
参考書には載ってないやり方だったのですが、なんとかできたみたいなのでここに書いておきます。
Androidがサポートするデータアクセス方法
Androidが提供するデータアクセス方法は、
- プリファレンス
- ローカルファイルアクセス
- SQ-Lite
:
:
等といった。ものがあるようです。参考書 に紹介されているやり方だと、どれもmicroSDにアクセスする事が出来ないみたいです。
ネット上を調べていると、外部ストレージへのファイルハンドルを取得する方法(下記リンク)があったので、がんばればできるのでは?と思い関連項目を調べていました。
※外部ストレージへのファイルハンドルを取得する方法: http://www.adakoda.com/android/000134.html
結果として、めでたくmicroSDへのファイルアクセスに成功しました。
microSDへファイルアクセスを行う方法
try and error の結果下記のような手順を踏めば、microSDへのアクセスが可能だと言うことが分かりました。
- 外部ストレージのパスを取得する
- java.io.File の File クラスのインスタンスを生成する。コンストラクタに "1."のパスとファイル名を指定する。
- FileOutputStream(FileInputStream)クラスのインスタンスを生成する。コンストラクタに File クラスのインスタンスを指定する。
- FileOutputStream クラスの write() を使ってデータを書き込む。
- 書き込みが終わったら、 close() する。
ちなみに、File クラスメンバのmkdirs()を使えば、ディレクトリの作成も出来ます。
下記に、androidで作成したファイル/フォルダをWindows上で表示した様子を示します。
ここで、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();
}
}


