標籤:SD卡
擷取手機裡所有存放裝置盤符,首先需要得到掛載在手機上的有哪些盤符,這裡需要用到一個被系統隱藏的方法,即StorageManager下的getVolumePaths()方法。具體通過反射得到。方法傳回值為字串數組,getVolumeList返回所有相關資訊 StorageVolume: mStorageId=131073 mPath=/storage/external //盤符(路徑) mDescriptionId=17040902 mPrimary=false mRemovable=true //是否可卸載,內建SD卡無法卸載,外置SD卡可以卸載,據此可判斷是否存在外置SD卡, //這樣在某些APP中可以將某些資料優先儲存到外置SD卡,最佳化儲存空間資源的分配。如相機 mEmulated=false //是否是內建SD卡 mMtpReserveSpace=0 mAllowMassStorage=true mMaxFileSize=0 mOwner=null mUuid=4041-5DA0 mUserLabel=null mState=mounted //是否已載入(可用)
public class StorageUtils { /* 擷取全部存放裝置資訊封裝對象 */ public static ArrayList<Volume> getVolume(Context context) { ArrayList<Volume> list_storagevolume = new ArrayList<Volume>(); StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); try { Method method_volumeList = StorageManager.class.getMethod("getVolumeList"); method_volumeList.setAccessible(true); Object[] volumeList = (Object[]) method_volumeList.invoke(storageManager); if (volumeList != null) { Volume volume; for (int i = 0; i < volumeList.length; i++) { try { volume = new Volume(); volume.setPath((String) volumeList[i].getClass().getMethod("getPath").invoke(volumeList[i])); volume.setRemovable((boolean) volumeList[i].getClass().getMethod("isRemovable").invoke(volumeList[i])); volume.setState((String) volumeList[i].getClass().getMethod("getState").invoke(volumeList[i])); list_storagevolume.add(volume); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } } else { Log.e("null", "null-------------------------------------"); } } catch (Exception e1) { e1.printStackTrace(); } return list_storagevolume; } /* 存放裝置資訊封裝類 */ public static class Volume { protected String path; protected boolean removable; protected String state; public String getPath() { return path; } public void setPath(String path) { this.path = path; } public boolean isRemovable() { return removable; } public void setRemovable(boolean removable) { this.removable = removable; } public String getState() { return state; } public void setState(String state) { this.state = state; } }}
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<StorageUtils.Volume> list_volume = StorageUtils.getVolume(this); for (int i=0;i<list_volume.size();i++){ Log.e(i+"","path:"+list_volume.get(i).getPath()+"----"+ "removable:"+list_volume.get(i).isRemovable()+"---"+ "state:"+list_volume.get(i).getState()); } }}
記得添加許可權:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
小辣椒4.4.4:
華為6.0:
發現外置SD卡路徑不一致,只怪手機廠商喜歡瞎折騰疼自以為創新。得到路徑以後就可以像手機內建的檔案系統瀏覽器一樣將手機所有檔案列出來。
不管是內建SD卡還是外置SD卡其實都是手機的外部儲存,手機的內部儲存和外部儲存共用同一個裝置。
內部儲存路徑:
所有安裝至手機的應用都會在data/data目錄下產生一個包名檔案夾,這個檔案夾就是內部儲存的路徑
應用只能在自己的包名檔案夾中讀寫檔案
使用路徑api讀寫檔案
getFilesDir()得到的file對象的路徑是data/data/包名/files
存放在這個路徑下的檔案,只要你不刪,它就一直在
getCacheDir()得到的file對象的路徑是data/data/包名/cache
存放在這個路徑下的檔案,是快取檔案,當記憶體不足時,有可能被刪除
系統管理應用介面的清除緩衝,會清除cache檔案夾下的東西,清除資料,會清除整個包名目錄下的東西
參考:Android 儲存
GitHub
CSDN
簡書
公眾號
QQ群
Android判斷是否存在外置SD卡(擷取手機所有存放裝置的路徑)