Android运动健康App架构解析:从传感器采集到状态持久化
简介这是一套功能完整的Android健身类APP源码面向移动开发初学者与进阶者适用于学习健身应用架构设计、用户健康管理模块实现及多媒体交互开发。项目整体风格对标KEEP、薄荷健康等主流产品涵盖用户注册登录、课程训练计划、运动数据记录、社区互动等核心业务场景。资源包共252个文件以64个Java源文件构成主逻辑层46个XML布局与资源文件支撑UI结构80个PNG图标与图片资源保障界面表现力辅以MP4教学视频、Gradle构建脚本及SQL数据库脚本完整覆盖从开发、调试到部署的全流程。压缩包大小为96.47MB结构清晰、模块解耦合理便于理解MVC/MVP分层思想与Android组件通信机制。目前已有5826人学习下载适合希望掌握真实商业级健身App开发范式、快速复用核心模块如运动计时、打卡签到、评论收藏的开发者参考实践。1. 这不是一个“拿来就能上线”的健身APP源码而是一套可深度定制的Android运动健康应用骨架它解决的是「从零搭起用户留存闭环」的工程问题不是UI换肤或接口改写你搜到这个标题时大概率正卡在三个现实困境里想快速验证一个运动课程订阅模式但自己从Activity写起要两周团队刚招来两个安卓新人需要一份结构清晰、模块解耦、带真实业务逻辑不是TodoList那种玩具的参考基线或者你手头有个旧版健身App但用户反馈“练到一半闪退”“课程进度不同步”“夜间模式切不回来”想对标成熟产品找架构级解法。这类源码的价值从来不在“功能多全”而在分层是否干净、状态是否可控、数据流是否可追溯——KEEP类产品的核心竞争力恰恰藏在登录态同步策略、离线课程缓存淘汰算法、传感器采样节流控制这些“看不见的代码”里。它适合两类人一是需要快速构建MVP并预留商业化扩展点的创业者二是想系统理解“健康类App如何平衡电池功耗与数据精度”的中高级安卓工程师。别被“类似KEEP”误导——这不是克隆而是把行业多年踩出的坑提前封装成可插拔的组件。2. 搭建本地开发环境用Android Studio Flamingo Gradle 8.0 构建可调试的最小运行体2.1 环境准备避开Gradle版本错配导致的R文件生成失败很多开发者下载源码后第一件事就是./gradlew build结果卡在Cannot resolve symbol R。根本原因在于项目gradle/wrapper/gradle-wrapper.properties中声明的Gradle版本如gradle-8.0-bin.zip与本地Android Studio默认版本不一致。必须严格匹配打开Android Studio → Settings → Build → Build Tools → Gradle → 选择“Use Gradle from wrapper”再确认Wrapper路径指向项目内gradle/wrapper/gradle-wrapper.properties。若提示“Gradle sync failed”不要点“Try again”先检查该文件中的distributionUrl是否为https\://services.gradle.org/distributions/gradle-8.0-bin.zip。若本地网络慢可手动下载此zip包放入~/.gradle/wrapper/dists/gradle-8.0-bin/xxx/目录xxx为随机哈希串再重试Sync。# 验证Gradle版本是否就位在项目根目录执行 ./gradlew --version # 输出应包含 # Gradle 8.0 # Kotlin: 1.8.10 # Groovy: 3.0.13 # Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021 # JVM: 17.0.6 (Amazon.com, Inc. 17.0.610-LTS)提示JVM版本必须为17。Android Studio Flamingo默认捆绑JDK17若使用旧版Studio请在Settings → Build → Build Tools → Gradle → Gradle JVM中切换为JDK17。2.2 依赖注入框架选型为什么放弃Dagger2选用Hilt作为默认容器源码中app/build.gradle的dependencies块明确引入了hilt-android和hilt-compiler。这不是跟风——Dagger2在健身类App中暴露出两个硬伤一是Module需手动维护Provides方法的调用链当加入心率传感器服务HeartRateService、GPS轨迹记录器GpsTracker、课程播放器CoursePlayer三者间存在强依赖时Inject构造函数参数膨胀至7个以上可读性归零二是编译期生成的DaggerAppComponent类体积过大导致Instant Run失效。Hilt通过HiltAndroidApp自动注入Application上下文并用InstallIn(ActivityComponent::class)精准控制作用域让CoursePlayerImpl只需声明Inject constructor(private val gpsTracker: GpsTracker)即可获得实例。实测对比相同模块下Hilt编译耗时比Dagger2低37%APK Method Count减少2100。// app/src/main/java/com/example/fitness/core/di/AppModule.kt Module InstallIn(SingletonComponent::class) object AppModule { Provides fun provideGpsTracker( ApplicationContext context: Context, Named(gps_update_interval) updateIntervalMs: Long ): GpsTracker GpsTrackerImpl(context, updateIntervalMs) Provides Named(gps_update_interval) fun provideGpsUpdateInterval(): Long 3000L // 3秒更新一次坐标平衡精度与耗电 }这段代码定义了GPS追踪器的创建规则并通过Named标注其配置参数。关键点在于updateIntervalMs不是硬编码而是由Hilt在注入时动态传入——这意味着你后续想为「跑步模式」设1秒间隔、「瑜伽模式」设10秒间隔只需新增Named(yoga_gps_interval)提供器无需修改GpsTrackerImpl构造函数签名。2.3 运行前必改的3个配置项避免因测试密钥缺失导致崩溃源码中app/src/main/res/values/strings.xml包含占位符密钥直接运行会触发SecurityException。必须修改以下三项配置位置原始值必须替换为说明app/src/main/res/values/strings.xml→map_api_keyYOUR_MAP_API_KEY高德/百度地图SDK申请的Android平台Key健身路线绘制依赖此Key无Key则地图白屏Logcat报E/AMapSDK: Invalid keyapp/src/main/java/com/example/fitness/data/remote/ApiService.kt→BASE_URLhttps://api.example.com你自己的后端域名含HTTPS所有网络请求从此处拼接若留默认值将404app/src/main/java/com/example/fitness/core/Constants.kt→SHARED_PREFS_NAMEfitness_prefs保持不变但需确认SharedPreferences未被其他App同名覆盖多进程场景下若名称冲突会导致用户登录态丢失注意SHARED_PREFS_NAME虽不用改但必须检查app/src/main/AndroidManifest.xml中application标签是否添加android:sharedUserIdcom.example.fitness。若添加则所有同签名App共享此Prefs若未添加推荐则仅本App可见——这是防止「课程进度在后台被清空」的关键隔离机制。3. 核心业务模块拆解从「开始训练」按钮点击到传感器数据落库的完整链路3.1 训练启动流程为什么用WorkManager而非IntentService管理后台计时点击「开始训练」后UI层调用TrainingViewModel.startTraining()该方法内部并非直接startService()而是提交一个OneTimeWorkRequest// app/src/main/java/com/example/fitness/presentation/training/TrainingViewModel.kt fun startTraining() { val inputData Data.Builder() .putLong(training_id, currentTrainingId) .putString(mode, running) // running / yoga / strength .build() val workRequest OneTimeWorkRequestBuilderTrainingWorker() .setInputData(inputData) .setConstraints(Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresBatteryNotLow(true) // 防止低电量时被系统杀掉 .build()) .build() WorkManager.getInstance(appContext).enqueue(workRequest) }这里用WorkManager而非传统Service是因健身场景的特殊性用户可能锁屏、切换App、甚至重启手机。IntentService在Android 8.0会被系统限制后台执行而WorkManager能保证任务在满足约束条件如联网、非低电量时可靠执行。TrainingWorker继承自CoroutineWorker其doWork()方法中启动SensorManager监听加速度计与陀螺仪override suspend fun doWork(): Result { val sensorManager appContext.getSystemService(Context.SENSOR_SERVICE) as SensorManager val accelerometer sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) // 注册监听器采样频率设为SENSOR_DELAY_UI约20ms/次 sensorManager.registerListener( sensorEventListener, accelerometer, SensorManager.SENSOR_DELAY_UI ) // 启动协程持续处理传感器数据 withContext(Dispatchers.IO) { while (isActive) { delay(100) // 每100ms聚合一次原始数据 val stepCount calculateStepFromAccel(rawAccelBuffer) saveStepToDatabase(stepCount) // 写入Room数据库 } } return Result.success() }关键参数说明SENSOR_DELAY_UI是权衡之选——SENSOR_DELAY_FASTEST5ms会导致CPU占用飙升SENSOR_DELAY_GAME20ms对跑步步频识别精度不足SENSOR_DELAY_UI20ms在功耗与精度间取得平衡实测误差率3.2%。3.2 课程播放器ExoPlayer封装的3层缓冲策略CoursePlayer模块未使用MediaPlayer而是基于ExoPlayer 2.19.1构建。其核心创新在于三级缓冲缓冲层实现方式解决问题配置参数网络层缓冲DefaultHttpDataSource.Factory().setConnectTimeoutMs(10_000)防止弱网下频繁重连connectTimeoutMs10000,readTimeoutMs15000解码层缓冲DefaultLoadControl.Builder().setBufferDurationsMs(25_000, 50_000, 2500, 5000)避免视频卡顿minBufferMs25s,maxBufferMs50s,bufferForPlaybackMs2.5s,bufferForPlaybackAfterRebufferMs5s本地预加载CacheUtil.cache()预加载后续2个视频分片切换动作时无缝衔接分片大小2MB预加载数2// app/src/main/java/com/example/fitness/media/CoursePlayer.kt private fun buildExoPlayer(): ExoPlayer { val loadControl DefaultLoadControl.Builder() .setBufferDurationsMs( minBufferMs 25_000, // 最小缓冲25秒 maxBufferMs 50_000, // 最大缓冲50秒 bufferForPlaybackMs 2500, // 播放前至少缓冲2.5秒 bufferForPlaybackAfterRebufferMs 5000 // 卡顿恢复后需5秒缓冲 ) .createDefaultLoadControl() return ExoPlayer.Builder(appContext) .setLoadControl(loadControl) .setTrackSelector(trackSelector) .build() }这套策略使课程视频在地铁隧道等弱网场景下仍能维持平均3.2秒的缓冲余量用户无感知。3.3 数据持久化Room Flow实现「训练中实时保存」的原子性保障训练过程中每5秒需将当前心率、步数、消耗卡路里写入数据库。若用传统insert()逐条提交高并发下易触发SQLiteConstraintException。源码采用Room的Transaction注解Flow流式提交// app/src/main/java/com/example/fitness/data/local/TrainingDao.kt Dao interface TrainingDao { Insert(onConflict OnConflictStrategy.REPLACE) suspend fun insertTrainingSession(session: TrainingSession): Long Transaction suspend fun insertTrainingDataBatch(dataList: ListTrainingData) { dataList.forEach { insertTrainingData(it) } } Insert(onConflict OnConflictStrategy.REPLACE) suspend fun insertTrainingData(data: TrainingData): Long } // ViewModel中调用 private fun saveTrainingDataPeriodically() { viewModelScope.launch { flow { while (true) { delay(5000) val currentData collectCurrentTrainingData() // 从内存缓存取最新值 emit(currentData) } } .flowOn(Dispatchers.IO) .collectLatest { data - trainingDao.insertTrainingDataBatch(listOf(data)) // 批量插入但此处实际为单条 } } }注意collectLatest是关键——若用户5秒内多次触发数据采集如传感器抖动只处理最后一次避免数据库写入风暴。实测在Redmi K50上连续训练60分钟数据库写入耗时稳定在12±3ms/次无ANR。4. 避坑指南5个让90%开发者在第3天就放弃的致命陷阱4.1 现象App安装后首次启动黑屏3秒Logcat显示E/OpenGLRenderer: Unable to match the desired swap behavior.原因源码app/src/main/res/values/styles.xml中AppTheme继承自Theme.Material3.DayNight但AndroidManifest.xml中application标签未设置android:themestyle/AppTheme导致系统回退到Theme.AppCompat而Material3组件如MaterialButton在AppCompat主题下渲染异常。解决打开AndroidManifest.xml在application标签内添加android:themestyle/AppTheme并确认styles.xml中AppTheme父类为Theme.Material3.DayNight。4.2 现象心率传感器数据始终为0onSensorChanged()回调中event.values[0]恒等于0原因Android 10要求访问身体传感器Sensor.TYPE_HEART_RATE必须声明uses-permission android:nameandroid.permission.BODY_SENSORS /且该权限为危险权限需在运行时申请。源码中PermissionHelper.requestBodySensorsPermission()被注释掉了。解决取消PermissionHelper.kt中requestBodySensorsPermission()方法的注释并在TrainingFragment.onResume()中调用permissionHelper.requestBodySensorsPermission(this)。注意必须在onResume()而非onCreate()中申请否则Activity重建时权限状态丢失。4.3 现象课程视频播放时屏幕常亮失效15秒后自动息屏原因CoursePlayerActivity中调用window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)的位置错误——它被写在onCreate()的super.onCreate()之前导致系统窗口标志未生效。解决将window.addFlags(...)语句移至super.onCreate(savedInstanceState)之后且在setContentView()之前。正确顺序super.onCreate()→window.addFlags()→setContentView()。4.4 现象切换夜间模式后课程详情页的图片颜色失真呈现泛青色原因源码使用Glide加载图片但未配置GlideApp.with(this).load(url).transform(GrayscaleTransformation())而GrayscaleTransformation在夜间模式下被错误启用。问题根源在app/src/main/java/com/example/fitness/di/NetworkModule.kt中Provides的Glide实例未绑定AppGlideModule。解决创建app/src/main/java/com/example/fitness/MyGlideModule.kt继承AppGlideModule重写applyOptions()并在AndroidManifest.xml中注册meta-data android:namecom.example.fitness.MyGlideModule android:valueGlideModule/。4.5 现象用户退出训练后后台仍在上报GPS坐标电池消耗激增原因TrainingWorker.doWork()中sensorManager.unregisterListener(sensorEventListener)未被调用。WorkManager任务结束时onStopped()不会自动触发注销必须显式调用。解决在TrainingWorker类中重写onStopped()方法override fun onStopped() { super.onStopped() sensorManager?.unregisterListener(sensorEventListener) Log.d(TrainingWorker, Sensor listener unregistered) }5. 进阶技巧用Jetpack Compose重构首页TabBar3步实现「状态驱动」的动态图标切换即使源码主体用XML编写首页TabBar底部导航栏也值得用Compose重写——因为它的状态变化最频繁未读消息数、训练完成徽章、会员到期倒计时。XML方案需手动findViewById()setText()setImageResource()而Compose用StateFlow驱动一行代码响应所有变更。5.1 第一步定义Tab状态数据类替代冗长的Bundle传递// app/src/main/java/com/example/fitness/presentation/home/TabState.kt data class TabState( val index: Int 0, val unreadMessageCount: Int 0, val isPremium: Boolean false, val daysLeft: Int 0 )5.2 第二步创建Composable TabBar用rememberUpdatedState捕获最新状态// app/src/main/java/com/example/fitness/presentation/home/TabBar.kt Composable fun TabBar( tabState: StateFlowTabState, onTabSelected: (Int) - Unit ) { val currentTab by tabState.collectAsStateWithLifecycle() BottomNavigation( backgroundColor MaterialTheme.colorScheme.surface, contentColor MaterialTheme.colorScheme.onSurface ) { val icons listOf( Icons.Default.Home, Icons.Default.Favorite, Icons.Default.Person ) icons.forEachIndexed { index, icon - val isSelected index currentTab.index val iconRes if (isSelected) { // 选中时用填充图标 when (index) { 0 - Icons.Filled.Home 1 - Icons.Filled.Favorite else - Icons.Filled.Person } } else { // 未选中用轮廓图标 icon } BottomNavigationItem( icon { Icon(iconRes, contentDescription null) }, label { Text(stringResource(id getTabLabelRes(index))) }, selected isSelected, onClick { onTabSelected(index) }, alwaysShowLabels true, // 动态显示徽章 badge { if (index 0 currentTab.unreadMessageCount 0) { BadgeBox( containerColor MaterialTheme.colorScheme.error, contentColor MaterialTheme.colorScheme.onError ) { Text( text currentTab.unreadMessageCount.toString(), style MaterialTheme.typography.labelSmall ) } } } ) } } }5.3 第三步在Activity中集成用LaunchedEffect监听状态变更// app/src/main/java/com/example/fitness/presentation/home/HomeActivity.kt class HomeActivity : AppCompatActivity() { private val tabStateFlow MutableStateFlow(TabState()) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { FitnessTheme { // 使用Material3主题 Surface(modifier Modifier.fillMaxSize()) { TabBar( tabState tabStateFlow, onTabSelected { newIndex - tabStateFlow.value tabStateFlow.value.copy(index newIndex) } ) } } } // 启动协程监听消息数变更例如从Firebase获取 lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { messageRepository.unreadCountFlow.collect { count - tabStateFlow.value tabStateFlow.value.copy(unreadMessageCount count) } } } } }这个方案的玄学之处在于rememberUpdatedState确保BadgeBox只在unreadMessageCount变化时重建而repeatOnLifecycle保证协程在Activity后台时自动暂停彻底杜绝内存泄漏。我一般会在messageRepository中用StateFlow而非LiveData因为前者支持distinctUntilChanged()避免重复发射相同数值——这省下的毫秒级开销在低端机上就是帧率提升的关键。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

游泳溺水识别数据集:9984张真实监控图+COCO标注

游泳溺水识别数据集:9984张真实监控图+COCO标注

简介:本资源是面向计算机视觉与安全监控领域的游泳溺水识别专用数据集,适用于AI算法工程师、智能安防系统开发者及高校相关方向研究者,用于训练和验证溺水行为检测模型。数据集包含9984张真实场景下的游泳图像,全部完成COCO JSON格…

2026/10/11 23:53:56 阅读更多 →
硬件入门学习4-电源电路的设计之LDO

硬件入门学习4-电源电路的设计之LDO

电源电路是嵌入式系统的心脏,为整个系统提供稳定可靠的电能。选择合适的稳压器方案直接影响系统的性能、效率、成本和可靠性。LDO和开关型DC-DC是硬件板上供电设计中最常见的两类方案,而且经常一起使用。 尤其是把已有的直流电源,转换成单片机、传感器、通信芯片等所需电压时…

2026/10/11 23:53:56 阅读更多 →
配电网可靠性评估:基于蒙特卡洛仿真的Python实现与停电指标计算

配电网可靠性评估:基于蒙特卡洛仿真的Python实现与停电指标计算

做配电网规划和运行分析的人,躲不开一个问题:眼前这套网架,发生故障之后到底要停多少电?影响多少用户?要回答这个问题,可靠性评估是绕不开的基本功。这次直接开撸代码,用蒙特卡洛仿真模拟系统随…

2026/10/11 23:52:55 阅读更多 →

最新新闻

基于SVDD算法的数据分类MATLAB仿真:原理、代码与避坑指南

基于SVDD算法的数据分类MATLAB仿真:原理、代码与避坑指南

简介:本资源为基于SVDD算法的数据分类MATLAB仿真程序包,面向机器学习初学者、模式识别课程学习者及需要复现单类分类实验的科研人员,帮助理解支持向量数据描述在异常检测与数据分类中的建模流程。包内共16个文件,以12个m脚本为核心…

2026/10/12 0:45:23 阅读更多 →
【厦门大学主办、IEEE出版】第六届人工智能、机器人和通信国际会议(ICAIRC 2026)

【厦门大学主办、IEEE出版】第六届人工智能、机器人和通信国际会议(ICAIRC 2026)

第六届人工智能、机器人与通信国际会议(ICAIRC 2026)将于2026年11月13日至15日在中国厦门举办。本次会议旨在搭建一个高水平学术交流平台,汇聚全球人工智能、机器人及通信领域的专家学者、工程技术人员与研发人员,分享前沿研究成果…

2026/10/12 0:45:23 阅读更多 →
塔吊下方站人检测数据集:VOC标注与YOLOv8实战指南

塔吊下方站人检测数据集:VOC标注与YOLOv8实战指南

简介:这份资源面向从事工地安全监控、目标检测算法开发的研究者与工程师,提供塔吊下方站人检测任务的图像数据集,用于训练和验证识别塔吊作业区域人员的视觉模型,降低误入危险区域引发事故的风险。压缩包共2000个文件,…

2026/10/12 0:45:23 阅读更多 →
如何把“无可挑剔”变成可执行的工作清单?标准定义与流程复盘实战

如何把“无可挑剔”变成可执行的工作清单?标准定义与流程复盘实战

“impeccable”这个词,我盯着看了很久。它不像是那种一眼就能猜出功能的标题,恰恰是这种“不直白”,让我当时决定把这个项目做下去。一年多时间,从零开始摸索到产出稳定,今天想把这个过程中关于“如何把一件事做到无可…

2026/10/12 0:45:23 阅读更多 →
Web 3D 实例化网格(InstancedMesh)几何合批:用单次 Draw Call 渲染森林与千级手办

Web 3D 实例化网格(InstancedMesh)几何合批:用单次 Draw Call 渲染森林与千级手办

在构建大型三维元宇宙展厅、大促虚拟 3D 商城街区、以及自然生态数字孪生(如漫山遍野的植被树木、飘落的花瓣)时,前端 3D 工程师最先撞上的“性能叹息之墙”,往往不是 GPU 的多边形光栅化能力,而是CPU 侧的绘制调用过载…

2026/10/12 0:45:23 阅读更多 →
DeepLog日志异常检测:LSTM时序建模实战指南

DeepLog日志异常检测:LSTM时序建模实战指南

简介:本资源是一套基于LSTM神经网络的日志异常检测项目源码,面向AI运维、日志分析与系统可靠性方向的中高级开发者及研究生,聚焦解决IT系统运行中关键故障的早期识别问题。项目以Deeplog框架为基底,完整实现日志序列建模、事件特征…

2026/10/12 0:44:22 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →