以下はプログラムを組む場合について書いてあります。
「まえおき」
現在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チェックは適当に追加してください。
Thanks you very much. Very very useful code.
返信削除