Android で SD に情報を書き込む

[戻る]

Android でセンサ等の様々な情報を収集し, PC で解析する時があります. 以前の Android は getExternalStorageDirectory() で SD カードの位置を知り, 適当にデータを書き込んだ後に「USB ストレージを ON にする」だけで データのやりとりができました. ところが最近の Android は getExternalStorageDirectory() は 内蔵メモリのどこかを指し, SD カード本来の位置がわかりません. さらに新規に作成したファイルやディレクトリは Android を再起動しない 限り PC から見ることができません. それだと困るのでなんとかならんか調べてみました.

SD カードの位置の知り方:

if (!GetStragePath())
 sdPath = Environment.getExternalStorageDirectory() + "/";
とする. ここで GetStragePath() は
boolean GetStragePath(){
 try {
 Scanner scanner = new Scanner(new FileInputStream(new File(
  "/system/etc/vold.fstab")));
 while (scanner.hasNextLine()) {
  String line = scanner.nextLine();
  if (line.startsWith("dev_mount") || line.startsWith("fuse_mount")) {
   String str = line.replaceAll("\t", " ").split(" ")[1];
   if (str.equalsIgnoreCase("sdcard")){
    sdPath = line.replaceAll("\t", " ").split(" ")[2];
    sdPath += "/";
    return true;
   }
  }
 }
 } catch (FileNotFoundException e) {}

 return false;
}
てな感じにする. ただしこれで 100% ではないと思われる. 万一間違えた時のためにプログラムで編集可能にしておくべき.

再起動しなくても PC からみえるようにする:

String [] paths = {csvPath, tgpPath};
String [] mime ={"text/csv", "audio/3gpp"};

MediaScannerConnection.scanFile(getApplicationContext(),
  paths, mime, null);
とかいったフレーズを close した後書く (上記例は csvPath と tgpPath に close したファイル名が入っている).


2013.4