1. 程式人生 > >Android應用存儲路徑選擇方案的設計

Android應用存儲路徑選擇方案的設計

卸載 存儲 epub text form sd卡 sta 分析 可能

1方案設計
  在各種應用設計的需求裏,有可能涉及文件的存儲路徑的選擇問題。本文介紹Android應用中涉及允許選擇SD卡和手機存儲,初步設想的方案:(1)在手機安裝SD卡的情況下,優先選擇存儲在SD卡中,當用戶卸載SD卡、拔出SD卡以及用戶在設置中選擇使用手機存儲時,將選擇存儲在手機存儲中;(2)在手機未安裝SD卡的情況下,將存儲在手機存儲中,當用戶安裝入SD卡後,將主動選擇存儲在SD卡中。軟件流程如下圖所示。
技術分享

  具體的路徑如下:
SD卡:/storage/603E-5ED9/Movies/RecordVideo/
手機存儲:/storage/emulated/0/Movies/RecordVideo/
2.實施方案
1)獲取用戶設置中選擇的路徑
  本應用創建了SettingFragment,並將路徑選項用ListPreference實例化,在設置路徑時,供用戶在設置界面選擇相應的路徑。
  程序獲取用戶在設置中選擇的路徑,能通過獲取此時設置界面中路徑的選擇項來判斷此時的路徑。由於我們提供給用戶的只有2個選項:存儲在手機內存中和存儲在SD卡中。因此,在程序中使用布爾變量來判斷用戶是否選擇使用SD卡存儲視頻。具體代碼如下:

        SharedPreferences preferences = getSharedPreferences("recordscreensettings", MODE_PRIVATE);
        String typeView=preferences.getString(Config.ViewType, "0");
        String location=preferences.getString(Config.Location, "0");
        Log.v(tag, "location is "+location);
        if (location.equals("0")) {
            isUseSDcard
=true; Log.v(tag, "isUseSDcard is "+isUseSDcard); }else { isUseSDcard=false; Log.v(tag, "isUseSDcard is "+isUseSDcard); }

  可以通過判斷isUseSDcard的值獲取用戶當前在設置中選擇的路徑。
2)獲取手機中當前SD卡的掛載情況
  在獲取用戶在當前設置中選擇的存儲路徑的同時,必須確定的是當前手機的SD卡是否掛載。有下面的情況是有可能存在的:手機中沒有安裝SD卡,手機中安裝的SD卡沒有識別和用戶將SD卡卸載了。針對這種情況,我們在選擇路徑時應該判斷當前SD卡的掛載情況。我們創建一個StorageUtils類管理應用的存儲路徑,寫一個判斷當前SD卡的掛載情況的方法。代碼如下:

   public static boolean isSDCardExist(Context context, Object storageVolume) {
        boolean sdcardExist = isVolumeMounted(storageVolume);

        DebugLog.d(TAG, "isSDCardExist(): " + sdcardExist);

        return sdcardExist;
    }
     private static boolean isVolumeMounted(Object storageVolume) {
        boolean mountble = false;
        String storagePath = null;
        String state = null;
        try {
            if (null == storageVolume) {
                Log.d(TAG, "null == storageVolume failed in isVolumeRemoveble");
            }
            if (null == mStorageManager) {
                mStorageManager = mContext.getSystemService(Context.STORAGE_SERVICE);
            }
            storagePath = (String) storageVolume.getClass().getMethod("getPath").invoke(storageVolume);
            if (null == storagePath || 0 == storagePath.length()) {
                return false;
            }

            state = (String) mStorageManager.getClass().getMethod("getVolumeState", String.class)
                    .invoke(mStorageManager, storagePath);

            if (Environment.MEDIA_MOUNTED.equalsIgnoreCase(state)) {
                mountble = true;
            }
        } catch (Exception e) {
            Log.e(TAG, "Storage_Standard.isVolumeRemoveble()", e);
        }
        return mountble;
    }

  通過判斷isSDCardExist方法返回的布爾值判斷此時SD卡是否掛載。
3)對獲取存儲路徑進行有效的選擇
  對於路徑的選擇該應用只提供了2種選擇方式。當選擇SD卡成為視頻存儲的路徑時,必須滿足2個條件:

(1)用戶在設置界面選擇使用SD卡作為存儲路徑;

(2)使用SD卡存儲視頻時,SD卡掛載。通過上述分析,在獲取視頻存儲路徑時,應該對存儲路徑進行有效的選擇,也就是路徑選擇正確且路徑可用。

       if (isHaveSDcard&&isUseSDcard) {
            String pathSDStorage=storageUtils.getStorageDirectory(SdCardType.SDStorage);
            Log.v(tag, "pathSDStorage is "+pathSDStorage);
            pathstring=pathSDStorage;
        }else {
            String pathInternelStorage=storageUtils.getStorageDirectory(SdCardType.InternelStorage);
            Log.v(tag, "pathInternelStorage is "+pathInternelStorage);
            Log.v(tag, "the system of storage is"+Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).toString());
            pathstring=pathInternelStorage;
        }

4)創建視頻的文件名
  及時創建的文件應該給文件取一個合適的名稱,本應用是即時軟件,為了方便用戶區別存儲的文件,我們采用生成文件時的時間有關名稱。名稱格式如下:年-月-日_時_分_秒。

        SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd_hh_mm_ss");

        String date = "/myscreen_" + sDateFormat.format(new java.util.Date());
    

5)創建完整的視頻存儲路徑
  通過上述的步驟,我們就獲取到了文件的存儲路徑以及文件的名稱,接下來需要完成創建完整的文件存儲路徑。為了方便用戶在文件夾目錄下查找,不論在SD卡還是手機中存儲錄文件,我們將存儲的文件放置在../Movies/RecordVideo/(根據自己的應用取名)的文件夾下。具體代碼如下。

        sampleDir=new File(pathstring+File.separator+"Movies"+ File.separator + "RecordVideo/");
        if (!sampleDir.exists()) {
            sampleDir.mkdirs();
            Log.v(tag, "創建文件夾"+sampleDir.mkdirs());
        }
        SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd_hh_mm_ss");

        String date = "/myscreen_" + sDateFormat.format(new java.util.Date());
        Log.v(tag, "date=" + date);

        mVecordFile = new File(sampleDir.toString() + date + ".mp4");
        Log.v(tag, mVecordFile.toString());

3.總結
  我們在獲取存儲路徑時,應該充分考慮用戶在設置中的路徑選擇以及存儲路徑是否存在的情況。

Android應用存儲路徑選擇方案的設計