Android Native Browser下載存儲路徑選擇

Browser下載通過Controller.java中的onDownloadStart()調用DownloadHandler.java中的onDownloadStartNoStream()進行下載。下載任務則調用Android通用接口DownloadManager進行下載,下載內容的存儲位置,則在下載前進行設定。看如下函數:
(1) DownloadHandler.java

String mDownloadPath =BrowserSettings.getInstance().getDownloadPath(); // 這裏獲取獲取位置的函數,關鍵位置,待會分析
if(mDownloadPath.contains("sdcard1")) {
   if (! new File("/storage/sdcard1").canWrite()) {
       // 若是sdcard1,判斷是否有寫權限,沒有直接返回。
       // 這裏與SWAP機制和WRITE_MEDIA_STORAGE有關
       // ...
       return;
    }
}

sBrowserDownloadExt =Extensions.getDownloadPlugin(activity); // DefaultBrowserDownloadExt中的check...函數,只是打了一句log
if (sBrowserDownloadExt.checkStorageBeforeDownload(activity,
       mDownloadPath, contentLength)) {
   return;
}

// ...
try {
   // 這裏又獲取了一遍,爲什麼不用上面計算的mDownloadPath? 
   sBrowserDownloadExt.setRequestDestinationDir(
       BrowserSettings.getInstance().getDownloadPath(), request, filename,mimetype);
}//... catch{}

/*
public void setRequestDestinationDir(StringdownloadPath, Request request, String filename, String mimeType) {

   String dir = "file://" + downloadPath + File.separator +filename;
   Uri pathUri = Uri.parse(dir);
   // 這個存到Download數據庫中的COLUMN_FILE_NAME_HINT 字段,如果設置了此字段,
   // 則字段COLUMN_DESTINATION的值會被設爲DESTINATION_FILE_URI = 4,下載將會保存在hint所指的路徑。
   // 具體見setDestinationUri定義
   request.setDestinationUri(pathUri); 
}
*/

(2) 再來看BrowserSettings.getInstance().getDownloadPath()到底返回了什麼值
BrowserSettings.java

public String getDownloadPath() {
// 我們的項目會調用這個默認值
   return mPrefs.getString(PREF_DOWNLOAD_DIRECTORY_SETTING,getDefaultDownloadPathWithMultiSDcard()); 
}


public String getDefaultDownloadPathWithMultiSDcard(){
   // 我們的項目中,在Extensions.java中獲取的plugin是DefaultBrowserSettingExt();
   sBrowserSettingExt = Extensions.getSettingPlugin(mContext);
   return sBrowserSettingExt.getDefaultDownloadFolder();
}

(3) 再看DefaultBrowserSettingExt給我們返回了一個什麼值
DefaultBrowserSettingExt.java

public String getDefaultDownloadFolder() {

   String defaultDownloadPath = DEFAULT_DOWNLOAD_DIRECTORY;
   String defaultStorage = StorageManagerEx.getDefaultPath(); // 主要看這個返回什麼
   if (null != defaultStorage) {
       defaultDownloadPath = defaultStorage + DEFAULT_MY_FAVORITE_FOLDER; // DEFAULT_MY_FAVORITE_FOLDER這個常量我們改成了"/download"
    }
   return defaultDownloadPath;
}

(4) 再看StorageManagerEx返回的默認路徑是什麼?
StorageManagerEx.java

public static String getDefaultPath() {
   String path = STORAGE_PATH_SD1;
   boolean deviceTablet = false;
   boolean supportMultiUsers = false;

   try {
       path = SystemProperties.get(PROP_SD_DEFAULT_PATH); // 真相大白了,原來返回的是PROP_SD_DEFAULT_PATH這個屬性值,定義處PROP_SD_DEFAULT_PATH = "persist.sys.sd.defaultpath",這個屬性值就大有來頭了,就是在系統設置中默認存儲就是修改的該屬性值
       Log.i(TAG, "path=" + path);
    }

    // ...

   return path;
}

總上所述,Browser下載的路徑爲persist.sys.sd.defaultpath再加上Browser中DEFAULT_MY_FAVORITE_FOLDER的設定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章