Androidで外部ストレージのパスを取得する方法
現在Androidで外部ストレージのパスを取得するAPIが存在しない。
Androidでストレージのパスを取得するEnvironment.getExternalStorageDirectory()は、 内部ストレージが存在する場合、名前に反して内部ストレージのパスを返す。(これは、既存プログラムの互換性を考えた時に、必要な考慮と思われる。)
そのため、以下を参考にして/system/etc/vold/fstabを使用する方法で取得することにした。
(参考http://inujirushi123.blog.fc2.com/blog-entry-93.html)
Xperia VLの/system/etc/vold.fstabを確認したところ
内部ストレージがfuse_mountで定義されていたため、追加している。
static private List getStoragePaths() { List mountList = new ArrayList(); Scanner scanner = null; try { scanner = new Scanner(new FileInputStream(new File( "/system/etc/vold.fstab"))); while (scanner.hasNextLine()) { String line = scanner.nextLine(); if (line.startsWith("dev_mount") || line.startsWith("fuse_mount")) { String path = line.split(" ")[2].replaceAll(":.*$", ""); if (!mountList.contains(path)){ File dir = new File(path + "/"); if (dir.canRead()){ mountList.add(path); } } } } } catch (Exception e) { mountList = new ArrayList(); mountList.add(Environment.getExternalStorageDirectory().getAbsolutePath()); } finally { if (scanner != null) { scanner.close(); } } return mountList; }