背景

当应用数据很多时就需要进行备份了,不然当应用一被卸载,所有数据都将会丢失,那将是很麻烦的一件事,而备份,可以备份在本地或云端两种方式,本地仍会有被不小心删除的风险,而且不同设备之间数据同步也是很麻烦,而云端就需要架设一个稳定运行的服务器才行,这显然将是一笔不小的开支,那有没有兼顾两者优点的方案呢,WebDav就应运而生了。

环境

  • AndroidStudio3.+

具体步骤

  • 引用开源库sardine-android依赖
dependencies {//需要替换okhttp3版本,以去除kotlin库,当然若是需要kotlin就不用替换了implementation('com.thegrizzlylabs.sardine-android:sardine-android:0.5'){exclude group: 'com.squareup.okhttp3'}implementation 'com.squareup.okhttp3:okhttp:3.8.0'//需要排除xpp3,不然编译有问题,当然若是没问题就不用排除了configurations {all {exclude group: 'xpp3', module: 'xpp3'}}
}
  • 封装类
import com.thegrizzlylabs.sardineandroid.Sardine;
import com.thegrizzlylabs.sardineandroid.impl.OkHttpSardine;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;//本例仅实现了备份shared_prefs目录的数据
public class BackupManager {public static final String TAG = "BackupManager";public static final String DIALOG_BETA_BACKUP_DIR = "cloud_backup_dir/";public static final String DEF_SERVER= "https://dav.jianguoyun.com/dav/";//备份到坚果云webDevpublic static boolean backupToWebDav(String server, String userName, String password) {//init webDevSardine sardine = new OkHttpSardine();sardine.setCredentials(userName, password);//zip dataFile outFile = new File(App.context.getCacheDir(), "backup.zip");if (outFile.exists()) outFile.delete();File inFiles[] = new File(App.context.getCacheDir().getParentFile(), "shared_prefs").listFiles();if (inFiles == null || inFiles.length <= 0) return false;boolean result = ZipUtil.zipFiles(inFiles, outFile);if (!result) return false;if (!outFile.exists() || !outFile.canRead() || outFile.length() <= 0) return false;//upload datatry {if (!sardine.exists(server+DIALOG_BETA_BACKUP_DIR)) {sardine.createDirectory(server+DIALOG_BETA_BACKUP_DIR);}sardine.put(server+DIALOG_BETA_BACKUP_DIR+ "backup.zip", outFile, "*/*");outFile.delete();Debug.LogI(TAG, "backup success");return true;} catch (IOException e) {e.printStackTrace();Debug.LogE(TAG, "backup failed");}return false;}//从坚果云恢复备份public static boolean restoreFromWebDav(String server, String userName, String password) {//init webDevSardine sardine = new OkHttpSardine();sardine.setCredentials(userName, password);//download backup dataFile outFile = new File(App.context.getCacheDir(), "backup.zip");if (outFile.exists()) outFile.delete();try {outFile.createNewFile();} catch (IOException e) {e.printStackTrace();}try {if (!sardine.exists(server+DIALOG_BETA_BACKUP_DIR)) return false;InputStream inputStream = sardine.get(server +DIALOG_BETA_BACKUP_DIR+ "backup.zip");OutputStream outputStream = new FileOutputStream(outFile);byte[] buf = new byte[1024];int n = 0;while ((n = inputStream.read(buf)) > 0) {outputStream.write(buf, 0, n);outputStream.flush();}outputStream.close();inputStream.close();File in=outFile;File outDir = new File(App.context.getCacheDir().getParentFile(), "shared_prefs");ZipUtil.upZipFile(in,outDir.getPath());Debug.LogI(TAG, "restore success");return true;} catch (IOException e) {e.printStackTrace();Debug.LogE(TAG, "restore failed");return false;}}
}
  • 调用
 boolean isSuccess = BackupManager.restoreFromWebDav(mServer, mUsername, mPassword);
boolean isSuccess = BackupManager.backupToWebDav(mServer, mUsername, mPassword);

推荐WebDev服务商

  • 1.坚果云

Android开发之WebDav相关推荐

  1. android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

    android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序   在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...

  2. Android开发之TextView高级应用

    Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...

  3. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  4. android注册弹窗,Android开发之PopupWindow创建弹窗、对话框的方法详解

    本文实例讲述了Android开发之PopupWindow创建弹窗.对话框的方法.分享给大家供大家参考,具体如下: 简介: PopupWindow 可创建类似对话框风格的窗口 效果: 使用方法: 使用P ...

  5. Android开发之旅:组件生命周期(二)

    引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  6. Android开发之SpannableString具体解释

    在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...

  7. Android开发之2048安卓版

    之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...

  8. android语音播放工具类,Android开发之MediaPlayer多媒体(音频,视频)播放工具类

    本文实例讲述了Android开发之MediaPlayer多媒体(音频,视频)播放工具类.分享给大家供大家参考,具体如下: package com.android.imooc.chat; import ...

  9. Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)

    鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio  Android Studio 是一个Android开发环境,基于Intel ...

  10. Android开发之JNI(一)--HelloWorld及遇到的错误解析

    Android开发之JNI(一)--HelloWorld及遇到的错误解析 1.NDK环境搭建 參考http://blog.csdn.net/xiaoliouc/article/details/8705 ...

最新文章

  1. android 封装的popwindow,Android UI开发 popupwindow介绍以及代码实例
  2. 不要在 Spring Boot 集成测试中使用 @Transactional
  3. 埋点全解 2:iOS 应用程序状态
  4. Spring容器创建过程
  5. Add a All Document Folder
  6. 指针,指针函数,指针数组的区别
  7. ORACLE RAC如何增加节点
  8. 【数据结构】--章节2.2----线性表的顺序表示和实现
  9. html代码替换正则:把lt;ssgt;lt;img src=quot;aquot; data=quot;bquot;gt;lt;/ssgt;换成lt;img src=b /gt;
  10. R语言绘制bivariate polar plots
  11. JetBrains提示我“No suitable licenses associated with account balabala”
  12. java-net-php-python-jsp学生社团信息演示录像2019计算机毕业设计程序
  13. SQL索引碎片监控看板——C#编写辅助程序员运维的工具
  14. 一次惨痛的线下机房上云的经历
  15. 公交线路查询系统 C++实现 图
  16. C++-STL-组件(一)-容器05:stack(栈)
  17. Ios热更新,实时代码更新,动态更新,动态库framework
  18. overthewire靶场之——bandit(1-10)
  19. SugarCRM 自定义选择按钮
  20. 比较知名的外包系统软件开发公司有哪些是哪个

热门文章

  1. Autovue Client/Server 部署时的连接问题及诊断策略
  2. 女程序员未来的职场出路在哪里?
  3. uni-app升级后图片上传至阿里云OSS报403错误
  4. Error: Cannot find module ‘babel-preset-es2015‘
  5. 盛年不重来、一日难再晨
  6. Switch语句:空指针异常
  7. 谢烟客---------Linux之find查找
  8. perfmon的使用及性能分析
  9. 如何将自己开发的网站部署到小鸟云服务器上?
  10. C++中自带的二分查找函数