Alb 安卓相册
Android 分类相册项目,核心是用 Room 元数据建立可无限嵌套的分类体系,不移动原始媒体文件。它适合类似隐私空间这类不方便直接调整文件位置的场景,同时结合精确查重和相似查重能力。
平台: Android 原生
存储: 本地 Room 数据库 + MediaStore
存储: 本地 Room 数据库 + MediaStore
1. 无限嵌套分类,不动原始文件
Alb 通过 MediaStore 读取设备照片和视频,用 Room 维护分类树、标签、封面和查重信息。整理过程只写入元数据,不移动原始媒体文件,适合隐私空间这类不方便直接调整文件位置的使用场景。
MediaMetadata.kt (Room Schema) KOTLIN_ENTITY
@Entity(tableName = "media_metadata")
data class MediaMetadata(
@PrimaryKey val id: Long,
val path: String,
val size: Long,
val duration: Long,
val dateModified: Long,
val mimeType: String,
val fileHash: String?,
val isOrganized: Boolean = false,
val categoryId: Long? = null
) MediaStorePagingSource.kt PAGING_CURSOR
class MediaStorePagingSource(
private val context: Context
) : PagingSource<Int, MediaItem>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, MediaItem> {
val position = params.key ?: 0
val limit = params.loadSize
return try {
val items = queryMediaStore(position, limit)
LoadResult.Page(
data = items,
prevKey = if (position == 0) null else position - limit,
nextKey = if (items.isEmpty()) null else position + limit
)
} catch (e: Exception) {
LoadResult.Error(e)
}
}
// Efficient MediaStore cursor query
private fun queryMediaStore(offset: Int, limit: Int): List<MediaItem> { ... }
} 2. 查重 + 备份恢复
查重分两种:SHA-256 精确查重找出完全相同的文件,感知哈希相似查重找出画面接近的照片。换手机时可以备份元数据,新设备上按文件特征重新匹配恢复分类和标签。
项目已开源到 GitHub。完整截图、功能演示和版本记录由仓库 README 承接,站内只做简要说明。当前版本 v0.2.2,从 v0.1.1 开始迭代了 20+ 个版本。
界面示意
通过 Tailwind 渲染的 app 样本界面布局(全部媒体、待整理、整理库):
Alb Gallery ● OFFLINE
全部 待整理 整理库
UNORGANIZED: 412 ITEMS SELECT_ALL
项目记录
Alb 的重点是照片分类结构本身:用可嵌套的虚拟相册管理媒体文件,在不改变原始文件位置的前提下完成整理、查重和恢复。它面向真实手机使用场景,不只是一个界面 Demo。