Android 中 視頻存儲路徑的一個方案

版權聲明:本文為博主原創文章,未經博主允許不得轉載。
在進行視頻的下載時,我們經常會面臨存儲路徑的選擇,選擇一個好的存儲路徑能對Android系統中的內存起到優化的作用。主流app下載路徑分析和常見的路徑選擇方案做以下總結:

以下提供以一個APP的視頻存儲路徑方案。具體方案的程序流程圖如下:

Android系統中數據存儲路徑概述:

主要分為兩大部分:內部存儲internal storage和 外部存儲external storage

內部存儲(internal storage)不是內存。內部存儲位于系統中很特殊的一個位置,如果你想將文件存儲于內部存儲中,那么文件默認只能被你的應用訪問到,且一個應用所創建的所有文件都在和應用包名相同的目錄下。當一個應用卸載之后,內部存儲中的這些文件也被刪除。從技術上來講如果你在創建內部存儲文件的時候將文件屬性設置成可讀,其他app能夠訪問自己應用的數據,前提是他知道你這個應用的包名,如果一個文件的屬性是私有(private),那么即使知道包名其他應用也無法訪問。 內部存儲空間十分有限,因而顯得可貴,另外,它也是系統本身和系統應用程序主要的數據存儲所在地,一旦內部存儲空間耗盡,手機也就無法使用了。所以對于內部存儲空間,我們要盡量避免使用。Shared Preferences和SQLite數據庫都是存儲在內部存儲空間上的。

存儲路徑:一般在data/data/包名/ 下的文件

外部存儲(external storage),我們很容易認為機身固有存儲是內部存儲,而擴展的T卡是外部存儲。比如我們任務16GB版本的Nexus 4有16G的內部存儲,普通消費者可以這樣理解,但是安卓的編程中不能,這16GB仍然是外部存儲。安卓的早期設備,那個時候的設備內部存儲確實是固定的,而外部存儲確實是可以像U盤一樣移動的。但是在后來的設備中,很多中高端機器都將自己的機身存儲擴展到了8G以上,他們將存儲在概念上分成了"內部internal" 和"外部external" 兩部分,但其實都在手機內部。

存儲路徑: / sd卡根目錄/Android/data/<包名>/ 下的文件,不同機型具體路徑有差異
2.對以上 APP流程圖的詳細分析
(1) 檢測sd卡是否存在及安裝

/**
* 某路徑的sd卡是否存在
* */
public static boolean isSdcardExist(Context context, String path) {
 boolean isSdcardExist = false;
 List<String> pathList = getExternalSdPath(context);
 if(!TextUtils.isEmpty(path) && path.equals(SDCARD_PATH)) {
    isSdcardExist = true;
 } else if(pathList != null && pathList.size() > 0) {
    for(int i = 0; i < pathList.size(); i++) {
       if(pathList.get(i).equals(path)) {
          isSdcardExist = true;
          break;
       }
    }
 }
 return isSdcardExist;
}

/**
 * sd卡是否安裝
 */
public static boolean isSDCardMounted() {
   return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}

在操作外部存儲時,要先判斷是否存在sd卡以及安裝好(已掛載),并添加如下權限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

(2) 檢測安裝的sd卡的個數
Android的外部存儲是sd卡,一般手機內部有一個內置sd卡,比如一款手機有16G內存,默認將機身內存的16G設置為內置SD卡,也就是手機自帶的。有的手機同時還支持外置sd卡插入,這樣通過Environment.getExternalStorageDirectory()方法獲取到的就是內置存儲卡的位置,我們還需要寫專門的方法獲取外置存儲卡的路徑。不過當今市場中配備micro SD存儲卡插槽的手機越來越少,即便是一直堅持這種設計的三星,今年的S6和S6 Edge也放棄了該功能,使用內置式存儲。還有極個別手機有多個sd卡(這里先不考慮)。

/**
 * 獲取手機中sd卡個數
 * */
private static int getSdcardCount(Context context) {
   int sdCount = 0;
   List<String> pathList = SDCardUtils.getExternalSdPath(context);
   if(SDCardUtils.isSDCardMounted()) {
      sdCount = 1;
      if(pathList != null && pathList.size() > 0) {
         sdCount = pathList.size() + 1;
      }
   } else {
      if(pathList != null && pathList.size() > 0) {
         sdCount = pathList.size();
      }
   }
   return sdCount;
}

(3) 獲取內置sd卡的路徑和剩余容量

 * sd卡路徑
 */
public final static String SDCARD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();
/**
 * 獲取sd卡剩余空間大小,單位為M
 * */
public static double getSdAvailStorage(Context context, String sdPath) {
   double availStorage = 0;
   if(isSdcardExist(context, sdPath)) {
      StatFs sf = new StatFs(sdPath);
      long blockSize = sf.getBlockSize(); 
      long availCount = sf.getAvailableBlocks();
      availStorage = availCount*blockSize/1024/1024;
   }
       return availStorage;
}

(3) 獲取外置sd卡的路徑

/**
 * 獲取外置SD卡路徑
 * 
 */
public List getExtSDCardPath()
{
   List lResult = new ArrayList();
   try {
      Runtime rt = Runtime.getRuntime();
      Process proc = rt.exec("mount");
      InputStream is = proc.getInputStream();
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr);
      String line;
      while ((line = br.readLine()) != null) {
         if (line.contains("extSdCard"))
         {
            String [] arr = line.split(" ");
            String path = arr[1];
            File file = new File(path);
            if (file.isDirectory())
            {
               lResult.add(path);
            }
         }
      }
      isr.close();
   } catch (Exception e) {
   }
   return lResult;
}

(3) 存儲到外置sd卡的有關問題
在Android4.4系統以后,將緩存路徑切換到外置sd卡的時候,則視頻不能下載。原因是 從Android4.4開始,google限制了第三方應用對外置sd卡的讀寫權限限制,讓 android向規范化的方向發展。如果要讀寫外置sd卡,只能在sd卡根目錄下的 Android/data/ 目錄來執行讀寫操作。因此一般不能也不建議存儲到外置sd卡。
(4) 新建video文件夾進行視頻存儲

    /**
    * android4.4后,SD 卡下載的系統目錄
    */
   public static String getSysDownLoadFolder(Context context, String path) {
      StringBuilder sb = new StringBuilder();
      sb.append("Android/data/").append(context.getPackageName()).append(path).toString();
      return sb.toString();
   }
}

/*
   * 在SD卡上創建目錄;
   */
public File createDIR(String dirpath) {
    File dir=new File(SDPATH+dirpath);
    dir.mkdir();
    return dir;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容