一、下载路径的设置和获取。
(1)request.setDestinationInExternalFilesDir(context, dirType, subPath);
(2)request.setDestinationInExternalPublicDir(dirType, subPath)
方式(1)是设置下载文件路径到存储的外部路径,context.getExternalFilesDir(dirType)获取到文件路径
具体路径:/storage/emulated/0/Android/data/(应用包名)
方式(2)设置下载文件路径到外部存储的公共目录,其实也就是SD卡的根目录,Environment.getExternalStorageDirectory().getAbsolutePath()/文件路径名/文件名。
注:1、两种方式容易误解成(1)是存储到系统/data/tata 路径下面。
2、如果用外部公共存储路径,需要判断路径是否存在,否则路劲不存在会抛异常
File folder = Environment.getExternalStoragePublicDirectory(DOWNLOAD_FOLDER_NAME);
if (!folder.exists() || !folder.isDirectory()) {
folder.mkdirs();
}
二、系统下载器禁用
由于Android系统的开源性,用户可以在系统设置-应用-找到系统下载器,禁用系统下载器,如果系统下载器禁用代码不做处理的话,
downloadManager.enqueue(request) 会抛系统异常。
解决方案:跳转到系统设置页,让用户开启下载器。
//判断系统下载管理器是否开启
int state = getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads");
if(state==PackageManager.COMPONENT_ENABLED_STATE_DISABLED||
state==PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
||state==PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED){//不可用
}else{
}
但是在实际的测试过程中,用户打开下载器需要重启才能生效,不然会卡在downloadManager.enqueue(request),暂时没有找到问题的原因。
三、下载完成广播接收处理
建议使用静态注册方式注册广播接收器。
动态注册:开始下载的时候注册,下载完成注册。下载过程中可能会因为某些原因导致下载不成功,这个时候广播接收器就不会去注册,
这样会导致广播接收器重复注册。