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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值