相册自动备份功能详细设计 - Logan676/seadroid GitHub Wiki

功能描述

  • 用户可以选择是否打开相册备份功能
  • 打开相册备份功能后,检测网络设置,只有wifi网络下才允许自动备份相册
  • 如果用户登录了多个seafile账户,备份相册前,需要选择备份到某个账户的某个library里,点击确定按钮,开始自动备份相册。
  • 备份相册的过程中用户可以继续使用seafile应用中的其他功能
  • 用户新拍摄的照片同样会自动备份到指定的账户的指定library里面
  • 如果在关闭seafile应用的情况下,用户拍摄了新的照片,当再次打开seafile应用的时候,新增的照片同样会自动备份到用户事先指定的账户和library中
  • 相册备份过程中,用户会收到备份状态的提示信息,如备份开始,备份是否成功,备份了多少张相片,备份完成等信息
  • 用户可以关闭相册备份的功能

#难点

当用户拍了新照片,怎么检测到新拍的照片

可选方案

  • Content Providers配合Content Observers来检测用户新拍摄的照片,参考资料
    遇到的难题:相机拍摄一张照片后onChange方法被调用不止一次,另外当照片被删除后该方法也会被调用,如果在onchange方法里面添加照片上传的代码的话,可能会出现重复上传的问题,当照片被删除后可能错误地上传上一张照片。

  • 利用广播接收器来监听拍照的动作事件,参考资料
    遇到的难题:事件不容易被捕获到

  • 使用FileObserver监听相机存放照片的那个文件夹,参考资料
    遇到的难题:该方案要求应用必须一直在后台运行,而且只能监听某个特定的文件夹,不灵活,适用性很差
    补救措施:使用Media.EXTERNAL_CONTENT_URI这个常量值可以监听到SD卡上的所有改动事件,然后可以筛选出新增图片的事件并做处理

  • 其他参考资料

如果用户拍照的时候没有运行 seafile, 下次启动的时候怎么处理这一情况 (解决方案:本地数据库 + service)

  1. 用户打开备份功能,即打开了相应的后台服务,后台服务会伴随应用的启动而启动,随应用的关闭而关闭。后台服务负责扫描本地图片并自动上传到指定的账户和指定的library中。与此同时,把已经上传的图片信息存储到本地数据库。
  2. 用本地数据库来保证不重复备份,每次把已经上传的图片信息保存在本地数据库中。
  3. 每次上传新的图片前去数据库查找,无结果的图片才可以添加到上传队列。
  4. 应用被关闭并再次启动时,后台服务重新扫描本地图片,在保证不重复备份的前提下,自动备份新增的图片到服务器。

技术模块

  1. 后台服务启动和关闭
  2. 数据库存储和读取
  3. 用户设置信息(备份打开or关闭,账户&library)的保存和读取
  4. 图片异步加载,上传
  5. UI

选择的技术方案

  1. 使用android架构提供的SyncAdapter类承担相册备份的功能。
  2. SyncAdapter需要的辅助类有,Service,AccountAuthorization, ContentProvider等

一些疑问

  1. a Service that runs all the time, which is a bad practice and a bad idea in general.
  2. Sync adapters run asynchronously, so you should use them with the expectation that they transfer data regularly and efficiently, but not instantaneously. If you need to do real-time data transfer, you should do it in an AsyncTask or an IntentService.
⚠️ **GitHub.com Fallback** ⚠️