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

11 回复

【问题背景】

  • ArkWeb组件中默认自带的视频下载按钮怎么处理?能不能隐藏?

【原理刨析】

  • HTML5 的 video 标签内置 controlsList 属性,该属性为视频元素提供了拓展控制能力,允许开发者灵活配置界面中显示的视频控件类型。
  • 此属性的值需传入以空格分隔的字符串参数,每个字符串对应一个具体控件的标识,核心可配置选项如下:
    • nodownload:隐藏视频下载按钮;
    • nofullscreen:隐藏全屏播放按钮;
    • noremoteplayback:隐藏远程播放功能按钮。

【解决方案】

  • Web 组件本身并未提供用于直接隐藏下载按钮的专属属性,但这一需求可借助 JavaScript 脚本间接达成,具体实现步骤如下:
  1. 首先要确认 Web 组件具备 JavaScript 脚本的执行权限(通常该权限默认开启,可核查是否有调整过相关设置)。
  2. 待 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 };
  }
})

部署建议

  1. 测试不同分辨率设备下的UI表现
  2. 使用华为远程真机调试云测服务
  3. 审核前确保按钮完全隐藏且无功能残留

重要提示:此方案适用于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侧,通过 WebControllerrunJavaScript 方法注入并执行这些JS脚本。

这种方法涉及前端(HTML/JS)与ArkTS的交互,复杂度较高,但能完全控制播放界面。

总结与建议: 对于审核问题,最快的方法是采用方案1:启用 .fileAccess(true) 并完整实现 onFileSelectorShow 回调,为下载功能提供合法的保存路径选择逻辑。这符合系统安全规范,能确保下载功能可用。

如果业务上确实不需要任何下载能力,且愿意承担前端开发的复杂度,可以采用方案2进行深度定制。请根据你的具体业务场景选择。

回到顶部