備忘録 〜プログラミング〜

プログラミングに関する事をつらつらと、、

SDカードがマウントされているのに、getExternalFilesDirsで取得出来ない

Android API Level19から、ContextクラスにgetExternalFilesDirsが実装されて、外部SDカードのパスが取得出来るようになったみたいです。
ただ、NECのLavieTab(4.4.2)では、なぜか内部ストレージのみしか取得が出来ませんでした。
SDカードは、しっかりとマウントされているので、以下で取得しようと試みる。

【android】 SDカードのpathを取得する方法 | 一番かんたんなJava入門

が、取得出来ず。
色々調べて、こちらの方法で無事取得出来ました。

Android - SDカードのパスを(強引に)取得する方法 - Qiita

ただ、この方法だと、SDカードがマウントされていなくてもストレージパスを取得してしまうので、こんな感じでマウントされているストレージのみ取得出来るように変更して使用しました。

public static List<String> getRemovableStoragePaths(Context context) {
    List<String> paths = new ArrayList<String>();
    try {
        StorageManager sm = (StorageManager)context.getSystemService(Context.STORAGE_SERVICE);
        Method getVolumeList = sm.getClass().getDeclaredMethod("getVolumeList");
        Object[] volumeList = (Object[])getVolumeList.invoke(sm);
        for (Object volume : volumeList) {
            Method getPath = volume.getClass().getDeclaredMethod("getPath");
            Method isRemovable = volume.getClass().getDeclaredMethod("isRemovable");
            String path = (String)getPath.invoke(volume);
            boolean removable = (Boolean)isRemovable.invoke(volume);
            if (removable) {
                File file = new File(path);
                if(file.exists() && file.list().size > 0){
                    paths.add(path);
                }
            }
        }
    } catch (ClassCastException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return paths;
}

SDカード周りは難しい、、