【Android】WebDavForAndroid

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【Android】WebDavForAndroid 最近在写⼀个云备份功能,参考了⼀下市⾯上的软件,发现有⼀种采⽤WebDav协议的云备份成本⽐较低,故特地研究⼀下使⽤。

服务器提供商是使⽤国内的坚果云,还是⾮常良⼼的。

注册账号后,点击账户信息,安全选项中即可看到第三⽅应⽤管理
拿到数据后,我们就可以开始进⾏安卓开发了。

依赖以及权限设置
因为涉及到⽹络,所以需要在Manifests中设置联⽹权限:
<uses-permission android:name="android.permission.INTERNET" />
同时注意安卓9.0以上的⽹络安全策略,需要单独配置⼀下:
在res新建⼀个 network_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
接着在Manifests的application中配置:
android:networkSecurityConfig="@xml/network__config"
webDav⽹上的教程不是特别多,⼀开始找到的是 lookfirst/sardine
该项⽬是使⽤的HttpClient且和安卓部分依赖有些冲突,所以不推荐直接使⽤
后来在github中找到⼀个移植到安卓的sardine,
经过测试可以直接使⽤。

implementation 'com.thegrizzlylabs.sardine-android:sardine-android:0.5'
当然你也可以直接翻到⽂末查看我提供的对sardine的⼆次封装库,使⽤起来更⽅便。

基础使⽤⽅法
请注意:以下所有⽅法都必须在新线程中进⾏,且对UI的直接操作要放回主线程进⾏,可以考虑使⽤Handler
初始化
Sardine sardine= new OkHttpSardine();
sardine.setCredentials(userName,password);
这⾥的userName,password即你的⽤户账号+分配的应⽤的所属密码
获取⽬录下所有⽂件
List<DavResource> resources = null;
try {
resources = sardine.list("https:///dav/");//如果是⽬录⼀定别忘记在后⾯加上⼀个斜杠for (DavResource res : resources)
{
listNames=listNames+res+"\n";
}
} catch (IOException e) {
e.printStackTrace();
}
判断路径(或⽂件)是否存在
//判断⽂件是否存在
if (sardine.exists("https:///dav/file1.jpg"))
System.out.println("got here!");
//判断路径是否存在
if (sardine.exists("https:///dav/file/"))
System.out.println("got here!");
若⽬录不存在,可以⾃⼰创建:
sardine.createDirectory("https:///dav/
⽬录名称/");
下载⽂件
InputStream is = sardine.get("https:///dav/"+"⽂件⽬录"+"afile.jpg");
上传⽂件
byte[] data = FileUtils.readFileToByteArray(new File("/file/on/disk"));
sardine.put("/adirectory/nameOfFile.jpg", data);
或者使⽤
InputStream fis = new FileInputStream(new File("/some/file/on/disk.txt"));
sardine.put("/adirectory/nameOfFile.jpg", fis);
节省内存空间
删除⽂件
sardine.delete("/adirectory/nameOfFile.jpg");
综合例⼦
这⾥给出⼀个简单的例⼦,可以把这些代码统⼀封装成⼀个类
/**
* 同步管理器
* SyncManager(Context context)
* getCloudFiles(final Handler handler) 获取⽂件
* public void upDate(final Handler handler) 更新⽂件
* */
public class SyncManager {
private String serverHostUrl;//WebDav服务器地址,坚果云为:https:///dav/ private String userName;//⽤户名
private String password;//密码
private Sardine sardine;
private Context context;
private SettingManager settingManager;
public SyncManager(Context context){
this.context=context;
//初始化设置,主要是获取⽤户设定的服务器地址、⽤户名和密码
settingManager=new SettingManager(context);
serverHostUrl=settingManager.getUserServer();
userName=settingManager.getUsername();
password=settingManager.getPassword();
//初始化sardine,使⽤OkHttpSardine进⾏实例化
sardine=new OkHttpSardine();
}
/**
* 更新数据(即上传数据)
* @param counterEvents 数据源
* @param handler 线程回调
* */
private void updateFiles(List<CounterEvent> counterEvents,Handler handler){
sardine.setCredentials(userName,password);//设置登录账号,登录
//⾃⼰规定⼀种数据格式,这⾥⾯我采⽤的是json
Gson gson=new Gson();
String jsons=gson.toJson(counterEvents);
//把要上传的数据转成byte数组
byte[] data=jsons.getBytes();
try {
//⾸先判断⽬标存储路径⽂件夹存不存在
if(!sardine.exists(serverHostUrl+"pickTime/")){
//若不存在需要创建⽬录
sardine.createDirectory(serverHostUrl+"pickTime/");
}
//存⼊数据
sardine.put(serverHostUrl+"pickTime/backup.txt",data);
//通知主线程进⾏下⼀步操作
Message message=new Message();
message.what=1;
handler.sendMessage(message);
} catch (IOException e) {
Message message=new Message();
message.what=-1;
message.obj=e;
handler.sendMessage(message);
Log.d("啥情况",e.toString());
e.printStackTrace();
}
}
/**
* 封装的更新⽅法
* @param handler 回调
* */
public void upDate(final Handler handler){
if(userName.equals("")||password.equals("")){
(context,"请设置账号",Toasty.LENGTH_SHORT).show();
Intent intent=new Intent(context, SettingActivity.class);
context.startActivity(intent);
}else {
//开启线程进⾏执⾏操作
new Thread(new Runnable() {
@Override
public void run() {
updateFiles(Manager.getAllCounterEvents(context),handler);
}
}).start();
}
}
/**
* 封装的获取⽂件⽅法
* @param handler 回调
* */
public void getCloudFiles(final Handler handler){
if(userName.equals("")||password.equals("")){
(context,"请设置账号",Toasty.LENGTH_SHORT).show();
Intent intent=new Intent(context, SettingActivity.class);
context.startActivity(intent);
}else {
(context,"恢复中",Toasty.LENGTH_SHORT).show();
new Thread(new Runnable() {
@Override
public void run() {
getFiles(handler);
}
}).start();
}
}
/**
* 获取⽂件
* @param handler 回调
* */
private void getFiles(Handler handler){
sardine.setCredentials(userName,password);//登录。

设置账号
try {
//拿到输⼊流
InputStream inputStream=sardine.get(serverHostUrl+"pickTime/backup.txt");
//设置输⼊缓冲区
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); // 实例化输⼊流,并获取⽹页代 String s; // 依次循环,⾄到读的值为空
StringBuilder sb = new StringBuilder();
while ((s = reader.readLine()) != null) {
sb.append(s);
}
reader.close();
String str = sb.toString();
//TODO 这⾥放你的处理逻辑,或者由handler传送给相应处理
Message message=new Message();
message.what=2;
handler.sendMessage(message);
} catch (IOException e) {
Message message=new Message();
message.what=-2;
message.obj=e;
handler.sendMessage(message);
e.printStackTrace();
}
}
}
封装库
implementation 'com.paul623.wdsyncer:wdsyncer:0.0.1'
具体功能及实现请查看github。

相关文档
最新文档