中文 · English
锤子科技从来不只把自己看作一家做视觉的公司。好看的界面只是起点,产品最终仍要解决真实问题;设计、功能和交互应当保持一致,让第一次使用的人不费力,也让长期使用的人偶尔发现藏在细节里的惊喜。Smartisan 这个名字所代表的“智能时代的工匠”,不是为产品贴上一层漂亮的皮肤,而是认真对待每一次触摸、反馈与停顿。 锤子音乐是这种理念很完整的一次表达。黑胶唱盘、唱针、搓碟和爆豆音让数字音乐重新变成可以触碰的东西,歌曲、专辑和资料库又始终保持清楚、克制。它有拟物的趣味,却不该为了表演牺牲播放和管理;真正值得保留的,正是质感、秩序与实用性之间的平衡。 Smartisan OS 已经退出历史舞台,本项目因此以锤子音乐 8.1.0 为视觉与交互基准,使用现代 Android 技术栈重新实现这款本地音乐播放器。界面尽可能保留原版 XML、Drawable、NinePatch、Selector、动画节奏与控件层级,媒体扫描、后台播放、队列、收藏、播放列表和数据持久化则全部基于公开 Android API 重写。应用只读取和播放设备上的音频文件,不内置内容曲库、账号体系或媒体分发服务。 ## 相较原版的改进 - **现代本地播放架构**:使用 Media3 `MediaLibraryService`、ExoPlayer 与 MediaSession 重建播放链路,支持后台与锁屏播放、媒体通知、耳机和蓝牙控制,以及进程重启后的队列与进度恢复。 - **重新实现本地资料库**:通过 MediaStore 扫描歌曲,并按歌曲、专辑、艺术家、流派和文件夹浏览;支持资料库排除、重新扫描、排序筛选和字母快捷栏。 - **重建收藏与播放列表**:保留原版已有的收藏和自建播放列表,并使用 Room 重新实现持久化与播放统计;队列、当前歌曲及播放位置也会保存和恢复。 - **扩展播放页能力**:在原版唱盘与控制区基础上加入音频文件内嵌歌词、睡眠定时和可拖拽播放队列。 - **新增个性化设置**:加入艺术家分隔符、可排序及固定的底部导航、可切换应用图标和简易音效;除原版图标外,还保留了 realme UI 7.0 音乐的黄色黑胶图标,并按 Android adaptive icon 规范接入彩色与单色图层。音效提供几种预设及自定义均衡曲线。 - **打磨唱盘交互**:保留唱针拖拽、唱片转动、搓碟、爆豆音和播放状态联动,并针对现代触摸事件、生命周期与帧时钟重新实现。 - **增强资料库操作**:支持多选、滑动操作、加入播放列表、分享音频文件和按系统版本授权的 MediaStore 媒体删除;也可以从文件管理器或其他应用直接打开音频。 - **适配 Android 8.1 及以上版本**:为新旧存储模型、系统栏、手势导航、刘海、WindowInsets 和预测性返回分别提供兼容路径,同时保持原版页面比例与视觉语言。 - **现代数据架构**:使用 Room、DataStore、Coroutines 和 StateFlow 管理资料库、收藏、播放列表、设置及播放状态,不依赖 Smartisan OS 私有服务或系统签名能力。 - **清理历史包袱**:业务源码全部使用 Kotlin,只保留当前实现需要的资源和公开 API,不携带原版后台服务、旧数据库或旧设置迁移代码。 - **新增跟随系统的深色模式**:纯资源驱动(`values-night` 与 `drawable-night` 同名变体),无应用内开关、无运行时换肤分支。原版 8.1.0 没有深色模式,夜间视觉属于本项目的自创设计:炭灰色板取自同为复刻项目的锤子天气(页底 `#25282D`、标题栏 `#292C31`、卡片 `#34373C`),夜间位图由 `tools/generate_night_drawables.py` 从原版位图等比压暗或反白生成(保留 alpha 与 nine-patch 标记,可重复执行),红蓝品牌强调色深浅主题通用。 ## 当前功能 - 本地音乐授权、扫描、重新索引及资料库目录排除 - 歌曲、专辑、艺术家、流派和文件夹浏览 - 排序筛选、字母快捷栏、多选与滑动操作 - 收藏歌曲、自建播放列表和播放统计 - 跟随系统的深色模式(炭灰夜间视觉) - 后台播放、媒体通知、耳机与蓝牙媒体控制 - 顺序、随机、单曲循环和列表循环播放 - 播放队列展开、拖拽排序,以及队列和进度恢复 - 黑胶唱盘、唱针拖拽、搓碟与爆豆音 - 音频文件内嵌的静态、逐行及逐字歌词 - 原声、低音、清澈、人声、摇滚与自定义音效 - 睡眠定时和系统音量控制 - 外部音频打开、音频文件分享和 MediaStore 媒体删除 - 自定义艺术家分隔符、底部导航顺序与固定项,以及应用图标 ## 本地媒体与权限 应用的最终 Manifest 不包含 `INTERNET` 权限,运行时不依赖网络,也不会上传歌曲、封面、歌词或资料库信息。 - Android 13 及以上使用 `READ_MEDIA_AUDIO` 读取设备音频;Android 8.1 至 Android 12 使用受版本限制的 `READ_EXTERNAL_STORAGE`。 - `FOREGROUND_SERVICE_MEDIA_PLAYBACK` 仅用于用户播放音乐时维持后台播放和媒体通知。 - `MODIFY_AUDIO_SETTINGS` 用于播放音效与系统音乐音量控制,`VIBRATE` 用于交互触觉反馈。 - 删除歌曲时,Android 11 及以上使用系统批量确认,Android 10 使用单文件授权;Android 8.1 和 Android 9 仅在用户确认删除后申请 `WRITE_EXTERNAL_STORAGE`,再通过 MediaStore 执行删除。 - 应用不申请修改系统设置、定位、相机、麦克风、通讯录、短信、悬浮窗或无障碍权限。 ## 真机截图