您好,登錄后才能下訂單哦!
Android6.0上會根據卡的種類和卡的掛載狀態來動態生成掛載路徑,所以之前寫固定路徑的辦法不可用,最后通過網上查找和分析android源碼,通過反射獲取到路徑,并且進行了正確區分,代碼如下:
/** * 6.0獲取外置sdcard和U盤路徑,并區分 * @param mContext * @param keyword SD = "內部存儲"; EXT = "SD卡"; USB = "U盤" * @return */ public static String getStoragePath(Context mContext,String keyword) { String targetpath = ""; StorageManager mStorageManager = (StorageManager) mContext .getSystemService(Context.STORAGE_SERVICE); Class<?> storageVolumeClazz = null; try { storageVolumeClazz = Class.forName("android.os.storage.StorageVolume"); Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList"); Method getPath = storageVolumeClazz.getMethod("getPath"); Object result = getVolumeList.invoke(mStorageManager); final int length = Array.getLength(result); Method getUserLabel = storageVolumeClazz.getMethod("getUserLabel"); for (int i = 0; i < length; i++) { Object storageVolumeElement = Array.get(result, i); String userLabel = (String) getUserLabel.invoke(storageVolumeElement); String path = (String) getPath.invoke(storageVolumeElement); if(userLabel.contains(keyword)){ targetpath = path; } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return targetpath ; }
這里拿到的userLabel就是系統給每個盤的一個label,用來區分是內部存儲、sdcard還是U盤,內卡的label固定,但是sdcard和U盤的label是根據種類,狀態等信息等動態生成,所以這里“if(userLabel.contains(keyword)){”沒有用equals。
總結:不懂看源碼
以上這篇Android 6.0上sdcard和U盤路徑獲取和區分方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。