以下はプログラムを組む場合について書いてあります。
「まえおき」
現在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);
- }
詳しくは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;
- }
Thanks you very much. Very very useful code.
返信削除