此处demo中下载的是zip文件
1.权限
访问网络权限,sd卡读写权限(Android6.0后读写权限需要动态申请):
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
需要动态申请读写权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
}
2.retrofit-rxjava实现网络请求
build.gradle中引入依赖库:
dependencies {
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.x.y'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}
RetrofitUtils.java
public interface RetrofitUtils {
@GET("/public.zip")
Call<ResponseBody> getZipFile();
}
RetrofitDownloadZipFile.java
/**
* 下载zip文件
* retrofit
* rxjava
* lamda
* 结合使用
* @param filePath
* @param name
*/
public void DownloadZipFile(String filePath,String name) {
//网络请求超时
OkHttpClient client = new OkHttpClient.Builder().
connectTimeout(10, TimeUnit.SECONDS).
readTimeout(5, TimeUnit.SECONDS).
writeTimeout(5, TimeUnit.SECONDS).build();
Observable.just(baseUrl)
.map(url ->{
Retrofit retrofit = new Retrofit.Builder().baseUrl(url).client(client).build();
RetrofitUtils retrofitUtils = retrofit.create(RetrofitUtils.class);
Call<ResponseBody> call = retrofitUtils.getZipFile();
retrofit2.Response<ResponseBody> response = call.execute();
return response.body();
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseBody>() {
@Override
public void accept(ResponseBody responseBody) throws Exception {
//网络请求成功,读取文件保存到sd卡
SaveZipFile(responseBody,filePath,name);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
/**
* 网络请求失败
* 具体可以自己实现
*/
}
});
}
保存文件到sd卡
/**
* 保存文件到sd卡
* @param zipData
* @param filePath
*/
private void SaveZipFile(ResponseBody zipData,String filePath,String name){
InputStream is = null;
byte[] buf = new byte[4096];
int len = 0;
FileOutputStream fos = null;
try {
is = zipData.byteStream();
long total = zipData.contentLength();
File file = new File(filePath, CheckFileUtil.getInstance().getNameFromUrl(name));
fos = new FileOutputStream(file);
long sum = 0;
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
sum += len;
int progress = (int) (sum * 1.0f / total * 100);
// 下载中,可以自行加入进度条
}
fos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
}
try {
if (fos != null)
fos.close();
} catch (IOException e) {
}
}
/**
* 下载完成。可以解压
* 如果是经过加密的zip包,先解密,再解压
*/
}
以上下载的过程就完成了
3.在保存到sd卡前需要检测文件夹是否存在,不存在则新建
/**
* 判断文件是否存在
* @param filePath zip下载到的文件夹路径名称
* @param zipfileName zip名称
*/
@SuppressLint("LongLogTag")
public void fileIsExists(String filePath, String zipfileName) {
try {
File downloadFile = new File(filePath);
if (!downloadFile.exists()) {
/**
* 文件夹不存在
* 创建文件夹
* 下载文件
*/
downloadFile.mkdirs();
RetrofitDownloadZipFile.getInstance().DownloadZipFile(filePath,zipfileName);//下载文件
}else if (downloadFile.exists()){
/**
* 文件夹存在
* 检测文件是否存在
* 若文件存在--->检测版本号--->是否需要更新资源(需要把旧的资源先删掉)
* 若文件不存在,则下载资源文件解压,并把压缩包删除
*/
File file = new File(filePath,getNameFromUrl(zipfileName));//zip解压后文件夹路径
if (!file.exists()){
//文件不存在,下载文件
RetrofitDownloadZipFile.getInstance().DownloadZipFile(filePath,zipfileName);//下载文件
}else if (file.exists()){
/**
* 文件存在,可以做显示操作等等
* 也可以做资源版本的检测更新
*/
}
}
}
catch (Exception e) {
e.printStackTrace();
Log.e("HttpDownUtil:fileIsExists",e.getMessage());
}
}
public String getNameFromUrl(String url) {
return url.substring(url.lastIndexOf("/") + 1);
}
然后在需要执行下载的地方调用就行了
CheckFileUtil.getInstance().fileIsExists(path,"/test.zip");
整个流程就是:
1.获取权限
2.检测文件夹是否存在。存在(下载),不存在(新建,再下载)
3.retrofit-rxjava网络请求
4.下载完成保存到sd卡
参考:
链接: https://blog.csdn.net/m0_37794706/article/details/88555188?utm_source=app
需要zip解压,加密,解密(AES)的代码可以私聊我!谢谢!
第一次写博客,如有不对的地方,望大神指点!谢谢!!