WebDav是什么?
WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。
上面是来自百度百科的介绍。从个人理解是:安卓开发有时候并不是一个完整的系统,即没有账号系统,没有必要特地去写一个后台搭建一个数据库来维护这些数据。然而诸如笔记、日程等数据,应用不能很好地保存就显得很不人性化。而WebDav就像github一样,应用可以将数据托管在上面,更新数据就上传,恢复数据就下拉,方便安全,对于个人开发者无疑是一个很好的选择。
那么,开发者该如何接入WebDav呢?
期间我写了一篇关于WebDav for Android文章,由于sardine是需要多线程来执行的,会写许多重复代码,因此就萌生了把代码封装成一个库直接调用的想法。
关于WebDav的配置可以参考http://help.jianguoyun.com/?tag=webdav
如何食用
implementation 'com.paul623.wdsyncer:wdsyncer:0.0.4'
兼容性
安卓P及以上需要配置网络安全策略
android:usesCleartextTraffic="true"
接口
目前版本是0.0.3,已经实现的功能
/**
* 上传文件
* @param fileName 文件名 包含后缀名
* @param fileLoc 文件目录 如:homeLoc/
* @param listener 返回信息为 文件路径,上传成功
* */
public void uploadFile(String fileName, String fileLoc, File f, OnSyncResultListener listener);
/**
* 上传String类型数据
* 你可以直接把文件格式设置为txt即可
* @param fileName 文件名 包含后缀名
* @param fileLoc 文件目录 如:homeLoc/
* @param listener 返回信息为 文件路径,上传成功
* */
public void uploadString(String fileName, String fileLoc, String content, OnSyncResultListener listener);
/**
* 下载文件
* @param listener 返回的是文件保存路径
* 默认保存路径在:应用的私有路径下
* */
public void downloadFile(String fileName, String fileLoc, OnSyncResultListener listener);
/**
* 下载文件
* @param listener 返回的是内容
* */
public void downloadString(String fileName, String fileLoc, OnSyncResultListener listener);
/**
* 列出所有文件信息
* @param listFileListener 具体参看DavData
* */
public void listAllFile(String dir, OnListFileListener listFileListener);
/**
* 删除文件
* @param fileDir 文件目录
* */
public void deleteFile(String fileDir, OnSyncResultListener listener);
使用示例
1.配置账户信息
请提前通过SyncConfig来配置相关信息(账户、密码、服务器地址)(否则会报错)
服务器地址可以不用配置,默认为坚果云
SyncConfig config=new SyncConfig(context);
config.setPassWord("你的密码");
config.setUserAccount("你的账户");
2.调用并回调
由于所有操作都必须在线程中执行,故你需要自行处理线程操作,这里以上传为例。
SyncManager syncManager=new SyncManager(MainActivity.this);
syncManager.uploadString("test.txt", "WDSyncer", "如你所见,WebDavSyncer已经配置成功!", new OnSyncResultListener() {
@Override
public void onSuccess(String result) {
//成功
Looper.prepare();
Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
Looper.loop();
}
@Override
public void onError(String errorMsg) {
//失败
Looper.prepare();
Toast.makeText(MainActivity.this,errorMsg,Toast.LENGTH_SHORT).show();
Looper.loop();
}
});
或者你可以使用Handler来控制。
3.配置加密解密方式
💡0.0.4新增
如需要自己实现加密解密方式,请实现Encryption接口
public interface Encryption {
//加密
public String encode(String key);
//解密
public String decode(String password);
}
如
public class ExampleEncryption implements Encryption {
@Override
public String encode(String key) {
return key+"&";
}
@Override
public String decode(String password) {
return password.split("&")[0];
}
}
在配置的时候使用
SyncConfig config=new SyncConfig(this,new DefaultEncryption());
同时,对应的SyncManager
SyncManager syncManager=new SyncManager(this,new DefaultEncryption());
特别注意:SyncConfig传入Encryption后对应的SyncManager必须传入相同的Encryption,否则会抛出异常或者登录失败。
常见的出错类型
1.请求失败:出错了,javax.net.ssl.SSLHandshakeException: Chain validation failed
这个一般是手机的时间不对,导致握手失败。请检查模拟器或者手机的时间设置是否和当地地区时间相同
2.请求失败:出错了,com.thegrizzlylabs.sardineandroid.impl.SardineException: Error contacting https://dav.jianguoyun.com/dav/WDSyncer (401 )
这个是账户用户名或者密码不正确
3.Unable to start activity ComponentInfo{com.paul.webdavsyncerdemo/com.paul.webdavsyncerdemo.MainActivity}: java.lang.RuntimeException: 请配置Encryotion
这是由于你在SyncConfig中设置了Encryption而在SyncManager中没有设置
4.java.lang.RuntimeException: Unable to start activity ComponentInfo{com.paul.webdavsyncerdemo/com.paul.webdavsyncerdemo.MainActivity}: java.lang.RuntimeException: Config中未配置Encryotion
这是由于你在SyncConfig没有配置Encryption而在SyncManager中设置了
更多例子请查看项目代码 https://github.com/paul623/WebDavSyncerDemo
欢迎star❤