HarmonyOS鸿蒙Next中Web里面有视频下载怎么处理?
HarmonyOS鸿蒙Next中Web里面有视频下载怎么处理? 我在Web展示的UIR的时候,url有的有视频。它会展示个图标,点击图标会到默认播放界面,但是下方会有个下载功能。现在审核的时候说下载点击没反应 被拒绝了。
我应该怎么处理?实际上这个下载视频的功能如果能不展示更好。
Web({ src: this.web_url, controller: this.controller })
.javaScriptAccess(true) // 放在 src 之前
.domStorageAccess(true)
.fileAccess(false)
.cacheMode(CacheMode.Default)
更多关于HarmonyOS鸿蒙Next中Web里面有视频下载怎么处理?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【问题背景】
- ArkWeb组件中默认自带的视频下载按钮怎么处理?能不能隐藏?
【原理刨析】
- HTML5 的 video 标签内置 controlsList 属性,该属性为视频元素提供了拓展控制能力,允许开发者灵活配置界面中显示的视频控件类型。
- 此属性的值需传入以空格分隔的字符串参数,每个字符串对应一个具体控件的标识,核心可配置选项如下:
- nodownload:隐藏视频下载按钮;
- nofullscreen:隐藏全屏播放按钮;
- noremoteplayback:隐藏远程播放功能按钮。
【解决方案】
- Web 组件本身并未提供用于直接隐藏下载按钮的专属属性,但这一需求可借助 JavaScript 脚本间接达成,具体实现步骤如下:
- 首先要确认 Web 组件具备 JavaScript 脚本的执行权限(通常该权限默认开启,可核查是否有调整过相关设置)。
- 待 Web 组件加载完毕后,运行 JS 脚本以隐藏下载按钮。该脚本的实现逻辑为:
- 通过 document.querySelector () 方法获取到 video 元素对象;
- 将该对象的 controlsList 属性值设置为 nodownload。
import { webview } from '@kit.ArkWeb';
@Entry
@Component
struct WebComponent {
controller: webview.WebviewController = new webview.WebviewController();
build() {
Column() {
Web({
src:
'www.example.com',
controller: this.controller
})
.domStorageAccess(true)
.fileAccess(true)
.imageAccess(true)
.javaScriptAccess(true)
.mixedMode(MixedMode.None)
.onlineImageAccess(true)
.allowWindowOpenMethod(true)
.mediaPlayGestureAccess(true)
.onPageEnd(() => {
this.controller.runJavaScript(' window.onload = function() {\n' +
' var video = document.querySelector(\'video[name="media"]\');\n' +
' if (video) {\n' +
' video.setAttribute(\'controlsList\', \'nodownload\');\n' +
' }\n' +
' };')
})
}
}
}
相关文档: 【开发指南_ArkWeb】
更多关于HarmonyOS鸿蒙Next中Web里面有视频下载怎么处理?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对您在鸿蒙Web组件中遇到的视频下载按钮问题,我将提供完整的解决方案。以下是优化后的实现方案:
问题分析与解决方案
根本原因:Web组件默认的视频控件包含下载按钮,但点击后无响应属于鸿蒙系统限制(API 20)。推荐通过CSS注入隐藏下载按钮。
完整代码实现
import web_webview from '@ohos.web.webview';
@Entry
@Component
struct WebPage {
private controller: web_webview.WebviewController = new web_webview.WebviewController();
private web_url: string = "https://your-video-url.com"; // 替换实际URL
build() {
Column() {
Web({
src: this.web_url,
controller: this.controller
})
.javaScriptAccess(true)
.domStorageAccess(true)
.fileAccess(false)
.cacheMode(CacheMode.Default)
.onPageEnd(() => {
// 页面加载完成后注入CSS
this.hideDownloadButton();
})
}
}
// 隐藏下载按钮的核心方法
private hideDownloadButton() {
const cssCode = `
/* 隐藏原生下载按钮 */
video::-internal-media-controls-download-button {
display: none !important;
}
/* 隐藏自定义下载按钮 */
.download-button, [aria-label="下载"], [title="下载"] {
display: none !important;
visibility: hidden !important;
}
`;
const jsCode = `
var style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = \`${cssCode}\`;
document.head.appendChild(style);
// 动态监控新增元素
new MutationObserver(() => {
document.querySelectorAll('.download-button, [aria-label="下载"]')
.forEach(btn => btn.remove());
}).observe(document.body, { childList: true, subtree: true });
`;
this.controller.runJavaScript(jsCode);
}
}
关键实现说明
CSS注入技术:
使用video::-internal-media-controls-download-button选择器定位原生下载按钮
通过!important覆盖原有样式
兼容自定义按钮选择器(.download-button等)
动态监控机制:
使用MutationObserver监听DOM变化
实时移除新增的下载按钮元素
确保页面动态加载内容时仍有效
执行时机:
在.onPageEnd()回调中注入代码
确保DOM加载完成后再操作
注意事项
选择器适配:
// 根据实际页面结构调整选择器
const customSelectors = `
.custom-download,
#video-download-btn,
button[data-role="download"]
`;
安全限制:
确保.fileAccess(false)保持关闭状态
鸿蒙API 20+ 禁止Web组件直接下载文件
替代方案:
// 若需保留下载功能
.onInterceptRequest(event => {
if (event.request.url.endsWith('.mp4')) {
// 调用原生下载模块
downloadFile(event.request.url);
return { intercept: true };
}
})
部署建议
- 测试不同分辨率设备下的UI表现
- 使用华为远程真机调试云测服务
- 审核前确保按钮完全隐藏且无功能残留
重要提示:此方案适用于HarmonyOS 6.0.0+(API 20),对系统原生控件和常见视频网站均有效。若页面使用特殊播放器(如Flash),需额外定制CSS选择器。
通过注入JavaScript代码,修改Web页面中视频标签的 controlsList 属性,隐藏下载按钮(需要开启 javaScriptAccess ):
// 1. 先定义要注入的JS代码(隐藏视频下载按钮)
const hideVideoDownloadBtn = `
// 监听页面加载完成,修改所有video标签的controlsList
window.addEventListener('load', () => {
const videos = document.querySelectorAll('video');
videos.forEach(video => {
// 添加'nodownload'禁止下载按钮,同时保留其他控制项
video.controlsList.add('nodownload');
});
});
`;
// 2. 在Web组件的controller中注入JS
@State web_url: string = '你的网页地址';
@State controller: WebController = new WebController();
build() {
Web({ src: this.web_url, controller: this.controller })
.javaScriptAccess(true) // 必须开启JS权限
.domStorageAccess(true)
.fileAccess(false)
.cacheMode(CacheMode.Default)
// 页面加载完成后注入JS
.onPageEnd(() => {
this.controller.runJavaScript(hideVideoDownloadBtn);
})
}
总的来说,HarmonyOS是一款非常优秀的操作系统,期待它能在未来带给我们更多惊喜!
方案一、实现视频下载,参考Web视频视频
- 长按下载视频:H5提供的video标签默认带有保存功能,但是在使用Web组件加载时,下载按钮实际不可用,不便于用户保存感兴趣的视频内容,通过适配长按下载视频,可以让Web页面内的视频便捷地保存到本地设备。
方案二、 尝试隐藏下载按钮。
1、如果可以直接修改h5代码,那就简单了。
2、客户端修改,为页面中所有 <video> 标签添加 controlsList="nodownload" 属性。
// xxx.ets
import { webview } from '@kit.ArkWeb';
@Entry
@Component
struct Index {
controller: webview.WebviewController = new webview.WebviewController();
private jsStr: string = `
document.addEventListener('DOMContentLoaded', () =>
document.querySelectorAll('video').forEach(v => {
v.setAttribute('controlsList', 'nodownload');
v.controlsList = 'nodownload';
})
);`;
@State scripts: Array<ScriptItem> = [
{ script: this.jsStr, scriptRules: ["*"] }
];
build() {
Column({ space: 20 }) {
Web({ src: $rawfile('index.html'), controller: this.controller })
.javaScriptAccess(true)
.domStorageAccess(true)
.backgroundColor(Color.Grey)
.javaScriptOnDocumentEnd(this.scripts)
.width('100%')
.height('100%')
}
}
}
HarmonyOS的分布式技术让我实现了跨设备的无缝协作,工作效率翻倍。
将视频URL替换为后端代理地址,后端返回视频流时添加响应头 Content-Disposition: inline (告知浏览器仅预览不下载),同时禁用视频URL的直接访问权限(如添加时效签名)。
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html
web的onDownloadStart、onLoadIntercept事件都添加下看看具体哪个事件进行拦截的下载,需要开发者额外处理下载的,web不能自行处理;
鸿蒙Next中Web视频下载可通过Web组件结合媒体会话管理实现。使用Web组件的onFileSelectorShow回调获取视频文件,配合媒体库管理接口将文件保存至本地。具体需调用媒体库的MediaLibraryHelper进行文件存储操作,同时注意申请ohos.permission.READ_MEDIA和ohos.permission.WRITE_MEDIA权限。下载过程需遵循鸿蒙文件管理规范,使用安全路径存储。
在HarmonyOS Next的Web组件中,视频下载功能是由系统内置的播放器界面提供的,开发者无法直接通过Web组件的配置来移除该下载按钮。审核被拒是因为点击下载无响应,这通常与文件访问权限和安全策略有关。
根据你提供的代码,核心问题在于 .fileAccess(false) 这一行。它禁用了Web组件的文件访问能力,导致播放器的下载功能因无权限而失效。要解决审核问题,你有两个主要方向:
1. 启用文件访问并实现安全的下载(推荐)
这是最直接的解决方案。将 .fileAccess(false) 改为 .fileAccess(true) 以启用下载功能。但仅这样做是不够的,你必须同时实现 onFileSelectorShow 回调来处理文件保存操作,否则下载依然无法完成。
Web({ src: this.web_url, controller: this.controller })
.javaScriptAccess(true)
.domStorageAccess(true)
.fileAccess(true) // 1. 启用文件访问
.onFileSelectorShow { (fileSelector, result) -> // 2. 关键:处理文件选择(下载触发)
// 这里需要调用 result.handleFileList() 来处理下载文件
// 例如,可以调用系统文件选择器让用户选择保存位置
// 这是实现下载功能的关键步骤,缺少此回调下载流程会中断
result.handleFileList()
}
.cacheMode(CacheMode.Default)
2. 通过自定义播放器屏蔽下载(更复杂) 如果你想从根本上不展示下载按钮,需要绕过系统默认播放器:
- 在Web页面中,使用JavaScript拦截视频元素的点击事件。
- 禁用原生的
<video>控件(controls属性),转而使用自定义的播放器UI(如使用<video>标签的API或第三方JS播放库)。 - 在ArkTS侧,通过
WebController的runJavaScript方法注入并执行这些JS脚本。
这种方法涉及前端(HTML/JS)与ArkTS的交互,复杂度较高,但能完全控制播放界面。
总结与建议:
对于审核问题,最快的方法是采用方案1:启用 .fileAccess(true) 并完整实现 onFileSelectorShow 回调,为下载功能提供合法的保存路径选择逻辑。这符合系统安全规范,能确保下载功能可用。
如果业务上确实不需要任何下载能力,且愿意承担前端开发的复杂度,可以采用方案2进行深度定制。请根据你的具体业务场景选择。

