DEV
← 返回项目 | 持续开发

Alb 安卓相册

Android 分类相册项目,核心是用 Room 元数据建立可无限嵌套的分类体系,不移动原始媒体文件。它适合类似隐私空间这类不方便直接调整文件位置的场景,同时结合精确查重和相似查重能力。

平台: Android 原生
存储: 本地 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
全部 待整理 整理库
IMG_1
DUPL
IMG_2
IMG_3
IMG_4
SIMI
IMG_5
IMG_6
UNORGANIZED: 412 ITEMS SELECT_ALL
项目记录

Alb 的重点是照片分类结构本身:用可嵌套的虚拟相册管理媒体文件,在不改变原始文件位置的前提下完成整理、查重和恢复。它面向真实手机使用场景,不只是一个界面 Demo。