短视频app搭建:用MediaStore获取手机图库最新视频缩略图(含TaoToken配置)
1. 短视频 App 搭建里 MediaStore 取最新视频缩略图到底难在哪做短视频 App 搭建时首页顶部通常要放一个「最近拍摄」的入口展示手机图库里最新一条视频的缩略图。这个需求听起来简单真机跑起来却容易翻车Android 13 之后 READ_MEDIA_VIDEO 和 READ_MEDIA_IMAGES 分家老代码直接崩MediaStore 查询默认按 _ID 升序拿到的往往是第一条而不是最新一条缩略图用 MICRO_KIND 还是 MINI_KIND 分不清加载出来糊成马赛克再叠加接口联调时 Key 散落在各个模块调试成本翻倍。我试过在一台 Android 14 的机器上直接跑网上的老代码结果 cursor 返回 null日志里全是 SecurityException。后来把权限、排序、缩略图尺寸、接口通道四件事拆开处理才把「稳定展示最新视频缩略图」这个目标落地。这篇就按可跟做的顺序把 MediaStore 查询、缩略图加载配置以及用 TaoToken 统一 Key/API 通道做接口联调的验证步骤讲清楚。适合谁看正在做 Android 短视频 App、需要读取本地图库最新视频并展示缩略图的开发者对 MediaStore 权限适配、缩略图性能、接口联调通道有困惑的同学。核心检索词就是「Android MediaStore 获取最新视频缩略图」下面所有代码和配置都围绕它展开。先说清楚 MediaStore 能做什么它是 Android 系统提供的媒体库访问入口视频、图片、音频都通过 ContentResolver 查询。缩略图有两种模式KIND 字段区分 MICRO_KIND 和 MINI_KIND前者分辨率更低、内存占用小适合列表后者清晰一些适合大图预览。查询照片时把 Video 换成 Images 即可Uri 结构一致。理解这一点后面的排序和权限适配才有落脚点。2. TaoToken 前置准备统一 Key 与 API 通道短视频 App 搭建到联调阶段通常会遇到一个现实问题缩略图本地能显示了但「最新视频」还要上报给后端、拉取封面审核结果、或者调用模型做内容理解这时候接口的 Base URL、Key、Model ID 散落在各个 Activity 里改一次环境要翻半天。TaoToken 在这里的作用是把这些通道统一起来一个 Key 走完对话、编码、Agent 类接口减少联调时的变量。你需要先拿到 Key。打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。API 基础地址统一用 https://taotoken.net/api 注意这个地址不加 UTM 参数直接作为 Base URL 填进配置。如果你只是想在联调前验证模型通道是否通可以用模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 先发一条测试消息。长期做编码和 Agent 任务的话Coding Plan 页面在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。Claude Code 相关的接入说明在 https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。这里要强调一个原则TaoToken 是接口通道不是编辑器替代品也不要用它直连生产数据库。它的定位是让你在短视频 App 联调时把「本地缩略图展示」和「远端接口调用」两条线分开本地用 MediaStore远端用统一 Key 走 API互不干扰。拿到 Key 后先别急着写进代码下一步我们用配置文件把它管起来。3. 可复制配置MediaStore 查询 缩略图加载 通道配置这一节是全文的核心分三块MediaStore 查询最新视频、缩略图加载、以及 TaoToken 的配置文件片段。路径和原文保持一致直接复制即可。3.1 MediaStore 查询最新一条视频关键点是排序。MediaStore 默认按 _ID 升序要拿最新一条用 DATE_ADDED 或 DATE_TAKEN 降序并且 limit 1。Android 10 之后推荐用 Bundle 传 queryArgs兼容性更好。// VideoRepository.kt fun queryLatestVideo(context: Context): Uri? { val collection MediaStore.Video.Media.EXTERNAL_CONTENT_URI val projection arrayOf( MediaStore.Video.Media._ID, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.DATE_ADDED ) val selection ${MediaStore.Video.Media.DATE_ADDED} ? val selectionArgs arrayOf(0) val sortOrder ${MediaStore.Video.Media.DATE_ADDED} DESC val queryArgs Bundle().apply { putStringArray(ContentResolver.QUERY_ARG_SORT_COLUMNS, arrayOf(MediaStore.Video.Media.DATE_ADDED)) putInt(ContentResolver.QUERY_ARG_SORT_DIRECTION, ContentResolver.QUERY_SORT_DIRECTION_DESCENDING) putInt(ContentResolver.QUERY_ARG_LIMIT, 1) } context.contentResolver.query( collection, projection, queryArgs, null )?.use { cursor - if (cursor.moveToFirst()) { val id cursor.getLong( cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)) return ContentUris.withAppendedId(collection, id) } } return null }如果你要兼容 Android 9 及以下把 queryArgs 换成传统的 selection/sortOrder 重载即可逻辑一致。查询照片时把MediaStore.Video.Media全部替换为MediaStore.Images.MediaUri 换成EXTERNAL_CONTENT_URI的 Images 版本。3.2 缩略图加载配置拿到 Uri 后用 loadThumbnail 生成缩略图Android 10 之后推荐这个方法内部会处理尺寸。老设备用 Thumbnails.getThumbnailKIND 选 MICRO_KIND 省内存。// ThumbnailLoader.kt fun loadThumbnail(context: Context, uri: Uri, size: Size): Bitmap? { return if (Build.VERSION.SDK_INT Build.VERSION_CODES.Q) { context.contentResolver.loadThumbnail(uri, size, null) } else { val id ContentUris.parseId(uri) MediaStore.Video.Thumbnails.getThumbnail( context.contentResolver, id, MediaStore.Video.Thumbnails.MICRO_KIND, null ) } }尺寸建议列表用 200x200大图预览用 512x512。MICRO_KIND 分辨率更低适合 RecyclerView 复用MINI_KIND 清晰但内存占用高别在长列表里用。3.3 TaoToken 通道配置片段把 Key 和 Base URL 放进local.properties或gradle.properties不要硬编码进 Kotlin。下面是一个 settings 风格的 JSON 片段路径按你项目实际调整。{ taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-你的Key, modelId: 你的模型ID, timeoutMs: 30000 } }如果你用 Codex 的 auth.json结构类似{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: 你的模型ID }三件套记牢Base URL 用https://taotoken.net/apiKey 从 api-keys 页面拿Model ID 按你控制台里开通的填。Cline MCP 或 CC Switch 场景下同样把这三项填进对应配置不要只填 Key 漏掉 Base URL。4. 验证请求与成功结果配置写完先验证本地缩略图再验证远端通道两条线都通了才算稳。本地验证在 Activity 里调用 queryLatestVideo把返回的 Uri 传给 loadThumbnail设置到 ImageView。真机上打开 App如果图库里有视频应该能看到最新一条的缩略图。日志里打印 Uri 和 Bitmap 尺寸确认不是 null。lifecycleScope.launch(Dispatchers.IO) { val uri queryLatestVideo(thisMainActivity) val bitmap uri?.let { loadThumbnail(thisMainActivity, it, Size(200, 200)) } withContext(Dispatchers.Main) { findViewByIdImageView(R.id.ivLatest).setImageBitmap(bitmap) } }远端验证用 curl 或 Postman 打一次 TaoToken 的接口确认 Key 和 Base URL 生效。curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d { model: 你的模型ID, messages: [{role: user, content: ping}] }成功的话返回 JSON 里会有 choices 字段内容正常。如果返回 401说明 Key 不对如果报 local proxy failed检查 Base URL 是不是写成了带 UTM 的地址正确写法是https://taotoken.net/api不带参数。如果报 reading choices 相关错误多半是响应结构解析问题确认你用的是标准 chat completions 格式。实测下来本地缩略图和远端通道分开验证排障效率高很多。先保证 MediaStore 查询返回非空再保证接口返回 200最后把两者串起来做业务逻辑。5. 本篇常见错排查这一节按真实报错来对照着查。401 UnauthorizedKey 错误或没带 Authorization 头。检查 api-keys 页面复制的 Key 是否完整Bearer 后面有没有空格。TaoToken 的 Key 只在创建时显示一次丢了就重新建一个。local proxy failedBase URL 写错。常见错误是复制了带 UTM 的官网地址当 API 地址。API 地址固定为https://taotoken.net/api不加任何查询参数。如果你在 CC Switch 或 Cline MCP 里配置同样只填这个。reading choices 报错响应解析失败。确认请求体是标准 chat completions 格式model 字段填的是你控制台开通的 Model ID不是随便写的名字。如果用的是 Codex auth.json检查字段名是 base_url 还是 baseUrl不同工具大小写敏感。OAuth 相关报错多见于 Claude Code 接入场景。如果你走的是 ClaudeCodeAnthropic 通道确认接入方式选对不要混用 OAuth 和 API Key 两种模式。文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 有对应说明。MediaStore 返回 null权限没给。Android 13 及以上要动态申请 READ_MEDIA_VIDEOAndroid 12 及以下用 READ_EXTERNAL_STORAGE。别只在 Manifest 里声明运行时也要请求。另外查询时如果图库里确实没有视频返回 null 是正常的做好空态处理。缩略图模糊KIND 选错。列表用 MICRO_KIND预览用 MINI_KIND。如果还是糊检查传入的 Size 是不是太小200x200 在低密度屏上会拉伸。cursor 泄漏query 返回的 cursor 必须 close用 use 块包起来。上面代码已经处理别自己改成手动 close 漏掉异常分支。6. 接入与排障通道把上面几步跑通后短视频 App 的「最新视频缩略图」基本就稳了。本地这条线靠 MediaStore 查询加缩略图加载远端这条线靠 TaoToken 统一 Key 和 Base URL。两条线分开调试出问题好定位。如果你在接入过程中卡在 Key 或通道配置直接去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 重新拿一个再对照接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 检查字段。想先验证模型通道是否通用模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 发一条消息最快。长期做编码和 Agent 任务的话Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 更适合。最后留一个实用技巧把 queryLatestVideo 和 loadThumbnail 封装成 Repository加一层内存缓存避免每次 onResume 都重新查询。真机上频繁查询 MediaStore 会有明显卡顿缓存后体验顺很多。缩略图展示这块稳定比花哨重要。

相关新闻

新手接入 Claude API,最容易忽略的五个配置项:TaoToken 统一 Key 通道实践

新手接入 Claude API,最容易忽略的五个配置项: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/2 16:25:17 阅读更多 →
2026-10-01-v2-职业发展-数字孪生从业者职业路径指南

2026-10-01-v2-职业发展-数字孪生从业者职业路径指南

数字孪生从业者职业路径全解析:从入门到专家的成长指南 前言 数字孪生行业的高速发展,创造了大量的就业机会,很多人想要进入这个行业,但对数字孪生行业的职业路径、岗位要求、发展前景都不太了解。本文将全面解析数字孪生行业的职…

2026/10/2 16:24:16 阅读更多 →
HowToCook 凉拌豆腐实战指南:北豆腐焯水、酱汁配比与凉拌方法论全解析

HowToCook 凉拌豆腐实战指南:北豆腐焯水、酱汁配比与凉拌方法论全解析

文档教程 【免费下载链接】HowToCook Programmers guide about how to cook at home. 项目地址: https://gitcode.com/GitHub_Trending/ho/HowToCook 点击查看 免费下载 导读 本篇技术指南以 HowToCook 开源菜谱仓库中的 凉拌豆腐 为核心,系统拆解这道…

2026/10/2 16:24:16 阅读更多 →

最新新闻

美学设计型电源轨道系统技术选型与供应商评估维度

美学设计型电源轨道系统技术选型与供应商评估维度

在家装全屋整装、商装办公空间、展厅、酒店等项目中,用电设施的视觉融入度已成为空间设计的重要考量。传统固定插座存在位置突兀、样式与装修风格协调性不足等问题,电源轨道系统凭借取电点位可调、外观形态简约的技术特性,逐步成为柔性配电与…

2026/10/2 16:53:24 阅读更多 →
从零自制电调与VESC:AM32固件配置、FOC调试与硬件选型实战

从零自制电调与VESC:AM32固件配置、FOC调试与硬件选型实战

1. 从一堆炸掉的MOS管说起:为什么我要自己折腾电调和VESC第一次接触电调是在三年前,当时手里攒了一堆航模无刷电机,想给一台自组的穿越机做动力系统。买过几款成品电调,飞了几次就烧了,拆开一看,MOS管炸得面…

2026/10/2 16:53:24 阅读更多 →
HIL测试中的总线与通信协议:从CAN到车载以太网实战指南

HIL测试中的总线与通信协议:从CAN到车载以太网实战指南

从事汽车电子相关开发这么多年,一个项目从模型在环(MIL)到软件在环(SIL),再到硬件在环(HIL)和实车路测,越到后面,越会发现一个事实:HIL测试里你真…

2026/10/2 16:53:24 阅读更多 →
EMI超标频点反推电路缺陷的三步定位法

EMI超标频点反推电路缺陷的三步定位法

1. 项目概述:为什么“从超标频点反推源头”是EMC工程师的硬核基本功做硬件的同行,尤其是电源、通信、工控类板卡的Layout工程师,大概率都经历过这种深夜崩溃时刻:样机送进电波暗室,测试报告一出来,30MHz附近…

2026/10/2 16:53:24 阅读更多 →
EMC预测试实战:从超标频点反推Layout整改

EMC预测试实战:从超标频点反推Layout整改

做硬件十年,我越来越觉得“EMC 预测试”最有价值的地方,不是那份测试报告,而是报告上每一个超标频点:它们像坐标一样指向辐射源头,帮你把问题定位回 Layout 的某个具体区域。这篇文章不聊教科书上的场论公式&#xff0…

2026/10/2 16:53:24 阅读更多 →
汽车测试数据采集全链路解析:从传感器到HIL/PIL的工程实践

汽车测试数据采集全链路解析:从传感器到HIL/PIL的工程实践

汽车测试这个领域,外行看着就是"把车开上试验台跑一圈",但真正做过整车或零部件验证的人都知道,从传感器信号采集到数据入库,中间隔着一堆协议转换、时钟同步、量纲对齐的脏活累活。Axiometrix Solutions 这套一站式方案…

2026/10/2 16:52:24 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/2 10:36:31 阅读更多 →
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/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练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/2 6:09:11 阅读更多 →