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的設定。