2011/12/06

SDカードのマウント、リマウント時にメディアストレージパスを意識する

SDカードのマウント、リマウント時に発行されるACTION_MEDIA_*系のブロードキャストインテントについて。
onReceiveで受け取る引数intentのdataにはマウントorリマウントされたストレージのパスが格納されています。
通知されるパスは下記のようなコードで確認できます。
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Uri data = intent.getData();
        String path = null;
       
        if (data != null) {
            path = data.getPath();
        }
        android.util.Log.e("test", "path=" + path);

        if ("/mnt/sdcard/xxx".equals(path)
                && Intent.ACTION_MEDIA_EJECT.equals(intent.getAction())) {
            // ...
        }
    }
};

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_MEDIA_EJECT);
    filter.addDataScheme("file");
    registerReceiver(mReceiver, filter);
}
Galaxy Nexusなど、端末の内部ストレージとしてSDがマウントされているものが発売される傾向にあります。
クラウドの流行も後押しし、今後はmicroSDが搭載されない端末や内蔵ストレージ搭載の端末が増えてくるもの
と思われます。

内部ストレージ以外の他メディアがマウントされた場合もACTION_MEDIA_*系の通知がくるため、
異なるメディアストレージのパスに対して処理されるのが困るようなケースでは
Environment.getExternalStorageDirectory()等を利用してパスのチェックを行うのが良いでしょう。