這是一個 file Explorer,會正確列出 SD Card 和 internal eMMC storage 的內容。
也會顯示 "SD Card" 和 "Internal Storage"
他得的方法是用 StorageManager 的 static function : "getVolumeList"
取得完整mount list,
然後一一取出 mount 資訊,再自己分類...
所以找得出 SD mount point..
另外... 這一篇的 sample function 可以正常動作。
其中的 function:
/* returns external storage paths (directory of external memory card) as array of Strings */ public String[] getExternalStorageDirectories() { List<String> results = new ArrayList<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //Method 1 for KitKat & above File[] externalDirs = getExternalFilesDirs(null); for (File file : externalDirs) { String path = file.getPath().split("/Android")[0]; boolean addPath = false; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { addPath = Environment.isExternalStorageRemovable(file); } else{ addPath = Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(file)); } if(addPath){ results.add(path); } } } if(results.isEmpty()) { //Method 2 for all versions // better variation of: http://stackoverflow.com/a/40123073/5002496 String output = ""; try { final Process process = new ProcessBuilder().command("mount | grep /dev/block/vold") .redirectErrorStream(true).start(); process.waitFor(); final InputStream is = process.getInputStream(); final byte[] buffer = new byte[1024]; while (is.read(buffer) != -1) { output = output + new String(buffer); } is.close(); } catch (final Exception e) { e.printStackTrace(); } if(!output.trim().isEmpty()) { String devicePoints[] = output.split("\n"); for(String voldPoint: devicePoints) { results.add(voldPoint.split(" ")[2]); } } } //Below few lines is to remove paths which may not be external memory card, like OTG (feel free to comment them out) if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { for (int i = 0; i < results.size(); i++) { if (!results.get(i).toLowerCase().matches(".*[0-9a-f]{4}[-][0-9a-f]{4}")) { Log.d(LOG_TAG, results.get(i) + " might not be extSDcard"); results.remove(i--); } } } else { for (int i = 0; i < results.size(); i++) { if (!results.get(i).toLowerCase().contains("ext") && !results.get(i).toLowerCase().contains("sdcard")) { Log.d(LOG_TAG, results.get(i)+" might not be extSDcard"); results.remove(i--); } } } String[] storageDirectories = new String[results.size()]; for(int i=0; i<results.size(); ++i) storageDirectories[i] = results.get(i); return storageDirectories; }
把他包起來放在 github 囉:https://github.com/checko/Getsdpath
沒有留言:
張貼留言