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的に判断出来ます。


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


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


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

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


  1. /** 
  2. * Galaxy Sに外部SDメモリがマウントされているか否か 
  3. * @return true:マウントされている false:マウントされていない 
  4. */  
  5. public boolean isMountExSD_GalaxyS(){  
  6.   //内蔵メモリのパス  
  7.   String pathIn = getSdMountedPath();  
  8.   
  9.   //外付けSD用のパス  
  10.   String pathEx = getSdMountedPath() + "/" + "external_sd";  
  11.   
  12.   long exAvailableSize = getAvailableSize(pathEx);  
  13.   long exALLSize = getSize(pathEx);  
  14.   
  15.   long inAvailableSize = getAvailableSize(pathIn);  
  16.   long inALLSize = getSize(pathIn);  
  17.   
  18.   if(exAvailableSize != inAvailableSize && exALLSize != inALLSize)  
  19.     return true;  
  20.     
  21.   return false;  
  22. }  
  23.   
  24. /** 
  25. * SDメモリカードパスを取得 
  26. * @return 
  27. */  
  28. public String getSdMountedPath(){  
  29.   File exMountedPath = Environment.getExternalStorageDirectory();  
  30.   if(exMountedPath == null)  
  31.     return null;  
  32.     
  33.   return exMountedPath.getPath();  
  34. }  
  35.   
  36. /** 
  37. * path先の使用可能容量を返す 
  38. * @param path 探索先 
  39. * @return 0:失敗 0以外:メモリ容量(Byte) 
  40. */  
  41. public long getAvailableSize(String path){  
  42.   StatFs fs = new StatFs(path);  
  43.   long bkSize = fs.getBlockSize();  
  44.   long avaBlocks = fs.getAvailableBlocks();  
  45.   
  46.   return bkSize * avaBlocks;  
  47. }  
  48.   
  49. /** 
  50. * path先の総容量を返す 
  51. * @param path 探索先 
  52. * @return 0:失敗 0以外:メモリ容量(Byte) 
  53. */  
  54. public long getSize(String path){  
  55.   StatFs fs = new StatFs(path);  
  56.   long bkSize = fs.getBlockSize();  
  57.   long bkCount = fs.getBlockCount();  
  58.   
  59.   return bkSize * bkCount;  
  60. }  
例外処理とかnullチェックは適当に追加してください。

1 件のコメント: