Android 10+屏幕捕获限制解析与前台服务适配实战
1. 项目概述当Android 10关上了那扇“窗”如果你是一名Android应用开发者尤其是那些需要录屏、截屏、远程协助或者实现一些炫酷悬浮窗功能的同行那么从Android 10API 29开始一个重大的变化你必须得打起十二分精神来应对。这个变化官方称之为“限制对屏幕内容的访问”。听起来可能有点抽象我把它翻译成大白话系统收紧了应用“偷看”或“录制”其他应用屏幕内容的能力。在Android 10之前一个应用如果想获取屏幕内容主流方式是通过MediaProjectionAPI申请录屏权限。用户同意后这个应用理论上就能捕获到屏幕上显示的一切包括其他应用的界面、输入的信息等等。这带来了巨大的便利也埋下了隐私和安全的风险。想象一下一个恶意应用在你输入银行密码时悄悄录屏后果不堪设想。Android 10引入的这个限制核心目的就是堵上这个风险敞口。它并非完全禁止录屏而是引入了更精细的管控。最直接的影响是当一个应用我们称为“前台应用”在前台运行时其他后台应用将无法通过MediaProjection捕获到该前台应用的屏幕内容。系统会将其内容替换为一个空白的、纯色的画面或者直接阻止捕获。这就像给每个前台应用的窗口都拉上了一层“隐私窗帘”。对于开发者而言这意味着所有依赖MediaProjection进行跨应用屏幕内容捕获的功能在Android 10及以上设备上其行为都发生了根本性改变。如果你的应用有类似功能且没有针对此限制进行适配那么用户升级系统后你的核心功能很可能直接失效或者只能捕获到一片空白导致用户体验断崖式下跌。这绝不是一个可以忽略的小改动而是关系到功能存亡的适配关键点。2. 核心机制与适配思路拆解要有效适配我们不能停留在“知道有这么个限制”的层面必须深入理解其运作机制才能找到正确的应对策略。2.1 Android 10屏幕内容访问限制的底层逻辑这个限制的核心是引入了“媒体投影令牌MediaProjection Token”与“窗口层级Window Layer”和“应用可见性App Visibility”的联动校验。令牌与窗口标记当你的应用通过MediaProjectionManager.createScreenCaptureIntent()启动意图并获得用户授权后系统会返回一个MediaProjection对象。这个对象内部关联着一个唯一的令牌Token。同时系统会为当前正在显示的、属于其他应用的窗口即非你自身应用的窗口打上特殊的标记。可见性检查在屏幕内容捕获的渲染流水线中系统会实时检查每个窗口的所属应用是否处于用户可见的前台状态即拥有RESUMED生命周期状态并且其窗口对用户可见。拦截规则如果系统检测到某个窗口属于一个前台可见的应用非捕获者自身并且该窗口被标记为受保护那么系统在合成最终帧提供给MediaProjection时就会将这部分窗口区域的内容替换掉。通常替换为单色如黑色或模糊化处理而捕获者自身应用的窗口内容则不受影响。简单来说规则就是你只能录到你自己和那些不在前台或不可见的应用的界面。这完美契合了“防止后台应用窥屏”的设计初衷。2.2 主要影响场景与功能盘点你的应用如果涉及以下功能就必须进行Android 10适配跨应用录屏/直播这是最直接的受影响场景。例如游戏直播App想要录制《王者荣耀》的画面在Android 10上如果游戏在前台直播App在后台或小窗则无法捕获游戏画面。远程控制与协助如TeamViewer、向日葵等在控制端查看被控设备屏幕时如果被控端是Android 10且前台有其他应用则协助方可能看不到被控应用的实时界面。悬浮窗与画中画PiP某些需要显示其他应用内容的悬浮窗如果其实现原理是通过MediaProjection捕获再渲染到悬浮窗Surface则会失效。无障碍服务AccessibilityService请注意通过AccessibilityService的getRootInActiveWindow()等方式获取界面节点信息不受此限制影响。因为无障碍服务是系统级的高权限服务其设计初衷就是辅助用户操作它获取的是视图结构信息而非像素帧缓冲。如果你的功能是基于无障碍服务实现的那么恭喜你暂时无需为此担忧。但MediaProjection和AccessibilityService是两条完全不同的技术路径。2.3 适配的总体思路面对这个限制没有一种“银弹”可以完美解决所有场景。我们需要根据自身业务需求选择最合适的策略组合前台服务Foreground Service适配这是官方推荐且最核心的适配方案。既然系统只允许前台应用捕获屏幕那么就让你的捕获服务以前台服务的形式运行。这需要应用具备FOREGROUND_SERVICE权限并在开始捕获时启动一个带有持续通知的前台服务。用户引导与体验优化清晰地向用户解释为什么需要开启前台服务设计优雅的通知样式提供便捷的开关控制。对于因限制无法捕获的场景给予用户明确的提示而不是让屏幕一片空白。备选技术方案评估对于某些特定场景可以考虑是否能用其他技术替代MediaProjection。例如如果是游戏内录屏可以推动游戏接入Google Play Games Services的录屏API如果是应用内部的教程录制可以考虑使用PixelCopyAPI仅捕获自身应用的视图。权限与隐私声明在隐私政策和应用描述中清晰、透明地说明你为何以及如何使用屏幕捕获权限符合Google Play关于用户数据政策的要求降低被下架的风险。3. 核心适配方案前台服务实现详解理论讲完我们进入实战环节。让捕获服务运行在前台是适配Android 10屏幕捕获限制最根本的方法。3.1 创建前台服务与通知通道首先你需要在AndroidManifest.xml中声明前台服务所需的权限和服务。manifest ... !-- Android 9.0 (API 28) 及以上需要此权限 -- uses-permission android:nameandroid.permission.FOREGROUND_SERVICE / application ... !-- 声明你的前台服务 -- service android:name.ScreenCaptureForegroundService android:enabledtrue android:exportedfalse android:foregroundServiceTypemediaProjection / !-- Android 11 (API 30) 及以上需指定类型 -- ... /application /manifest注意从Android 11开始前台服务必须声明foregroundServiceType。对于媒体投影应使用mediaProjection。如果你的应用目标版本targetSdkVersion为30或更高必须添加此属性。接下来在服务启动时创建一个高优先级的通知通道并显示通知。// 以 Kotlin 为例Java 逻辑类似 class ScreenCaptureForegroundService : Service() { private val notificationId 1 private val channelId screen_capture_channel override fun onCreate() { super.onCreate() createNotificationChannel() } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { // 构建一个持续性的通知 val notification NotificationCompat.Builder(this, channelId) .setContentTitle(屏幕录制中) .setContentText(正在捕获屏幕内容...) .setSmallIcon(R.drawable.ic_notification_icon) // 务必提供图标 .setPriority(NotificationCompat.PRIORITY_HIGH) // 或 PRIORITY_MAX .setOngoing(true) // 设置为持续通知用户无法滑动清除 .setContentIntent(...) // 可以设置点击通知跳转回应用的PendingIntent .build() // 将服务启动为前台服务 startForeground(notificationId, notification) // 在这里开始你的MediaProjection捕获逻辑 startScreenCapture() return START_STICKY } private fun createNotificationChannel() { if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) { val channel NotificationChannel( channelId, 屏幕录制, NotificationManager.IMPORTANCE_HIGH // 设置为高重要性确保通知显示 ).apply { description 用于屏幕录制功能的前台服务通知 lockscreenVisibility Notification.VISIBILITY_PUBLIC // 锁屏可见 } val manager getSystemService(NotificationManager::class.java) manager.createNotificationChannel(channel) } } private fun startScreenCapture() { // 你的MediaProjection初始化、VirtualDisplay创建、编码等逻辑 // 确保在Service的上下文中执行 } override fun onBind(intent: Intent?): IBinder? null }3.2 整合MediaProjection到前台服务关键点在于MediaProjection的生命周期管理必须与前台服务绑定。通常我们在Activity中获取用户授权和MediaProjection对象然后将其传递给服务。在Activity中class MainActivity : AppCompatActivity() { private lateinit var mediaProjectionManager: MediaProjectionManager private val captureRequestCode 1001 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mediaProjectionManager getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager } fun startCapture() { // 1. 启动系统截屏权限申请意图 val captureIntent mediaProjectionManager.createScreenCaptureIntent() startActivityForResult(captureIntent, captureRequestCode) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode captureRequestCode resultCode Activity.RESULT_OK data ! null) { // 2. 授权成功获取MediaProjection对象 val mediaProjection mediaProjectionManager.getMediaProjection(resultCode, data!!) // 3. 启动前台服务并将MediaProjection对象传递过去 val serviceIntent Intent(this, ScreenCaptureForegroundService::class.java).apply { // 需要将MediaProjection传递到Service但MediaProjection不可序列化。 // 常见做法是将其保存在应用全局的单例或使用Binder传递其Token。 // 这里演示一种简单方法需处理生命周期 putExtra(result_code, resultCode) putExtra(result_data, data) } // 启动服务Android 8.0需使用startForegroundService if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) { startForegroundService(serviceIntent) } else { startService(serviceIntent) } } } }在Service中接收并启动捕获override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { // ... 创建并显示通知 ... // 从Intent中取出授权结果重新获取MediaProjection val resultCode intent?.getIntExtra(result_code, 0) ?: 0 val resultData intent?.getParcelableExtraIntent(result_data) if (resultCode Activity.RESULT_OK resultData ! null) { val mediaProjectionManager getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager val mediaProjection mediaProjectionManager.getMediaProjection(resultCode, resultData) // 现在可以使用这个mediaProjection来创建VirtualDisplay了 startCaptureWithMediaProjection(mediaProjection) } else { // 处理错误停止服务 stopSelf() } return START_STICKY }实操心得直接传递MediaProjection对象是行不通的因为它不可序列化。更健壮的做法是在Activity中将MediaProjection存储在一个全局的、生命周期可控的地方例如一个ViewModel或一个单例管理类然后Service通过应用上下文去获取。或者使用MediaProjection.Callback来监听状态并通过Binder进行进程间通信如果Service在独立进程。上述代码中传递resultCode和resultData是可行的但要确保resultData这个Intent能被正确传递某些设备可能有限制。3.3 处理服务生命周期与状态同步前台服务一旦启动除非用户主动停止你的应用或从通知栏停止服务否则它会持续运行。你需要妥善管理停止捕获提供清晰的UI入口如一个停止按钮点击后调用stopForeground(true)和stopSelf()来停止服务。同时记得调用mediaProjection.stop()和释放VirtualDisplay、编码器等资源。与Activity通信服务运行期间主Activity可能被销毁。你需要通过LiveData、Flow、LocalBroadcastManager或Service的Binder机制将捕获状态如是否正在录制、错误信息等同步给UI。应对系统回收在onStartCommand中返回START_STICKY这样当系统因内存不足杀死服务后有机会重新创建。但请注意MediaProjection对象会失效需要重新向用户申请权限。因此在onDestroy或onTaskRemoved中做好资源清理并在服务重启时检查状态引导用户重新开始。4. 用户体验优化与降级处理适配不仅是技术实现更是用户体验的升级。不能因为系统限制就让用户面对一个“罢工”的功能。4.1 优雅的通知设计前台服务的通知是用户感知你应用在录屏的直接窗口。一个糟糕的通知会导致用户误关闭或产生焦虑。内容明确标题和内容清晰表明是“屏幕录制中”可以附加当前录制时间或状态。操作按钮在通知上添加操作按钮addAction例如“停止录制”、“暂停/继续”。这提供了最快捷的控制方式。点击行为将通知的contentIntent设置为点击后返回应用控制界面的PendingIntent方便用户管理。渠道重要性将通知通道的重要性设置为IMPORTANCE_HIGH或IMPORTANCE_MAX确保在勿扰模式下也可能显示视系统策略而定。4.2 清晰的用户引导与提示在用户触发录屏功能时做好多步引导首次引导弹出一个解释性对话框说明“为了在Android 10及以上系统正常录屏需要开启一个前台服务这会在通知栏显示一个持续的通知。”用户同意后再申请权限。权限申请调用createScreenCaptureIntent()后系统会弹出原生权限申请窗口。你无法定制此窗口但可以在之前之后做好说明。服务启动后在应用内显眼位置展示录制状态并与通知栏状态同步。4.3 功能降级与友好提示即使做了前台服务适配在某些极端情况下如系统策略异常、其他应用干扰捕获仍可能失败。你的应用需要具备韧性。捕获失败检测在MediaProjection.Callback的onStop()回调中监听捕获被系统停止的情况。当VirtualDisplay的回调收到无效帧如全黑、纯色时也应视为捕获被限制。提供明确反馈一旦检测到捕获内容被限制例如连续N帧都是纯色立即在UI上向用户发出提示“检测到系统限制无法捕获其他应用画面。请确保本应用在前台运行或检查是否授予了正确的权限。”降级方案对于某些功能可以考虑降级。例如远程协助工具如果无法捕获屏幕是否可以切换到“仅共享指针鼠标位置”模式或者提示用户手动切换到需要被协助的应用5. 兼容性处理与测试要点Android版本碎片化要求我们必须处理好不同系统版本的行为差异。5.1 版本条件判断在你的代码中必须对Android 10API 29进行条件分支处理。fun startScreenCaptureFlow(context: Context) { if (Build.VERSION.SDK_INT Build.VERSION_CODES.Q) { // Android 10 的流程先确保启动前台服务或提示用户再申请权限 if (isForegroundServiceRunning(context).not()) { // 提示用户需要启动前台服务然后启动服务 showForegroundServiceExplanation(context) } // 然后在Service内部或之后申请MediaProjection权限 requestMediaProjectionPermission(context) } else { // Android 9及以下直接申请MediaProjection权限 requestMediaProjectionPermission(context) } }5.2 测试矩阵构建测试是适配工作的重中之重。你需要建立一个覆盖不同版本、不同厂商设备的测试矩阵。测试场景Android 9 (Pie) 及以下Android 10 (Q)Android 11 (R) 及以上应用在前台捕获自身正常正常正常应用在后台捕获其他前台应用正常风险点受限内容被替换受限内容被替换应用以前台服务运行在后台捕获其他前台应用正常正常已适配正常需声明foregroundServiceType画中画PiP模式下的捕获视实现而定通常受限通常受限需结合前台服务无障碍服务获取内容正常正常正常测试时重点关注功能验证在不同版本设备上验证核心捕获功能是否按预期工作。权限与通知在Android 10设备上确认前台服务通知是否正确显示用户能否通过通知控制服务。资源管理测试开始、停止、应用切换、锁屏、设备旋转等场景下服务、MediaProjection、VirtualDisplay、编码器等资源是否正确申请和释放避免内存泄漏。厂商兼容性尤其要测试华为、小米、OPPO、vivo等国内主流厂商的定制ROM。某些厂商可能会对后台活动、通知、权限有更激进的管控策略可能需要引导用户手动将你的应用加入“后台白名单”、“电池优化忽略列表”等。5.3 常见问题排查实录在实际开发和测试中我踩过不少坑这里分享几个典型问题及其排查思路问题1前台服务启动了通知也显示了但捕获到的画面仍然是黑色/纯色。排查思路检查foregroundServiceType首先确认你的应用targetSdkVersion 30时服务声明中是否添加了android:foregroundServiceTypemediaProjection。没有这个在Android 11上服务可能无法正常进行媒体投影。验证MediaProjection有效性确保传递给Service的resultCode和resultData是有效的并且成功在Service中重新获取到了MediaProjection对象。可以在Service中获取到对象后立即添加一个MediaProjection.Callback监听其onStop()回调看是否被系统立即停止了。检查VirtualDisplay创建参数确保VirtualDisplay的创建与屏幕实际参数匹配。特别是densityDpi建议使用DisplayMetrics获取。厂商权限去手机系统的“应用管理”或“权限管理”中找到你的应用检查是否除了“显示悬浮窗”或“录音”权限外还有一项特殊的“后台弹出界面”或“后台启动”权限被禁止了。部分厂商ROM需要额外开启。问题2用户点击停止后通知栏的通知无法消除或者服务重启。排查思路正确停止服务在停止按钮的点击事件里确保调用了stopForeground(true)true表示同时移除通知和stopSelf()。清理资源顺序先停止编码器、释放VirtualDisplay再调用mediaProjection.stop()最后停止服务。错误的顺序可能导致回调异常。处理onTaskRemoved在Service中重写onTaskRemoved方法当用户从最近任务中划掉应用时也执行清理和停止逻辑。问题3在Android 10以下的设备上是否需要启动前台服务最佳实践建议统一启动。虽然Android 9及以下系统没有强制要求但启动一个前台服务可以提供一致的用户体验用户看到通知知道正在录屏并且为未来升级到更高版本Android做好准备。你可以在通知内容上稍作区分例如在旧版本上显示“屏幕录制中兼容模式”。

相关新闻

makefile2graph与Gephi结合:大型项目依赖网络分析与优化指南

makefile2graph与Gephi结合:大型项目依赖网络分析与优化指南

makefile2graph与Gephi结合:大型项目依赖网络分析与优化指南 【免费下载链接】makefile2graph Creates a graph of dependencies from GNU-Make; Output is a graphiz-dot file or a Gexf-XML file. 项目地址: https://gitcode.com/gh_mirrors/ma/makefile2graph …

2026/10/8 6:00:59 阅读更多 →
HumanifyJS 反混淆实战指南:用 LLM 把压缩 JS 还原成人话

HumanifyJS 反混淆实战指南:用 LLM 把压缩 JS 还原成人话

HumanifyJS 反混淆实战指南:用 LLM 把压缩 JS 还原成人话 【免费下载链接】humanify Deobfuscate Javascript code using ChatGPT 项目地址: https://gitcode.com/gh_mirrors/hu/humanify 凌晨两点,你接手了一个老项目。构建产物里躺着一个 200KB…

2026/10/7 1:40:51 阅读更多 →
未来展望:chatgpt-conversation即将推出的Web应用与GPU加速功能

未来展望:chatgpt-conversation即将推出的Web应用与GPU加速功能

未来展望:chatgpt-conversation即将推出的Web应用与GPU加速功能 【免费下载链接】chatgpt-conversation Have a conversation with ChatGPT using your voice, and have it talk back. 项目地址: https://gitcode.com/gh_mirrors/ch/chatgpt-conversation ch…

2026/10/8 2:38:09 阅读更多 →

最新新闻

病毒样本提取工具:从内存与运行时精准捕获原始恶意代码

病毒样本提取工具:从内存与运行时精准捕获原始恶意代码

简介:本资源是一款面向网络安全从业者、逆向分析初学者及CTF安全研究人员的病毒样本提取工具集,聚焦恶意软件分析全流程中的样本捕获与初步研判环节。工具支持在隔离环境中对可疑文件(如伪装型AD.gif、系统配置类EQSysSecure.xml等&#xff0…

2026/10/13 4:49:14 阅读更多 →
AI编程工具被企业叫停?Claude Code安全危机与替代方案全复盘

AI编程工具被企业叫停?Claude Code安全危机与替代方案全复盘

我们团队把 Claude Code 叫停那天,我正在用它重构一个历史模块。屏幕上代码还在正常输出,安全组的通知已经在工作群里弹了出来:即日起停用所有 AI 编码工具,名单第一行就是 Claude Code。这算是我工作以来经历的第一次“AI 工具被…

2026/10/13 4:49:14 阅读更多 →
COMSOL仿真18650与21700圆柱电芯热失控过程

COMSOL仿真18650与21700圆柱电芯热失控过程

我之前做电池安全评估时,接到一个任务:用COMSOL Multiphysics仿真18650和21700两款圆柱电芯在热滥用条件下的热失控过程,重点看温度和电压随时间的变化,并对比两款的差异。热失控仿真听起来高大上,其实本质就是把电化学…

2026/10/13 4:49:14 阅读更多 →
Agent联网搜索实战:Cloudflare Web Search API接入与踩坑指南

Agent联网搜索实战:Cloudflare Web Search API接入与踩坑指南

1. 先聊清楚:Agent 为什么非要联网不可如果你跟我一样,过去半年在折腾各种 AI Agent,一定撞到过同一个尴尬场面:问它“帮我看看今天某品牌的发布会说了什么”,它一本正经地编出一段发布会通稿,时间、地点、…

2026/10/13 4:49:14 阅读更多 →
2026法治互动设备厂家排行榜推荐:青少年法治展厅多媒体设备研发生产厂商TOP盘点,易传诚排名第一

2026法治互动设备厂家排行榜推荐:青少年法治展厅多媒体设备研发生产厂商TOP盘点,易传诚排名第一

法治展厅好不好用,设备是关键。相比外采拼装,自研设备在内容定制、稳定兼容和后期更新上优势明显。本文聚焦法治互动设备厂家,从自研能力、产品成熟度和适配性出发,盘点2026年值得推荐的多媒体设备研发生产厂商。TOP 1 陕西易传诚…

2026/10/13 4:49:14 阅读更多 →
环形缓冲区空/满判断:三种方案与面试手写要点

环形缓冲区空/满判断:三种方案与面试手写要点

环形缓冲区的实现和空/满判断,是我在技术面试里最常问的基础题,没有之一。它的代码量不超过五十行,看起来就是一个数组加两个下标,可每次让候选人在白板上写下来,十分钟内能把边界情况全部写对的人真的不多。尤其是“这…

2026/10/13 4:48:14 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →