Android 照片自动备份(权限、后台、通知)
Android 端与 iOS 功能对齐,应用 ID 同样是 net.duguying.photos。备份协议的 key 布局相同,所以同一桶或同一 USB 库能被认领。Azalea 不托管原图:资源从 MediaStore 读出,写进你自己的 COS/OSS/S3、文档树或 Samba。minSdk 26。这篇只讲权限、后台和通知,不把换机步骤再写一遍。
2026-04-02 实验室用 Pixel 8(Android 15)把 11,614 项、81.95 GB 推到腾讯云 COS ap-guangzhou。2026 年 1 月至 3 月,小米 14(HyperOS 2.0.5)在家庭群晖 DS220+ 上写过 6,744 项。华为 Mate 60(HarmonyOS 4.2.0)走 OTG 时,进度 61% 处拔盘,12 个临时文件重试后写完。三条路径共用同一套索引逻辑。
权限
- API 26–32:
READ_EXTERNAL_STORAGE - 33+:
READ_MEDIA_IMAGES/READ_MEDIA_VIDEO - 34+ 支持「所选照片」。全库备份请给完全访问,否则索引只覆盖授权子集。换机时缺的年份不是应用丢了。
USB:系统 OpenDocumentTree 选树,然后 takePersistableUriPermission。不 take,重启后配置还在、树权限没了,list 直接空。Android USB 必须 extra.mode=bridge,因为 OTG 只有 content://,POSIX 打不开。通知栏前台服务对应 iOS 的 Live Activity,用来降低被杀概率,不是永动机。
MediaStore 一条记录一条 resource。动图、截屏会进智能相册;空智能相册会隐藏。不要用文件管理器在备份盘上改名。盘上 .album/manifest.jsonl 是自描述索引,改物理文件名会让认领对不上。
步骤
- 安装 Azalea,过权限门。系统问照片权限时给完全访问,不要用「所选照片」做全库。文案因厂商略有差别,目标是能扫到「所有照片」对应的图库。
- 打开「备份存储」→「新建配置」。对象存储填 COS / OSS / S3 的 Bucket、地域、密钥。USB 走文档树:插上盘,选根目录或你准备放库的文件夹,确认系统弹出的持久化授权。
- 回到「备份状态」页,看待处理。打开自动备份。通知栏应出现前台服务进度。HyperOS / ColorOS / HarmonyOS 需要把应用从电池优化里拿出来,并允许自启动,否则通知还在、任务已死。
- 插电、连 Wi-Fi(对象存储)或保持 OTG 不断(USB)。锁屏可以,不要从最近任务里划掉 Azalea。
- 待处理清零后抽查。用另一台设备认领同一桶或同一 USB 目录,或把盘插到电脑看
.album/manifest.jsonl是否在增长。抽一张 JPEG、一段 4K、一张文件名带空格或冒号的。 - 厂商杀后台是常态。打开应用后续上,看「备份状态」数字下降即可。不要为此重建配置。
小米 14 上的实际情况
家庭 NAS 案例里,群晖 DS220+ DSM 7.2.2,share 名 photos。iPhone 14 Pro 先写 9,023 项,小米 14 再写 6,744 项,合计 15,767 项、约 69.9 GB。小米侧 HyperOS 2.0.5 会杀后台。WorkManager 前台通知在,任务仍会停。打开应用续传是常态,不是例外。这不是「Android 备份不可用」,是你要接受前台服务不是永动机。
实验室路由上手机走 5 GHz Wi-Fi,NAS 千兆有线。Samba 第一次真正读写才建会话。配错密码不会在保存「新建配置」时暴露,而在点开始备份后。小米侧主要是 JPEG,iPhone 侧 HEIC 进同一库,key 里带设备维度,不冲突。
失败
- 只给「所选照片」:待处理数字偏小,备份状态看起来很快到 0。把系统权限改成完全访问后再打开应用,索引会变大。
- USB 没
takePersistableUriPermission:杀进程后树空了。回到「新建配置」重新选文档树,并在系统对话框里勾持久化。Mate 60 上对照过:没 take 的那次 list 直接空。 - OTG 仍是充电模式:华为 Mate 60 第一次插 SanDisk Ultra Dual Drive Luxe 1TB,系统当成充电,文档树里没有盘。切到「传输文件 / USB 存储」后才出现。进度约 61%(大约 5,100 / 8,359)时拔盘,出现
DeviceDetached;重插后 12 个.tmp被丢弃并重写,0 丢失。 - 地域填错:第一次 list 签名错误或 301。对象存储密钥走 EncryptedSharedPreferences,不要把临时 session token 当长期密钥。
- 电池优化把前台服务掐死:通知残留。去系统设置把 Azalea 设为「无限制」,再回「备份状态」续。
索引、前台服务和厂商电池策略
Android 端进度落在 backup-index.sqlite。通知栏数字可以和页面不一致,以打开应用后的「备份状态」为准。WorkManager 加上前台服务,只是降低被杀概率。ColorOS 的「后台冻结」、HyperOS 的「电量优化」、HarmonyOS 的「应用启动管理」都会在你以为「已经自动了」的夜里把任务停掉。把 Azalea 设成无限制、允许关联启动、通知权限打开,这三件事缺一都会变成「通知还在、字节不涨」。
对象存储密钥走 EncryptedSharedPreferences。不要把 Access Key 截图发到群里让家人「照着填」——家人应各自「新建配置」,Bucket 相同、密钥用同一个子账号即可认领。USB 文档树绑定的是那一次选择;换 OTG 线导致 URI 变了,就要重新授权,不是应用丢了盘。
MediaStore 扫描会把截屏、蓝牙收到的图、相机连拍都算进去。智能相册「视频」为空则隐藏,有内容才进。空集合不是故障。备份进行中不要用系统文件管理器给源图改名,改名后记录 ID 还在、路径变了,失败项会变多。
Pixel 8 那次跨两晚,664 分钟含 Wi-Fi 休眠。有效窗口大约 7 小时,瞬时能到 8 MB/s。不要用「昨晚开了一夜」反推已经写完,早上看待处理。1 个坏 MP4 标 unrecoverable 不会卡住整库。
和 iOS 对齐时别指望的事
同一桶或同一 USB 库可以被 iPhone 认领。Android 不能把 iOS 的 local_identifier 对上 MediaStore,所以 iPhone 上的「收藏」不会出现在 Android 侧,反向同样。认领后本机系统相册仍可能是空的,资源在已备份库里,直到你下载。2026-04-02 那次有 1 个损坏 MP4(更早 Infinix 残留,2,048,512 字节)hash 对不上,记 unrecoverable,传输没坏,源就是残的。
exFAT 文件名里的 : * ? 会转义。逻辑名在应用里不变。Windows 上看到的怪文件名是物理路径,不要改回去。
FAQ
后台通知在,为什么进度不动? 厂商杀了进程,通知没清干净。打开 Azalea,看「备份状态」待处理。小米 14 上这是每周都会遇到的事。
能不能限只在 Wi-Fi 备份? 对象存储走你自己的网络策略;系统可以限制蜂窝。USB 不走蜂窝。实验室 Pixel 8 那次跨两晚 Wi-Fi,664 分钟含休眠,有效窗口大约 7 小时。
「所选照片」和 iOS 的「所选照片」一样吗? 语义接近:备份集合等于授权子集。全库请给完全访问,对应 iOS 的「所有照片」。
杀进程会不会从头备份? 不会。索引在 backup-index.sqlite。除非你清数据或删配置。Mate 60 拔盘后续的是索引,不是重扫 8,359 项。
原图经过 Azalea 服务器吗? 不经过。写进你的桶、文档树或 NAS。Azalea 不提供托管桶。