TShopping

 找回密碼
 註冊
搜索
查看: 2655|回復: 0
打印 上一主題 下一主題

[教學] Android 4↑ 獲取內外置儲存裝置(卡)路徑方法

[複製鏈接]
跳轉到指定樓層
1#
發表於 2015-10-3 23:36:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
以前的Andr​​oid(4.1之前的版本)中,SDcard跟路徑通過“/sdcard”或者“/mnt/sdcard”來表示存儲卡,而在Jelly Bean系統中修改為了“/storage/sdcard0”,以後可能還會有多個SDcard的情況。
目前為了保持和之前代碼的兼容,sdcard路徑做了link映射。
為了使您的代碼更加健壯並且能夠兼容以後的Android版 ​​本和新的設備,請通過Environment.getExternalStorageDirect ory().getPath()來獲取sdcard路徑,
如果您需要往sdcard中保存特定類型的內容,可以考慮使用Environment.getExternalStoragePublic Directory(String type)函數,該函數可以返回特定類型的目錄,目前支持如下類型:
DIRECTORY_ALARMS //警報的鈴聲
DIRECTORY_DCIM //相機拍攝的圖片和視頻保存的位置
DIRECTORY_DOWNLOADS //下載文件保存的位置
DIRECTORY_MOVIES //電影保存的位置,比如通過google play下載的電影
DIRECTORY_MUSIC //音樂保存的位置
DIRECTORY_NOTIFICATIONS / /通知音保存的位置
DIRECTORY_PICTURES //下載的圖片保存的位置
DIRECTORY_PODCASTS //用於保存podcast(博客)的音頻文件
DIRECTORY_RINGTONES //保存鈴聲的位置
如果您的應用需要下載以上類型的文件,則可以放到上面對應的目錄中去來幫助用戶查找,比如最常用的就是下載文件了。如果您開發了一個瀏覽器,在下載文件的時候把文件下載到Download目錄則方便用戶以後查找該文件,當然如果你希望用戶需要通過啟動您的程序來查看他們下載的文件,您也可以不這麼做^_^。 在使用這些目錄保存文件的時候,需要注意一點:其他程序也有可能在使用這些目錄,在保存文件前,注意判斷下文件是否已經存在,不要覆蓋了用戶之前的數據。

Android4.1之後Android增加了多存儲卡的支持,一般手機會存在內置存儲卡和外置存儲卡,也可能有多個外置存儲卡。如何獲取存儲卡路徑呢?
特別是各種android設備的存儲器路徑,是不一樣的,比如T卡路徑,可能是/mnt/sdcard、/mnt/extsd、/mnt/external_sd 或者/mnt/sdcard2。有時內置存儲器的路徑也可能是/mnt/sdcard,而host usb存儲器的路徑也是各種各樣的。
下面方法是通過反射,調用StorageManager的隱藏接口getVolumePaths(),實現獲取存儲器列表。

  1. package ckl.storage.list;

  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. import android.app.Activity;
  5. import android.os.storage.StorageManager;

  6. public class StorageList {
  7. private Activity mActivity;
  8. private StorageManager mStorageManager;
  9. private Method mMethodGetPaths;

  10. public StorageList(Activity activity) {
  11. mActivity = activity;
  12. if (mActivity != null) {
  13. mStorageManager = (StorageManager)mActivity
  14. .getSystemService(Activity.STORAGE_SERVICE);
  15. try {
  16. mMethodGetPaths = mStorageManager.getClass()
  17. .getMethod("getVolumePaths");
  18. } catch (NoSuchMethodException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. }

  23. public String[] getVolumePaths() {
  24. String[] paths = null;
  25. try {
  26. paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
  27. } catch (IllegalArgumentException e) {
  28. e.printStackTrace();
  29. } catch (IllegalAccessException e) {
  30. e.printStackTrace();
  31. } catch (InvocationTargetException e) {
  32. e.printStackTrace();
  33. }
  34. return paths;
  35. }
  36. }
複製代碼



在android2.3中,判斷內置SD卡是否掛載:
  1. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
  2.   //為true的話,內置sd卡存在
  3. }
複製代碼

判斷外置SD卡是否掛載:
順帶描述怎麼取得sdcard的空間大小,

  1. File sdcardDir = Environment.getExternalStorageDirectory();
  2. StatFs sf = new StatFs(sdcardDir.getPath()); //sdcardDir.getPath())值为/mnt/sdcard,想取外置sd卡大小的话,直接代入/mnt/sdcard2
  3. long blockSize = sf.getBlockSize(); //總大小
  4. long blockCount = sf.getBlockCount();
  5. long availCount = sf.getAvailableBlocks(); //有效大小
複製代碼


 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-29 12:58 , Processed in 0.097376 second(s), 22 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表