Android权限管理全解析:从uses-permission声明到运行时动态申请
1. 项目概述为什么uses-permission是Android开发的基石如果你在Android Studio里新建一个项目打开AndroidManifest.xml文件uses-permission这个标签几乎是每个应用都绕不开的。它看起来平平无奇不就是声明一下应用需要什么权限吗但在我十多年的移动开发经历里见过太多因为权限处理不当导致的“翻车”现场应用上架被拒、功能莫名失效、用户差评如潮甚至引发安全漏洞。uses-permission远不止是一个声明它是连接你的应用代码与Android系统庞大安全沙箱的“通行证”。理解它是构建一个稳定、合规、用户体验良好的Android应用的第一步。无论是访问网络、读取联系人还是使用摄像头背后都离不开对权限体系的精准把控。这篇文章我就从一个老开发的角度带你彻底搞懂uses-permission从声明到管理从原理到避坑让你在权限问题上不再踩雷。2. 权限体系核心uses-permission的深度解析2.1 权限的本质与分类不只是“允许”和“拒绝”在Android系统中权限本质上是一种访问控制机制。系统通过权限来保护敏感的用户数据和关键的系统功能防止恶意应用随意窃取信息或干扰设备运行。uses-permission标签就是应用向系统发出的正式“申请函”告诉系统“我需要使用某某功能请批准。”Android权限主要分为两大类理解这个分类是正确使用uses-permission的前提1. 安装时权限Normal Permissions这类权限涉及的风险较低通常不会直接访问用户的隐私数据或影响其他应用。例如访问网络状态、设置闹钟、使用蓝牙等。系统会在应用安装时自动授予这些权限用户无需手动操作。对于这类权限你只需要在AndroidManifest.xml中声明即可。uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE / uses-permission android:nameandroid.permission.BLUETOOTH /2. 运行时权限Dangerous Permissions这是我们需要重点处理的部分。这类权限涉及用户的隐私或设备的核心功能如读取联系人、访问精确位置、使用相机、录音等。从Android 6.0API level 23开始这类权限必须在运行时动态向用户申请。仅仅在清单文件中声明是远远不够的。uses-permission android:nameandroid.permission.READ_CONTACTS / uses-permission android:nameandroid.permission.CAMERA / uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION /这里有一个关键点权限组。运行时权限是按组分组的。例如READ_CONTACTS和WRITE_CONTACTS同属于CONTACTS组。当你的应用申请了组内的某一个权限并被用户授予后系统会默认授予该组内的所有其他权限仍需在清单中声明。但请注意这是一个系统行为谷歌可能会调整最佳实践仍然是按需申请每一个具体的权限。2.2 uses-permission标签的完整语法与属性一个完整的uses-permission标签远不止一个name属性。虽然很多情况下我们只写name但了解其全貌有助于应对更复杂的场景。uses-permission android:namestring android:maxSdkVersioninteger /android:name这是唯一必须的属性。它指定了权限的名称必须是系统定义的完整权限常量如android.permission.CAMERA或者是其他应用定义的自定义权限。android:maxSdkVersion这是一个非常有用的可选属性。它指明此权限最高应用到哪个API级别。对于某些随着系统更新而废弃或行为发生变化的权限这个属性可以帮你优雅地处理兼容性问题。一个经典案例WRITE_EXTERNAL_STORAGE权限的变迁。在Android 10API 29之前应用若想向共享存储空间如DCIM、Downloads目录写入文件需要申请WRITE_EXTERNAL_STORAGE权限。但从Android 10开始谷歌引入了作用域存储Scoped Storage应用默认只能访问自己的私有目录和特定类型的媒体文件。对于共享存储的广泛写入权限变成了“特殊权限”需要用户从系统设置中手动授予且Google Play对它的使用有严格限制。如果你的应用需要兼容Android 10以下的设备同时又想遵循新的存储规范就可以这样声明!-- 仅在API level 18到28之间需要此权限 -- uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE android:maxSdkVersion28 /这样在Android 10API 29及更高版本的设备上安装时系统会忽略这个权限声明避免了不必要的权限请求和商店审核问题。同时你需要为Android 10的设备实现作用域存储的API如MediaStore来访问文件。注意android:maxSdkVersion的使用需格外谨慎。务必在官方文档中确认该权限在哪个API级别被废弃或行为改变错误设置可能导致在旧设备上功能异常。3. 从声明到授权权限管理的完整实操流程3.1 清单文件声明一切开始的地方所有权限的申请第一步都是在app/src/main/AndroidManifest.xml文件中进行声明。Android Studio通常会帮你自动生成一些基础权限。你需要根据功能需求仔细添加。常见权限声明示例?xml version1.0 encodingutf-8? manifest xmlns:androidhttp://schemas.android.com/apk/res/android packagecom.example.myapp !-- 安装时权限 -- uses-permission android:nameandroid.permission.INTERNET / uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE / !-- 运行时权限 -- uses-permission android:nameandroid.permission.CAMERA / uses-permission android:nameandroid.permission.RECORD_AUDIO / !-- 处理Android 10以下的外部存储 -- uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE android:maxSdkVersion28 / application ... ... /application /manifest实操心得权限的“最小化”原则在添加任何权限前先问自己三个问题1. 这个功能是否必须2. 有没有替代方案不需要此权限3. 这个权限会访问哪些敏感数据遵循最小化原则只申请功能必需的最少权限。过多的权限请求会显著降低用户的信任度增加应用被卸载的风险。例如如果只是需要模糊位置就申请ACCESS_COARSE_LOCATION而非ACCESS_FINE_LOCATION。3.2 运行时权限的动态申请用户面前的临门一脚对于危险权限声明只是拿到了“考试资格”真正的“考试”是在运行时。以下是动态申请权限的标准流程我建议你封装成一个工具类以便复用。步骤一检查权限状态在执行需要权限的操作前首先检查是否已经拥有该权限。// 以申请相机权限为例 private fun checkCameraPermission() { when { ContextCompat.checkSelfPermission( this, Manifest.permission.CAMERA ) PackageManager.PERMISSION_GRANTED - { // 权限已授予可以执行操作例如打开相机 openCamera() } shouldShowRequestPermissionRationale(Manifest.permission.CAMERA) - { // 用户之前拒绝过这里应该向用户解释为什么需要这个权限 showPermissionRationaleDialog() } else - { // 首次申请或用户选择了“不再询问”直接发起请求 requestCameraPermission() } } }shouldShowRequestPermissionRationale()方法是个关键点它返回true的情况是用户之前拒绝过权限请求但没有勾选“不再询问”的选项。这时是向用户解释权限用途的最佳时机。如果返回false则可能是第一次请求或者用户已经选择了“不再询问”。对于后者你通常需要引导用户去应用设置页手动开启权限。步骤二请求权限使用ActivityResultContracts.RequestPermission或RequestMultiplePermissions契约这是现代Android开发推荐的方式比传统的onRequestPermissionsResult回调更清晰。// 在Activity或Fragment中定义权限请求启动器 private val requestPermissionLauncher registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted: Boolean - if (isGranted) { openCamera() } else { // 权限被拒绝处理失败情况例如禁用相关功能按钮并提示用户 showPermissionDeniedMessage() } } // 发起请求的函数 private fun requestCameraPermission() { requestPermissionLauncher.launch(Manifest.permission.CAMERA) }步骤三处理“不再询问”的情况如果用户拒绝了权限并勾选了“不再询问”下次调用requestPermissions时系统会直接拒绝不会弹出对话框。你的应用需要优雅地处理这种情况。private fun showPermissionDeniedMessage() { AlertDialog.Builder(this) .setTitle(需要相机权限) .setMessage(此功能需要使用相机来拍摄照片。您已永久拒绝该权限如需使用请到应用设置中手动开启。) .setPositiveButton(去设置) { _, _ - // 跳转到应用详情设置页面 val intent Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { data Uri.fromParts(package, packageName, null) } startActivity(intent) } .setNegativeButton(取消, null) .show() }3.3 权限请求的最佳实践与用户体验设计权限请求的交互设计直接影响用户的决策。生硬地弹出一个系统对话框用户很可能因为不了解而选择拒绝。前置解释Pre-permission Rationale在触发权限请求前通过应用内的UI如一个弹窗或页面向用户解释为什么需要这个权限以及它能带来什么价值。例如一个图片编辑应用在用户点击“拍照”按钮时可以先展示一个提示“为了让你拍摄新照片进行编辑需要访问相机权限。”然后再触发系统请求。情境化请求在用户执行相关操作时请求权限而不是一启动应用就请求所有权限。这符合用户的预期授权率更高。优雅降级如果用户拒绝权限应用不应崩溃或完全无法使用。应该禁用依赖该权限的功能并友好地提示用户。例如如果用户拒绝位置权限地图应用可以显示一个默认区域并提供一个按钮提示开启位置服务以获得更好体验。处理多个权限如果需要同时申请多个权限如相机和录音使用ActivityResultContracts.RequestMultiplePermissions。但要注意一次性请求太多敏感权限会吓跑用户尽量按需分批请求。4. 高级话题与疑难杂症排查4.1 自定义权限定义与应用间的安全边界除了使用系统权限你还可以定义自己的权限来保护你应用中的组件如Activity、Service、BroadcastReceiver不被其他应用随意调用。定义自定义权限在声明权限的应用的AndroidManifest.xml中permission android:namecom.example.myapp.permission.MY_CUSTOM_PERMISSION android:descriptionstring/my_perm_desc // 权限描述在系统设置中显示 android:icondrawable/ic_perm_icon android:labelstring/my_perm_label // 权限名称 android:protectionLevelnormal / !-- 保护级别normal, dangerous, signature等 --保护级别protectionLevel详解normal/dangerous: 与系统权限类似前者安装时授予后者运行时申请。signature: 只有使用相同证书签名的应用才能获得此权限。用于同一开发者多个应用间的安全通信。signatureOrSystem: 更严格通常系统应用使用普通应用很少用。使用自定义权限在定义该权限的应用中你可以用它来保护组件activity android:name.MyPrivateActivity android:permissioncom.example.myapp.permission.MY_CUSTOM_PERMISSION ... /activity其他应用若想启动这个Activity必须在自己的清单文件中声明使用该权限uses-permission android:namecom.example.myapp.permission.MY_CUSTOM_PERMISSION /实操心得自定义权限的陷阱自定义权限的name必须全局唯一通常使用应用包名作为前缀。最大的坑在于权限的定义顺序。如果A应用定义了权限PB应用声明使用了P那么A应用必须先于B应用安装系统才能识别P这个权限。否则B应用的安装会失败或者无法获得权限。这在有多个应用互通的场景下需要仔细规划安装和更新顺序。4.2 权限相关典型问题与排查实录在实际开发中权限问题引发的Bug往往隐蔽且令人头疼。下面是我总结的几个常见场景和排查思路。问题一明明声明并申请了权限但功能依然失败如无法保存文件。排查步骤检查清单文件确认uses-permission标签是否拼写正确且位于manifest标签下application标签之外。检查权限分组对于运行时权限是否只在清单中声明而忘了在代码中动态申请用checkSelfPermission验证当前权限状态。检查Android版本对于存储、后台位置等权限其行为在Android不同版本如6.0、10.0、11.0、13.0有重大变化。确认你的代码逻辑是否针对目标API级别做了兼容处理。例如在Android 11即使有WRITE_EXTERNAL_STORAGE权限也无法直接通过路径访问共享存储中的其他应用文件必须使用MediaStoreAPI或存储访问框架SAF。检查权限作用域有些权限有更细粒度的限制。例如在Android 13通知权限被独立出来POST_NOTIFICATIONS之前的版本则不需要。再比如Android 10的位置权限分为“仅在使用该应用时允许”和“始终允许”如果你的应用需要在后台获取位置必须申请并引导用户授予“始终允许”权限。查看Logcat搜索Permission关键字系统经常会输出详细的权限拒绝日志。问题二权限请求对话框不弹出或回调不执行。排查步骤确认Activity/Fragment生命周期权限请求必须在UI组件Activity/Fragment处于活跃状态时发起。避免在异步任务的回调中直接请求可能此时Activity已经onPause或onDestroy了。检查registerForActivityResult的调用时机registerForActivityResult必须在组件生命周期开始onCreate或onStart时调用且不能放在launch函数内部。它是一个注册操作而非每次请求时创建。检查权限是否已被永久拒绝如果用户勾选了“不再询问”系统对话框将不会弹出。你的代码应该通过shouldShowRequestPermissionRationale判断并引导用户去设置页。模拟器/真机差异有些模拟器镜像或定制ROM可能存在权限系统的Bug。尝试在官方原生系统的真机上测试。问题三应用在后台无法执行需要权限的操作如定时上传位置。排查思路这是Android系统为了省电和隐私而不断加强的后台限制。从Android 8.0的后台服务限制到Android 10的后台位置访问限制再到Android 12的精确位置开关。后台位置需要申请ACCESS_BACKGROUND_LOCATION权限Android 10并且用户必须在设置中为你的应用选择“始终允许”位置权限。即使如此系统仍可能限制后台位置的更新频率。后台执行考虑使用WorkManager来安排可延迟的后台任务它能在满足条件如网络连接、充电状态和系统优化策略下执行。对于必须准确实时的任务可能需要前台服务Foreground Service并显示一个持续的通知。问题四如何处理来自热词中的“特殊权限”场景热词中提到了诸如“你需要来自administrators的权限才能删除什么原理”、“你需要来自trustedinstaller的权限”等这通常是Windows系统级别的权限概念与Android应用沙箱模型不同。但在Android开发中我们也会遇到类似“系统级”或“特殊”权限的概念系统签名权限signature|privileged这类权限通常只有预装在系统分区的应用系统应用才能持有。普通应用无法声明或使用。如果你的应用需要与这类深度系统功能交互如开关移动数据、静默安装应用通常需要设备root或与设备制造商合作将你的应用放入系统镜像。这对绝大多数第三方应用开发者来说是不可行的。Settings中可授予的特殊权限如“显示在其他应用上层”悬浮窗权限、“修改系统设置”、“电池优化忽略”等。这些权限无法通过标准的requestPermissionsAPI获取。你需要引导用户跳转到对应的系统设置页面进行手动开启。// 例如请求悬浮窗权限SYSTEM_ALERT_WINDOW if (!Settings.canDrawOverlays(this)) { val intent Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(package:$packageName)) startActivityForResult(intent, OVERLAY_PERMISSION_REQUEST_CODE) }处理这类权限的关键在于1. 检测是否已授权使用Settings类下的特定API如Settings.canDrawOverlays。2. 构造正确的Intent跳转到系统设置页。3. 在onActivityResult中处理用户操作结果。5. 权限测试与发布前检查清单权限问题在上架后很难修复因此发布前的测试至关重要。5.1 全面的权限测试策略分版本测试在Android 6.0-7.1、8.0-9.0、10、11、12、13等多个主要版本的真机或模拟器上进行测试。重点关注权限行为发生变化的版本点。权限授予/拒绝流程测试首次安装测试所有需要运行时权限的功能点。授予权限确保功能正常工作。拒绝权限确保应用不崩溃相关功能被妥善禁用或降级并有引导提示。“不再询问”后测试引导跳转设置页的流程是否顺畅。从设置中更改权限在应用运行时从系统设置中关闭/打开权限回到应用观察状态是否同步更新通常需要监听onResume并重新检查权限状态。权限组测试申请一个权限组中的某个权限如READ_CONTACTS然后检查同组其他权限WRITE_CONTACTSGET_ACCOUNTS是否被自动授予在代码中检查。后台权限测试对于位置、后台活动等测试应用进入后台后相关功能是否被系统正确限制。5.2 发布前权限自查清单在将APK提交到Google Play或其他商店前请对照此清单检查[ ]清单文件所有uses-permission声明都是功能必需的吗有无冗余权限android:maxSdkVersion设置是否正确[ ]隐私政策应用是否包含了清晰、透明的隐私政策链接隐私政策中是否详细说明了收集哪些数据、为何需要相关权限、数据如何存储和使用[ ]目标API级别是否已经更新到Google Play要求的最新版本高目标API级别通常意味着更严格的权限模型。[ ]敏感权限说明在Google Play Console的“应用内容”页面是否对申请的敏感权限如身体传感器、精确位置等提供了充分的理由说明[ ]沙盒测试是否在内部测试轨道Internal/Closed Testing进行了充分测试模拟了各种权限授予场景[ ]备用方案对于用户拒绝授予的关键权限应用是否有可用的备用方案或优雅的降级体验权限管理是Android开发中贯穿始终的课题它混合了技术实现、产品设计和用户体验。把权限处理好你的应用就成功了一半。最深的体会是永远不要假设用户会同意所有权限要把“权限被拒绝”当作一个正常的、必须处理的流程来设计。代码要健壮交互要友好解释要清晰。当你站在用户隐私和安全的角度去思考权限设计时做出的产品自然会赢得更多的信任。

相关新闻

今年 30+,干了 8 年前端开发,转 Agent 开发整整两年了

今年 30+,干了 8 年前端开发,转 Agent 开发整整两年了

今年 30,干了 8 年前端开发,转 Agent 开发整整两年了。 从最开始看着大模型文档一头雾水,到现在带团队帮企业落地线上 Agent 应用,我最大的感受就一句话:大部分想转 Agent 的程序员,从第一步就把重点给搞错…

2026/10/11 15:12:58 阅读更多 →
如何利用AI搭建企业知识库?

如何利用AI搭建企业知识库?

“ AI 知识库不是网盘升级版,而是企业的第二大脑。 很多企业不是没有资料,而是资料太多、太散、太难用。 ERP 里有订单和库存。OA 里有流程和制度。网盘里有项目方案。员工电脑里有报价单。移动硬盘里有历史资料。老员工脑子里还有大量经验、话术、排障方…

2026/10/12 13:16:23 阅读更多 →
Qwen3.6-27B 量化版来了

Qwen3.6-27B 量化版来了

这次英伟达也下场了,放出了nvidia/Qwen3.6-27B-NVFP4 乍一看很香:官方 ModelOpt 量化,Apache 2.0,vLLM 直接 serve,模型卡写着磁盘和 GPU 显存需求大约降低2.5x 但我翻完模型卡和社区 discussion 后,感觉有…

2026/10/10 14:20:49 阅读更多 →

最新新闻

DeepSeek AI接入企业微信:从API到聊天机器人的完整实现指南

DeepSeek AI接入企业微信:从API到聊天机器人的完整实现指南

简介:这是一套将DeepSeek大模型接入微信聊天的完整工程实现,适合具备基础Python技能、希望为个人微信账号提供智能对话能力的开发者。项目从模型加载、消息收发到前端交互均有配套代码,支持文本对话、Web界面操作,并附带文档上传与…

2026/10/12 17:53:21 阅读更多 →
Python数据分析实战:双十一美妆销售数据清洗与可视化

Python数据分析实战:双十一美妆销售数据清洗与可视化

简介:这份Python示例源码面向数据分析初学者与高校学生,以天猫双十一美妆销售数据为对象,演示从数据清洗、转换到可视化呈现的完整分析流程,适合用作课程大作业或数据分析入门练手项目。压缩包共17个文件、约5.08MB,包…

2026/10/12 17:53:21 阅读更多 →
汽车零件机器视觉检测:OpenCV工业落地实操指南

汽车零件机器视觉检测:OpenCV工业落地实操指南

简介:本资源是一篇发表于《汽车工艺与材料》2023年第7期的工程应用型技术论文,面向汽车制造企业工程师、智能制造方向研究人员及高校自动化/车辆工程专业师生,聚焦多车型混线生产中零件错装、漏装等质量管控难题。论文提出并实现了基于YOLOv5…

2026/10/12 17:53:21 阅读更多 →
药源网Scrapy爬虫实战:10万药品数据采集与跨源校验

药源网Scrapy爬虫实战:10万药品数据采集与跨源校验

简介:本资源是一套基于Python开发的药品数据采集与建库系统,面向计算机、电子信息及生物信息相关专业学生与初阶开发者,解决药品结构化数据获取难、数据库建设门槛高的实际问题。压缩包共51个文件,含23个核心Python脚本&#xff0…

2026/10/12 17:53:21 阅读更多 →
Python旅游推荐数据分析可视化:从数据清洗到协同过滤全流程实战

Python旅游推荐数据分析可视化:从数据清洗到协同过滤全流程实战

简介:这是一套基于Python、Django与MySQL的旅游推荐数据分析可视化项目,专为计算机相关专业毕业设计、课程设计及期末大作业设计,同时适合需要项目实战的Python学习者。项目内置协同过滤推荐算法,实现用户登录注册、个人信息管理、…

2026/10/12 17:53:21 阅读更多 →
Qt JSON实战指南:解析、序列化与避坑要点

Qt JSON实战指南:解析、序列化与避坑要点

很多刚接触Qt的开发者会在Json选型上纠结:到底用自带的QJsonDocument,还是引入第三方Json库。我的建议很简单——如果项目本身就是Qt技术栈,自带的Json支持完全够用,而且从Qt 5到Qt 6,这套API一直稳定保留。这篇文章不…

2026/10/12 17:52:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器: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/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/11 14:36:54 阅读更多 →