更新记录
1.0.2(2026-06-03)
- 修复 Harmony 真机 ArkTS 编译失败:规避
arkts-no-structural-typing,不再把具体 options 或对象字面量结构化传给公共接口。 - 修复 Harmony
implements类型限制:CastEvent / CastCallbacks / CastCapabilities / CastSessionState调整为真正的interface,避免arkts-implements-only-iface。 - 修复 Harmony 回调适配器可选字段类型:
success / fail / complete保持 optional/undefined 语义,不再把null赋给CastCallbacks可选回调。 - 同步发布版本口径:
package.json、README、运行诊断版本、商业 readiness、结构守卫、商业守卫、readiness 报告和证据包版本统一到1.0.2。
1.0.1(2026-06-03)
- 修复平台标记检查:兼容当前
package.json的 uni-app / uni-app x 嵌套平台声明,同时保留 Harmony、Web/H5、小程序、快应用只提供降级入口的说明。 - 修复 readiness 版本口径:交付状态文件和 readiness 报告脚本同步到
1.0.1,避免状态报告仍检查旧版本。 - 修复 iOS UTS 类型导入:补充
CastCallbacks导入,并保持 iOS 回调 helper 集中收口,已通过 iOS LSP lint。
1.0.0(2026-06-02)
- 首发版本:
lizhao-cast-screen定位为暗黑科技风媒体投屏 UTS 插件,面向 uni-app / uni-app x 提供 Android DLNA/UPnP 与 iOS AirPlay 的跨端投屏能力。 - Android 真实实现 DLNA/UPnP 媒体投屏:支持 SSDP 多网卡搜索、设备去重、连接、播放远程 http/https 媒体 URL、暂停、恢复、seek、音量、停止和断开。
- iOS 真实接入系统 AirPlay 路由入口:内置面板承载 AVRoutePickerView,使用 AVPlayer 外部播放能力承接远程媒体 URL,不做私有 AirPlay 反射。
- 内置暗黑科技风投屏面板:底部近全屏、深色基底、高对比青绿色交互、科技玻璃卡片、横向媒体胶囊和环形发光控制盘;同时支持 dark / light / auto 主题。
- 连接设备后自动切换为投屏控制台:支持选集、上一集、下一集、清晰度、进度、时长、音量、投屏当前媒体、暂停/恢复、快退 15 秒、快进 15 秒、停止投屏和断开设备。
- 暴露完整业务事件:支持
onCastEvent/offCastEvent、showCastPanel({ useBuiltinUI:false })和customAction,业务可完全自定义投屏界面。 - 新增诊断与售后能力:
getCastDiagnostics、exportCastSupportBundle、inspectCastMediaSource可输出能力矩阵、会话状态、设备列表、媒体源风险和建议动作。 - 明确商业边界:首版只支持电视/盒子可访问的远程媒体 URL;本地文件、DRM、需登录鉴权的私有视频、屏幕镜像和录屏推流不伪造成功。
- 降级端保持统一 API:Harmony/Web/微信小程序/支付宝小程序返回明确不支持或
supported:false,只保留业务自定义入口,不声明真实投屏成功。 - 配套发布资料:README、错误码、权限说明、自定义基座说明、Android/iOS 验收脚本、插件市场封面和示例图已同步首发版本。
平台兼容性
uni-app(5.07)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
uni-app x(5.07)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
lizhao-cast-screen
lizhao-cast-screen 是一个面向 uni-app / uni-app x 的商业级 UTS 媒体投屏插件。插件最大特色是内置暗黑科技风投屏面板:底部近全屏呈现、深浅色主题、设备扫描、选集、清晰度、进度、音量、快进快退和断开控制都在插件内部完成;业务也可以通过事件完全自定义界面。
当前版本:1.0.2
功能特色
- Android 使用 DLNA/UPnP 实现媒体投屏:支持 SSDP 搜索、设备去重、连接、播放普通
httpMP4 / https 远程媒体 URL、暂停、恢复、seek、音量、停止和断开。 - iOS 接入系统 AirPlay 路由入口:内置底部近全屏面板承载
AVRoutePickerView,通过AVPlayer.currentTime同步会话进度快照,不做私有 AirPlay 反射。 - 内置面板状态覆盖搜索中、设备列表、连接中、已连接、投屏中、已暂停、无设备、失败可重试,面板只展示真实状态,不伪造设备发现、连接或投屏成功。
- 连接设备后自动切换为紧凑产品级控制台和暗黑科技风微光媒体控制台,提供选集、清晰度、顶部单图标主题按钮、快退 15 秒、快进 15 秒、音量加减、投屏当前媒体和原地刷新。
- 标题右侧扫描设备入口默认可用,不再展示“使用业务自定义界面”按钮;业务自定义入口请使用
showCastPanel({ useBuiltinUI: false })与事件回调。 - 支持
dark / light / auto主题。auto跟随系统,dark适合影音投屏场景,light适合浅色业务页面。 - 提供
getCastDiagnostics、exportCastSupportBundle、inspectCastMediaSource,方便线上诊断设备、媒体源和投屏状态。
支持平台
| 平台 | 是否支持 | 说明 |
|---|---|---|
| App Android | 支持 | 真实 DLNA DMR 媒体投屏,需要自定义基座;Android 9/API 28+ 已配置 cleartext 边界。 |
| App iOS | 支持 | 真实 AirPlay 路由入口与 AVPlayer 外部播放,需要自定义基座。 |
| Harmony | 降级 | 返回 supported:false,保留业务自定义入口,不伪造投屏成功。 |
| Web/H5 | 降级 | 返回 supported:false,不伪造设备发现。 |
| 微信小程序 | 降级 | 返回 supported:false,可展示业务入口事件。 |
| 支付宝小程序 | 降级 | 返回 supported:false,可展示业务入口事件。 |
插件市场平台标记说明
插件市场平台标记会按 uni-app / uni-app x 跨端可安装和可调用能力展示;真实投屏能力仍按“真实投屏能力”标记和说明:App Android / App iOS 支持原生 DLNA/AirPlay,Harmony、Web/H5、小程序和快应用只提供统一 API 与降级入口。源码中保留 app-harmony、web、mp-weixin、mp-alipay 平台目录,是为了让业务可以获得 supported:false 能力矩阵和 useBuiltinUI:false 自定义入口,不代表这些端可以真实发现设备或投屏成功。
安装说明
- 将插件放入项目的
uni_modules/lizhao-cast-screen目录。 - 页面中只从插件根目录导入,不要导入
utssdk子路径。 - App Android / App iOS 使用真实原生能力时,需要重新制作并安装自定义基座。
- H5、小程序、Harmony 可以调用同名 API 获取降级能力,但不要在 UI 中声明真实投屏成功。
import * as CastScreen from '@/uni_modules/lizhao-cast-screen'
如只需要类型,也可以从根入口使用公开类型;插件内部 utssdk/api.uts 是 API 汇总实现文件,业务页面仍应从插件根目录导入。
示例代码位置
插件内部已内置完整演示页面:
uni_modules/lizhao-cast-screen/example/castScreen.vue
使用方式:
- 将
uni_modules/lizhao-cast-screen/example/castScreen.vue复制到项目页面目录,例如pages/castScreen/castScreen.vue。 - 在
pages.json中增加页面路由。 - App 端重新运行到自定义基座;如果本轮只复制页面、不改插件原生代码,可以直接运行页面验证 UI 与 API 调用。
{
"pages": [
{
"path": "pages/castScreen/castScreen",
"style": {
"navigationBarTitleText": "投屏控制演示"
}
}
]
}
示例页包含:内置面板、业务自定义面板、扫描设备、连接设备、开始投屏、暂停/恢复、seek、音量、停止、诊断包和媒体源预检。它是项目中 pages/castScreen/castScreen.vue 的插件内置副本,便于用户安装插件后直接参考。
快速开始
import * as CastScreen from '@/uni_modules/lizhao-cast-screen'
CastScreen.initCast({
debug: true,
autoStartDiscovery: false,
success() {
console.log('投屏插件初始化完成')
},
fail(err) {
console.log('投屏插件初始化失败', err)
}
})
const capabilities = CastScreen.getCastCapabilities()
console.log('投屏能力', capabilities)
展示内置投屏面板
CastScreen.showCastPanel({
title: '投屏到电视',
subtitle: '请选择同一 Wi-Fi 下的设备',
theme: 'auto',
media: {
url: 'http://media.w3.org/2010/05/sintel/trailer.mp4',
title: 'Sintel Trailer',
mimeType: 'video/mp4'
},
episodes: [
{
id: 'ep-1',
title: '第 1 集 Sintel 预告',
url: 'http://media.w3.org/2010/05/sintel/trailer.mp4',
mimeType: 'video/mp4',
episodeIndex: 1
},
{
id: 'ep-2',
title: '第 2 集 Big Buck Bunny',
url: 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4',
mimeType: 'video/mp4',
episodeIndex: 2
}
],
qualities: [
{ id: 'auto', label: '自动', selected: true },
{ id: '720p', label: '720P', url: 'http://media.w3.org/2010/05/sintel/trailer.mp4', mimeType: 'video/mp4' },
{ id: '1080p', label: '1080P' }
],
showThemeToggle: true,
success() {
console.log('内置投屏面板已展示')
}
})
浅色主题示例:
CastScreen.showCastPanel({
theme: 'light',
title: '投屏到会议屏',
subtitle: '浅色业务页面推荐使用 light 主题'
})
选集或清晰度项带 url 时,用户点击对应项会触发真实 startCast 流程;如果不带 url,插件只派发 customAction 给业务层,不会伪造投屏成功。
业务自定义界面示例
CastScreen.onCastEvent('*', (event) => {
if (event.name == 'customAction') {
console.log('业务自定义事件', event.payload)
}
if (event.name == 'deviceListChange') {
console.log('设备列表变化', event.payload)
}
})
CastScreen.showCastPanel({
useBuiltinUI: false,
title: '业务自定义入口',
showCustomAction: true,
customActionText: '打开业务投屏弹窗'
})
useBuiltinUI:false 在降级端也可以触发业务入口;但如果能力矩阵返回 supported:false,请在业务 UI 中提示“当前平台暂不支持真实投屏”,不要伪造设备发现或投屏成功。
iOS 真机建议业务自定义入口同时传入 showCustomAction:true 或 customActionText,避免可选布尔字段在桥接默认值中与内置面板调用混淆。
API 列表
| API | 说明 |
|---|---|
initCast |
初始化投屏运行时。 |
getCastCapabilities |
获取平台能力矩阵。 |
startDiscovery |
开始搜索设备。 |
stopDiscovery |
停止搜索设备。 |
getDiscoveredDevices |
获取当前缓存设备列表。 |
showCastPanel |
展示内置底部近全屏面板或业务自定义入口。 |
hideCastPanel |
隐藏内置面板。 |
connectDevice |
连接指定投屏设备。 |
disconnectDevice |
断开当前设备。 |
startCast |
开始投屏媒体 URL。 |
pauseCast |
暂停远端播放。 |
resumeCast |
恢复远端播放。 |
seekCast |
跳转远端播放进度。 |
setCastVolume |
设置远端音量。 |
stopCast |
停止远端播放。 |
getCastSessionState |
获取会话状态。 |
getCastDiagnostics |
获取运行诊断快照。 |
exportCastSupportBundle |
导出售后诊断包。 |
inspectCastMediaSource |
预检媒体源是否适合投屏。 |
onCastEvent |
监听投屏事件。 |
offCastEvent |
移除投屏事件监听。 |
完整 API 行为速查
| API | 支持平台 | 返回/回调 | 失败或降级说明 |
|---|---|---|---|
initCast(options) |
全平台 | 回调 | 不支持平台返回 9030001。 |
getCastCapabilities(options?) |
全平台 | CastCapabilities |
降级端返回 supported:false。 |
startDiscovery(options) |
Android/iOS | 回调 | Android 搜索 DLNA DMR;iOS 进入系统路由发现态;降级端失败。 |
stopDiscovery(options?) |
全平台 | 回调 | 降级端安全收口。 |
getDiscoveredDevices(options?) |
全平台 | Array<CastDevice> |
无设备返回空数组,不伪造设备。 |
showCastPanel(options?) |
Android/iOS | 回调 | 原生面板失败返回 9030010;useBuiltinUI:false 可走业务入口。 |
hideCastPanel(options?) |
全平台 | 回调 | 面板不存在时安全收口。 |
connectDevice(options) |
Android/iOS | 回调 | 设备不存在或平台不支持返回失败。 |
disconnectDevice(options?) |
Android/iOS | 回调 | 可选 stopRemote 停止远端播放。 |
startCast(options) |
Android/iOS | 回调 | 只支持电视可访问的远程媒体 URL。 |
pauseCast(options?) |
Android/iOS | 回调 | 当前无会话或平台不支持返回失败。 |
resumeCast(options?) |
Android/iOS | 回调 | 当前无会话或平台不支持返回失败。 |
seekCast(options) |
Android/iOS | 回调 | position 小于 0 返回参数错误。 |
setCastVolume(options) |
Android/iOS | 回调 | volume 范围为 0-1。 |
stopCast(options?) |
Android/iOS | 回调 | 当前无会话时安全收口或返回控制失败。 |
getCastSessionState(options?) |
全平台 | CastSessionState |
降级端返回空会话状态。 |
getCastDiagnostics(options?) |
全平台 | CastDiagnostics |
不伪造 runtimeVerified。 |
exportCastSupportBundle(options?) |
全平台 | CastSupportBundle |
只导出运行态信息和建议动作。 |
inspectCastMediaSource(options) |
全平台 | CastMediaInspection |
不联网探测,只做静态风险判断。 |
onCastEvent(eventName, callback) |
全平台 | 持续监听 | eventName 为字符串,推荐传入 CastEventName 或 *。 |
offCastEvent(eventName, callback?) |
全平台 | 无 | callback 为空时移除该事件名下全部监听。 |
事件说明
事件回调签名为 (event: CastEvent) => void,eventName 为字符串。推荐传入 CastEventName 中的事件名,或传入 * 监听全部事件。
| 事件 | 说明 |
|---|---|
ready |
运行时初始化完成。 |
discoveryStart |
开始搜索设备。 |
discoveryStop |
停止搜索设备。 |
deviceFound |
发现单个设备。 |
deviceLost |
设备离线或被移除。 |
deviceListChange |
设备列表变化。 |
panelShow |
内置面板展示或业务入口触发。 |
panelHide |
内置面板关闭。 |
connectStart |
开始连接设备。 |
connected |
设备连接成功。 |
disconnected |
设备断开。 |
castStart |
开始投屏媒体。 |
stateChange |
会话状态变化。 |
progress |
播放进度变化。 |
volumeChange |
音量变化。 |
customAction |
内置面板选集、清晰度、主题、业务按钮等操作事件。 |
error |
投屏错误。 |
initCast(options)
说明 初始化投屏运行时,可选自动启动搜索。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | InitCastOptions | 是 | 初始化参数。 | 无 | debug / autoStartDiscovery / discoveryTimeoutMs / success / fail / complete |
| options.debug | boolean | 否 | 是否输出精简中文调试日志。 | false | true / false |
| options.autoStartDiscovery | boolean | 否 | 初始化后是否自动搜索设备。 | false | true / false |
| options.discoveryTimeoutMs | number | 否 | 搜索超时时间,单位毫秒。 | 8000 | 无 |
startDiscovery(options)
说明
开始搜索投屏设备。Android 会搜索 DLNA DMR;模拟器、企业网络或组播受限时,可传 manualDeviceDescriptionUrl 指向已知 device.xml。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | StartDiscoveryOptions | 是 | 搜索参数。 | 无 | timeoutMs / clearBeforeStart / manualDeviceDescriptionUrl / success / fail / complete |
| options.timeoutMs | number | 否 | 搜索超时时间,单位毫秒。 | 8000 | 无 |
| options.clearBeforeStart | boolean | 否 | 是否清空旧设备再搜索。 | true | true / false |
| options.manualDeviceDescriptionUrl | string | 否 | 手动指定 DLNA DMR 设备描述地址;例如模拟器访问电脑服务时可用 dmrDeviceUrl 或 10.0.2.2 场景。 |
无 | 无 |
showCastPanel(options)
说明
展示插件内置投屏面板。Android/iOS 是原生底部近全屏面板;降级端建议用 useBuiltinUI:false 触发业务自定义入口。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | CastPanelOptions | 否 | 面板配置。 | {} |
无 |
| options.useBuiltinUI | boolean | 否 | 是否使用插件内置 UI。 | true | true / false |
| options.theme | string | 否 | 内置面板主题。 | Android 默认 dark,iOS 默认 auto |
dark / light / auto |
| options.title | string | 否 | 面板标题。 | 投屏到电视 | 无 |
| options.subtitle | string | 否 | 面板副标题。 | 请选择同一 Wi-Fi 下的设备 | 无 |
| options.media | CastMediaSource | 否 | 连接后控制台默认媒体,带 URL 时可直接投屏。 | 无 | 无 |
| options.mediaTitle | string | 否 | 控制台媒体标题。 | 当前媒体标题 | 无 |
| options.mediaSubtitle | string | 否 | 控制台媒体副标题。 | 无 | 无 |
| options.currentEpisodeIndex | number | 否 | 当前选集下标,从 0 开始。 | 0 | 无 |
| options.episodes | Array |
否 | 内置面板选集列表。 | [] |
无 |
| options.currentQuality | string | 否 | 当前清晰度 ID 或文案。 | 无 | 无 |
| options.qualities | Array |
否 | 内置面板清晰度列表。 | [] |
无 |
| options.showThemeToggle | boolean | 否 | 是否显示顶部单图标主题按钮。 | true | true / false |
| options.showEpisodeControls | boolean | 否 | 是否显示选集和上一集/下一集。 | true | true / false |
| options.showQualityControls | boolean | 否 | 是否显示清晰度切换。 | true | true / false |
| options.showRefresh | boolean | 否 | 是否显示扫描设备入口。 | true | true / false |
| options.showCustomAction | boolean | 否 | 是否显示业务自定义入口。 | false | true / false |
| options.customActionText | string | 否 | 业务入口文案。 | 使用业务自定义界面 | 无 |
startCast(options)
说明
开始投屏远程媒体 URL。首版仅支持电视/盒子可访问的 http/https 媒体地址。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | StartCastOptions | 是 | 开始投屏参数。 | 无 | deviceId / media / autoConnect / success / fail / complete |
| options.deviceId | string | 否 | 目标设备 ID,未传时使用当前连接设备。 | 当前设备 | 无 |
| options.media | CastMediaSource | 是 | 媒体资源。 | 无 | 无 |
| options.autoConnect | boolean | 否 | 是否自动连接目标设备。 | true | true / false |
| options.media.url | string | 是 | 媒体 URL。 | 无 | http / https |
| options.media.title | string | 否 | 媒体标题。 | 无 | 无 |
| options.media.mimeType | string | 否 | MIME 类型,例如 video/mp4。 |
无 | 无 |
| options.media.startPosition | number | 否 | 起播位置,单位秒。 | 0 | 无 |
seekCast(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | SeekCastOptions | 是 | 跳转参数。 | 无 | position / success / fail / complete |
| options.position | number | 是 | 目标位置,单位秒。 | 无 | 大于等于 0 |
setCastVolume(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | SetCastVolumeOptions | 是 | 音量参数。 | 无 | volume / success / fail / complete |
| options.volume | number | 是 | 音量,范围 0-1。 | 无 | 0-1 |
getCastDiagnostics(options?)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | GetCastDiagnosticsOptions | 否 | 诊断参数。 | { includeDevices:false } |
无 |
| options.includeDevices | boolean | 否 | 是否带上设备列表。 | false | true / false |
exportCastSupportBundle(options?)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | ExportCastSupportBundleOptions | 否 | 售后诊断包参数。 | { includeDevices:true, includeRecentEvents:true, maxEvents:20 } |
无 |
| options.includeDevices | boolean | 否 | 是否包含设备列表。 | true | true / false |
| options.includeRecentEvents | boolean | 否 | 是否包含最近事件。 | true | true / false |
| options.maxEvents | number | 否 | 最近事件最大数量。 | 20 | 1-80 |
inspectCastMediaSource(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | InspectCastMediaSourceOptions | 是 | 媒体源预检参数。 | 无 | media / success / fail / complete |
| options.media | CastMediaSource | 是 | 待检查媒体源。 | 无 | 无 |
返回值说明
CastCapabilities
| 字段 | 类型 | 说明 |
|---|---|---|
| supported | boolean | 当前平台是否支持真实投屏。 |
| platform | string | 平台名称。 |
| adapter | string | 适配器,例如 dlna / airplay / fallback。 |
| discovery | boolean | 是否支持设备搜索。 |
| builtinPanel | boolean | 是否支持内置面板。 |
| mediaCast | boolean | 是否支持媒体 URL 投屏。 |
| systemRoute | boolean | 是否接入系统路由。 |
| pause | boolean | 是否支持暂停。 |
| resume | boolean | 是否支持恢复。 |
| seek | boolean | 是否支持进度跳转。 |
| volume | boolean | 是否支持音量控制。 |
| requiresCustomBase | boolean | 是否建议自定义基座。 |
| reason | string | 不支持原因。 |
CastSessionState
| 字段 | 类型 | 说明 |
|---|---|---|
| initialized | boolean | 是否已初始化。 |
| discovering | boolean | 是否正在搜索设备。 |
| state | CastConnectionState | 当前连接/播放状态。 |
| currentDevice | CastDevice | null | 当前设备。 |
| currentMedia | CastMediaSource | null | 当前媒体。 |
| devices | Array |
设备列表。 |
| currentTime | number | 当前播放进度,单位秒。 |
| duration | number | 媒体总时长,单位秒。 |
| volume | number | 音量,范围 0-1。 |
| lastError | CastFail | null | 最近一次错误。 |
会话进度快照来源:Android 优先通过 DLNA GetPositionInfo 获取 RelTime / TrackDuration;iOS 通过 AVPlayer.currentTime 与媒体时长同步。
CastMediaInspection
| 字段 | 类型 | 说明 |
|---|---|---|
| castable | boolean | 是否适合进入首版投屏流程。 |
| httpUrl | boolean | 是否为 http/https。 |
| localFile | boolean | 是否疑似本地文件。 |
| drmSuspected | boolean | 是否疑似 DRM 或加密流。 |
| authSuspected | boolean | 是否疑似私有鉴权。 |
| likelyVideo | boolean | 是否疑似视频媒体。 |
| riskFlags | Array |
风险标记,例如 https-dlna-risk。 |
| suggestions | Array |
中文建议。 |
| message | string | 中文摘要。 |
错误码
| 错误码 | 含义 | 说明 |
|---|---|---|
| 9030001 | unsupported | 当前平台不支持真实投屏或未打入自定义基座。 |
| 9030002 | invalid params | 参数不合法,例如媒体 URL 为空。 |
| 9030003 | context unavailable | 运行时上下文不可用。 |
| 9030004 | discovery failed | 搜索投屏设备失败。 |
| 9030005 | device not found | 未找到可用设备。 |
| 9030006 | connect failed | 连接设备失败。 |
| 9030007 | media unsupported | 媒体地址不可投屏。 |
| 9030008 | cast failed | 投屏播放失败。 |
| 9030009 | control failed | 投屏控制命令失败。 |
| 9030010 | panel failed | 投屏内置界面展示失败。 |
权限说明
Android 需要以下权限,插件已在 AndroidManifest.xml 声明:
| 权限 | 说明 |
|---|---|
android.permission.INTERNET |
访问 DLNA 设备描述、SOAP 控制地址和媒体 URL。 |
android.permission.ACCESS_NETWORK_STATE |
判断网络状态。 |
android.permission.ACCESS_WIFI_STATE |
获取 Wi-Fi 状态。 |
android.permission.CHANGE_WIFI_MULTICAST_STATE |
使用 Wi-Fi multicast lock,提升 SSDP 搜索稳定性。 |
iOS 使用 AirPlay 系统路由与 AVPlayer 外部播放能力,不做私有扫描;本地网络和 ATS 例外见下方原生配置文件说明。
原生配置文件
| 平台 | 文件 | 说明 |
|---|---|---|
| Android | utssdk/app-android/AndroidManifest.xml |
声明网络、Wi-Fi 和组播权限,并绑定 android:networkSecurityConfig。 |
| Android | utssdk/app-android/res/xml/lizhao_cast_screen_network_security_config.xml |
允许局域网 DLNA/UPnP 明文 HTTP,包含 cleartextTrafficPermitted="true"。 |
| Android | utssdk/app-android/assets / libs / res |
资源占位目录,便于后续扩展。 |
| iOS | utssdk/app-ios/Info.plist |
包含 NSAllowsLocalNetworking、NSAllowsArbitraryLoads 与 App Transport Security 本地网络例外。 |
| iOS | utssdk/app-ios/UTS.entitlements |
iOS 能力声明占位。 |
| iOS | utssdk/app-ios/PrivacyInfo.xcprivacy |
隐私清单。 |
| iOS | utssdk/app-ios/Frameworks / Libs / Resources |
资源与原生依赖占位目录。 |
Android 9/API 28+ 默认限制明文 HTTP,而许多 DLNA DMR 设备描述和控制地址仍是局域网 HTTP,所以插件配置了 lizhao_cast_screen_network_security_config。这只用于 DLNA/UPnP 局域网能力,不建议业务把所有公网请求都放开为 cleartext。
iOS 的 App Transport Security 只针对 AirPlay/本地网络接入做边界说明,包含 NSAllowsLocalNetworking 与局部 NSAllowsArbitraryLoads 配置,不建议在业务中无差别放开所有网络访问。
自定义基座说明
App Android / App iOS 使用真实原生投屏能力时必须重新制作自定义基座。未打自定义基座时的表现通常是:
| 表现 | 原因 | 处理方式 |
|---|---|---|
supported:false |
当前端为降级实现或原生插件未进入基座。 | 重新制作并安装包含 lizhao-cast-screen 的自定义基座。 |
uts插件[lizhao-cast-screen]编译失败 |
基座未包含当前 UTS 插件或旧 runtime 未刷新。 | 重新打包基座并确认手机端外部 UTS runtime 已清理。 |
parameter options 或 options 为空 |
Android 旧代理或旧 dex 仍在运行。 | 重新安装最新基座,必要时清理手机端外部 UTS runtime,并确认 base.apk 中包含 UTSSDKModulesLizhaoCastScreenInitCastOptionsJSONObject、CastScreenNative。 |
AUTO_DMR_INIT_THROW |
自动演示入口初始化失败,通常与基座或运行时不一致有关。 | 先确认已运行最新自定义基座,再检查日志中的错误码。 |
如果 Android 系统通知栏的“屏幕投射”可以看到设备,但插件搜索不到设备,要先区分协议:系统入口通常是 Miracast 或系统投屏路由,插件首版搜索的是 DLNA DMR 媒体投屏设备。请确认电视/盒子开启了 DLNA 或媒体投屏接收能力。
如果投屏时出现 UPnP 716 Resource not found,说明电视端无法访问传入媒体地址。常见处理方式:
- 使用电视可直接访问的普通
httpMP4 做验证。 - 避免登录态、Cookie、Authorization、临时签名过短或 DRM 资源。
- 对 HTTPS 地址留意
https-dlna-risk,部分老电视不支持 HTTPS 媒体播放。 - 手机能播放不代表电视能访问,电视端必须能直接请求该 URL。
iOS 路由事件说明
iOS 使用系统 AirPlay 路由,不做私有 AirPlay 反射,也不会在初始化且未选择路由时伪造一次断开事件。只有系统路由变化、外部播放状态变化或用户操作导致状态变化时,才会通过 stateChange / connected / disconnected / error 等事件回传。
uni-app 调用示例
<script>
import * as CastScreen from '@/uni_modules/lizhao-cast-screen'
export default {
data() {
return {
devices: []
}
},
onLoad() {
CastScreen.initCast({ debug: true })
CastScreen.onCastEvent('*', this.handleCastEvent)
},
onUnload() {
CastScreen.offCastEvent('*', this.handleCastEvent)
},
methods: {
handleCastEvent(event) {
console.log('投屏事件', event)
},
openPanel() {
CastScreen.showCastPanel({ theme: 'auto' })
},
startSearch() {
CastScreen.startDiscovery({
timeoutMs: 8000,
success: () => {
this.devices = CastScreen.getDiscoveredDevices()
}
})
}
}
}
</script>
uni-app x 调用示例
import * as CastScreen from '@/uni_modules/lizhao-cast-screen'
CastScreen.initCast({
debug: true,
success: () => {
console.log('投屏运行时已初始化')
}
})
const caps = CastScreen.getCastCapabilities(null)
if (caps.supported) {
CastScreen.showCastPanel({
theme: 'dark',
title: '投屏到电视',
subtitle: '请选择同一 Wi-Fi 下的设备'
})
}
注意事项
- 首版定位为“远程媒体 URL 投屏”,不是屏幕镜像、录屏推流或 DRM 破解插件;本地文件、DRM、需登录鉴权的私有视频需要先转换为电视可访问的远程媒体 URL。
- Android 搜索不到设备时,先确认电视支持 DLNA DMR,而不只是支持 Miracast。
- iOS 必须通过系统 AirPlay 路由选择,不绕过系统能力。
- 降级端允许展示业务自定义入口,但不得伪造设备发现、连接或投屏成功。
- 媒体投屏失败时,先用
inspectCastMediaSource检查 URL,再用exportCastSupportBundle导出诊断信息给售后或开发排查。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6483
赞赏 5
下载 12145433
赞赏 1918
赞赏
京公网安备:11010802035340号