2012/01/14

AndroidでリードオンリーなSDをマウントさせる方法

AndroidにはSDカードのマウント状態を調べるEnvironment.getExternalStorageState()
が用意されています。
マウント状態の中にはSDカードが読み取り専用であった場合に返される
MEDIA_MOUNTED_READ_ONLYがあります。
参考:Android Developer

SDがリードオンリーであることは通常ありません。
しかし、非常に稀ですがメカニカルライトプロテクトスイッチを備えたSDカード
(SDカード自体にスイッチがあり、これをONにすることで読み取り専用とするもの)
や、ソフトウェアのバイナリをSDで提供しているようなケースでも読み取り専用
として提供されます。

読み取り専用のSDカードは入手するのが困難です。
ここではadb shellのコマンドを使用してSDを読み取り専用としてマウントす
る方法を紹介します。

まずはmountコマンドを使用して/mnt/sdcardの状態を調べます。
# mount

複数の結果が返されると思いますが、SDカードにあたる項目を探してください。
手元の環境では下記が取得できました。
(以降はこの値をもとにコマンドを指定していきます)

/dev/block/vold/179:0 /mnt/sdcard vfat rw,

この値は後で指定する際に使用するので覚えておきます。

次にSDカードをアンマウントします。
# umount /mnt/sdcard

これでSDカードのマウントが解除されます。
(Galaxy Nexusのような内蔵SD型の場合はアンマウントできないかも...)

次にSDカードをリードオンリー(ro)として再マウントします。
先ほど取得した値を参考に下記コマンドを発行します。
# mount -t vfat -o ro /dev/block/vold/179:0 /mnt/sdcard

vfatはファイルシステムタイプ、-oはオプション指定でリードオンリー(ro)
を指定します。
続いてdeviceを指定し、最後にパスを指定します。

これで再度mountコマンドを発行すると下記の結果が得られると思います。

/dev/block/vold/179:0 /mnt/sdcard vfat ro,

SDカードがリードオンリーになっていることがわかります。
この状態で動作確認することでSDがリードオンリー状態で試験することが可能です。
なお、この方法ではメディアMOUNTに関するブロードキャストは通知されません。
MOUNTブロードキャストを試験したい場合はam broadcastを使用して自分で発行
するなどの工夫が必要です。

以上です。