关于WebDav使用的一系列操作实例 掘金文章地址:传送门
我自己对数据存取有需求,所以研究了几天最终决定存在坚果云。
因为坚果云免费的,支持WebDav,用来存取用户数据确实是不错的,在开发之前网上找到的关于资料很少,通过查看其他相同需求软件最后找到了sardine这个项目,项目地址:传送门
查看最新版本号:传送门
dependencies {
...
implementation 'com.thegrizzlylabs.sardine-android:sardine-android:最新版本号'
}
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 文件读写权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
右键res文件夹新建一个目录选择xml
之后右键xml文件夹新建一个名为network_security_config.xml的xml文件(名字自己取一个)
在文件中输入
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">www.pgyer.com</domain>
<domain includeSubdomains="true">app-global.pgyer.com</domain>
</domain-config>
</network-security-config>
在AndroidManifest.xml文件中添加
<application
android:networkSecurityConfig="@xml/network_security_config"
...
解决第二个坑,文件访问限制 在AndroidManifest.xml文件中添加
<application
android:requestLegacyExternalStorage="true"
...
接下来去申请WebDav的账号用来测试
坚果云:点击进入
进去注册完成之后,点击右上角账户信息
我们需要拿到的三个信息: 服务器地址 账号 密码
把这三样保存一下,待会儿测试用
注:必须在新线程中执行操作
我的方法是写一个类继承AsyncTask操作,逻辑操作看demo
Sardine sardine = new OkHttpSardine();//实例化
sardine.setCredentials(账号, 密码);
//通过判断文件夹是否存在去判断是否连接成功,如果错误会抛出异常 返回false
//会在WebDav中新建一个名为Test的文件夹
if (!sardine.exists("https://dav.jianguoyun.com/dav/Test/")) {
//不存在目录即创建
sardine.createDirectory("https://dav.jianguoyun.com/dav/Test/");
}
if (sardine.exists("https://dav.jianguoyun.com/dav/Test/Test.apk")) {
//文件存在
}
if (sardine.exists("https://dav.jianguoyun.com/dav/Test/")) {
//文件夹存在
}
if (sardine.exists("https://dav.jianguoyun.com/dav/Test/Test.apk")) {
//YourCode
//如果同名文件存在
Log.e("isHava:", fileName);
} else {
//第一个参数是webdav的存放路径,第二个参数是本机文件路径,第三个http请求头
sardine.put("https://dav.jianguoyun.com/dav/Test/Test.apk", new File(filePath), "application/x-www-form-urlencoded");
}
InputStream fis = sardine.get("https://dav.jianguoyun.com/dav/Test/Test.apk");//服务器上的文件名字
FileOutputStream fos = new FileOutputStream("/storage/emulated/0/Test.apk");//下载的路径
int len = -1;
byte[] buffer = new byte[1024];
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();//关闭输入输出流
sardine.delete("https://dav.jianguoyun.com/dav/Test/Test.apk");
List<DavResource> resources = null;
resources = sardine.list("https://dav.jianguoyun.com/dav/Test/");//后面需斜杠
for (DavResource res : resources) {
//YourCode
Log.e("WebDavFile:", res.toString());//获取webdavDir文件夹内的文件名字
//格式为/dav/Test/Test.apk
}
//分隔字符串"/",获取长度-1为文件名字,可以直接在上一步中处理出来
filePath.split("/")[filePath.split("/").length - 1];//根据路径获取文件名
下图将文件列表写入适配器列表中,在子线程中无法刷新UI,子线程可以通过Handler来将UI更新操作切换到主线程中执行,具体操作看Demo
据我的查找国内支持 WebDAV 协议的网盘只有坚果一家,每月有 1GB 的上传流量和 3GB 的下载流量,对于我来说存储数据完全够用
再此之前自己写了一个我自己有需求的软件,用来备份整个文件夹的
感谢各位的阅读,因为本人学习安卓时间并不长,文章中和Demo中出现什么问题,欢迎大家及时指正。