以下はプログラムを組む場合について書いてあります。
「まえおき」
現在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.
返信削除