qian-jiahong / Android-WebDav

关于WebDav使用的一系列操作实例

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

WebDav-For-Android

关于WebDav使用的一系列操作实例 掘金文章地址:传送门

先上图上链接

Demo效果图

前言

我自己对数据存取有需求,所以研究了几天最终决定存在坚果云。
因为坚果云免费的,支持WebDav,用来存取用户数据确实是不错的,在开发之前网上找到的关于资料很少,通过查看其他相同需求软件最后找到了sardine这个项目,项目地址:传送门

一、开始前的配置

1. 添加依赖库

查看最新版本号:传送门

dependencies {
    ...
    implementation 'com.thegrizzlylabs.sardine-android:sardine-android:最新版本号'
}

2. 添加各种权限

    <!-- 网络权限 -->
    <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" />

这里有两个坑
安卓9以上的网络安全策略:谷歌官方文档
安卓10沙箱限制:谷歌官方文档

解决办法:

右键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");

获取WebDav中的文件

    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中出现什么问题,欢迎大家及时指正。

About

关于WebDav使用的一系列操作实例


Languages

Language:Java 100.0%