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