相册自动备份功能详细设计 - Logan676/seadroid GitHub Wiki
- 用户可以选择是否打开相册备份功能
- 打开相册备份功能后,检测网络设置,只有wifi网络下才允许自动备份相册
- 如果用户登录了多个seafile账户,备份相册前,需要选择备份到某个账户的某个library里,点击确定按钮,开始自动备份相册。
- 备份相册的过程中用户可以继续使用seafile应用中的其他功能
- 用户新拍摄的照片同样会自动备份到指定的账户的指定library里面
- 如果在关闭seafile应用的情况下,用户拍摄了新的照片,当再次打开seafile应用的时候,新增的照片同样会自动备份到用户事先指定的账户和library中
- 相册备份过程中,用户会收到备份状态的提示信息,如备份开始,备份是否成功,备份了多少张相片,备份完成等信息
- 用户可以关闭相册备份的功能
#难点
可选方案
-
Content Providers配合Content Observers来检测用户新拍摄的照片,参考资料
遇到的难题:相机拍摄一张照片后onChange方法被调用不止一次,另外当照片被删除后该方法也会被调用,如果在onchange方法里面添加照片上传的代码的话,可能会出现重复上传的问题,当照片被删除后可能错误地上传上一张照片。 -
利用广播接收器来监听拍照的动作事件,参考资料
遇到的难题:事件不容易被捕获到 -
使用FileObserver监听相机存放照片的那个文件夹,参考资料
遇到的难题:该方案要求应用必须一直在后台运行,而且只能监听某个特定的文件夹,不灵活,适用性很差
补救措施:使用Media.EXTERNAL_CONTENT_URI
这个常量值可以监听到SD卡上的所有改动事件,然后可以筛选出新增图片的事件并做处理
- 用户打开备份功能,即打开了相应的后台服务,后台服务会伴随应用的启动而启动,随应用的关闭而关闭。后台服务负责扫描本地图片并自动上传到指定的账户和指定的library中。与此同时,把已经上传的图片信息存储到本地数据库。
- 用本地数据库来保证不重复备份,每次把已经上传的图片信息保存在本地数据库中。
- 每次上传新的图片前去数据库查找,无结果的图片才可以添加到上传队列。
- 应用被关闭并再次启动时,后台服务重新扫描本地图片,在保证不重复备份的前提下,自动备份新增的图片到服务器。
- 后台服务启动和关闭
- 数据库存储和读取
- 用户设置信息(备份打开or关闭,账户&library)的保存和读取
- 图片异步加载,上传
- UI
- 使用android架构提供的SyncAdapter类承担相册备份的功能。
- SyncAdapter需要的辅助类有,Service,AccountAuthorization, ContentProvider等
- a Service that runs all the time, which is a bad practice and a bad idea in general.
- 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.