1.首先需要得到掛載在手機上的有哪些盤符
String[] result = null; StorageManager storageManager = (StorageManager)getSystemService(Context.STORAGE_SERVICE); try { Method method = StorageManager.class.getMethod("getVolumePaths"); method.setAccessible(true); try { result =(String[])method.invoke(storageManager); } catch (InvocationTargetException e) { e.printStackTrace(); } for (int i = 0; i < result.length; i++) { System.out.println("path----> " + result[i]+"\n"); } } catch (Exception e) { e.printStackTrace(); }
這里需要用到一個被系統隱藏的方法,即StorageManager下的getVolumePaths()方法。具體通過反射得到。方法返回值為字符串數組,在我的真機上可以獲得三個盤符:sdcard0 sdcard1 usbdisk。
2.拿到上面的根目錄路徑之后,即可運用listFiles()方法遍歷所有的文件
private void getAllFiles(File path){ File files[] = path.listFiles(); if(files != null){ for (File f : files){ if(f.isDirectory()){ getAllFiles(f); }else{ System.out.println(f); } } } }
這樣就完成了所有文件的遍歷,如果需要讀寫,通過指定路徑拿到File對象實例,再操作文件流即可。
這里需要說明的是,手機如果想讀寫USB,本身需要支持USB-OTG功能。該功能除了支持U盤,還支持外接鼠標,鍵盤,游戲手柄,移動硬盤(需要更大電壓)等。
從硬件上說,Android4.0或以上系統的智能手機芯片都支持USB-OTG了,如果不支持的話,可能是以下兩個原因。
1、硬件上缺少5V升壓器,外接設備沒有電壓供應。
2、硬件設備制造商為了省電考慮,從系統上屏蔽了USB-OTG功能。
解決系統屏蔽OTG問題,網上的方法是(沒有測試過):
1.ROOT后打開RE管理器,編輯system/etc/vold.fstab文件,在vold.fstab的末尾添加如下代碼
# usb otg diskdev_mount usbotg /mnt/usbotg auto /devices/platform/mt_usb /devices/platform/musbfsh_hdrc
2.修改保存,重啟手機
3. Android6.0親測利用反射獲取不到U盤的掛載路徑,Google了一下發現默認掛載在了/mnt/media_rw/<隨機的ID值>
在ADB Shell里可以正常訪問,需要Root權限。