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カード周りは難しい、、