2011年2月21日月曜日

Galaxy SにSDカードが刺さっているかどうかを確認する

一般向けには、Settings->SD card and phone storageで確認出来ます。


以下はプログラムを組む場合について書いてあります。

「まえおき」
現在Galaxy S専用に撮った写真やムービーをSDメモリにバックアップするアプリを作っています。
作っていて問題になったのは、バックアップ先のSDカードが携帯に刺さっているかを判断する方法が「Galaxy S(たぶんシリーズ的に)」存在しないことです。
このような各種チェックはバックアップ先の容量等...を確認するために必要です。


Galaxy Sは他のAndroid機と外部SDメモリの扱いがかなり違います。
端折って書きますが、Galaxy S以外の多くのAndroid機では外部SDメモリが刺さっているかどうかをAPI的に判断出来ます。


たとえば
public boolean isMountedExSD(){
  return Environment.MEDIA_MOUNTED.equals(Environment.MEDIA_MOUNTED);
}
こんな感じ、でもこれはGalaxy Sには使えません。


詳しくはu-sukeの日記「2010-12-11 Nexus one と Galaxy S の違いにハマる
やAndroid会のログ「 Galaxy S の マイクロSDカードマウントについて質問です。
に考察があります。


「対応」
SDカードが抜かれている場合に取得出来る容量は、内蔵メモリ(SD)の容量と同じ事を利用して、下のように組みました。

つまり
アンマウント状態:内部、外部とも同じ容量が返ってくる
マウント済み:内部、外部で違った容量
で判断してます。


/**
* Galaxy Sに外部SDメモリがマウントされているか否か
* @return true:マウントされている false:マウントされていない
*/
public boolean isMountExSD_GalaxyS(){
  //内蔵メモリのパス
  String pathIn = getSdMountedPath();

  //外付けSD用のパス
  String pathEx = getSdMountedPath() + "/" + "external_sd";

  long exAvailableSize = getAvailableSize(pathEx);
  long exALLSize = getSize(pathEx);

  long inAvailableSize = getAvailableSize(pathIn);
  long inALLSize = getSize(pathIn);

  if(exAvailableSize != inAvailableSize && exALLSize != inALLSize)
    return true;
  
  return false;
}

/**
* SDメモリカードパスを取得
* @return
*/
public String getSdMountedPath(){
  File exMountedPath = Environment.getExternalStorageDirectory();
  if(exMountedPath == null)
    return null;
  
  return exMountedPath.getPath();
}

/**
* path先の使用可能容量を返す
* @param path 探索先
* @return 0:失敗 0以外:メモリ容量(Byte)
*/
public long getAvailableSize(String path){
  StatFs fs = new StatFs(path);
  long bkSize = fs.getBlockSize();
  long avaBlocks = fs.getAvailableBlocks();

  return bkSize * avaBlocks;
}

/**
* path先の総容量を返す
* @param path 探索先
* @return 0:失敗 0以外:メモリ容量(Byte)
*/
public long getSize(String path){
  StatFs fs = new StatFs(path);
  long bkSize = fs.getBlockSize();
  long bkCount = fs.getBlockCount();

  return bkSize * bkCount;
}
例外処理とかnullチェックは適当に追加してください。

1 件のコメント: