【问题标题】:Can I prevent phone from sleep on a webpage我可以防止手机在网页上休眠吗
【发布时间】:2011-08-31 16:40:18
【问题描述】:

在应用程序中我可以使用http://developer.android.com/reference/android/os/PowerManager.WakeLock.html 但是有没有办法让网页保持运行并防止进入睡眠状态? 如果它至少在 android 上运行就好了。

【问题讨论】:

  • 我当然希望不要……想想那些虐待……
  • 它可能会被要求,就像许多其他功能 getUserMedia() 等......有很多用例你不想让手机在网络应用程序上进入睡眠状态。例如,如果您需要传感器数据并希望每隔几秒更新一次音频。当它睡觉时,你不能这样做。

标签: javascript iphone android html sleep


【解决方案1】:

您可以使用:https://github.com/richtr/NoSleep.js

在任何 Android 或 iOS 网络浏览器中防止显示器休眠并启用唤醒锁定。

请注意,该库在某些平台/浏览器上存在一些可靠性/性能问题。用户已找到问题 cmets 和拉取请求中列出的解决方案,但由于 repo 所有者当前似乎未处于活动状态,因此尚未添加它们。

建议您在用于生产之前检查这些拉取请求(和/或问题)是否有潜在的改进。

【讨论】:

    【解决方案2】:

    您可以使用 Wake Lock Web API(检查支持)

    https://web.dev/wakelock/

    【讨论】:

    • 现在(2021 年):仅在 Chrome/Edge/Opera 中受支持,在 Firefox/Safari(iOS、MacOS)中不受支持...没有其他方法可以尝试手动修复错误的 NoSleep.js...
    【解决方案3】:

    在应用程序中,您可以通过多种方式执行此操作,但我想您的意思只是在移动网页中,通过 Android 在任何浏览器中查看。对于普通的 HTML/Javascript/etc.,我真的非常怀疑。

    实际上可能可以使用 Flash(在启用了插件的支持 Flash 的手机上),但至少在特定情况下是这样。我这样说是因为,在没有 WAKE_LOCK 权限的测试应用程序中,将this swf file 加载到 WebView 会在某些设备上导致以下异常:

    java.lang.SecurityException:两者都不是 用户##### 也没有当前进程 android.permission.WAKE_LOCK

    但是,即使这确实有效,它也会冒着使没有 WAKE_LOCK 权限的应用程序或浏览器崩溃的风险。这可能是由于 Adob​​e Flash Player 插件中的错误代码,而不是任何有意的功能。

    【讨论】:

    • 我的应用程序的用户出现了这个异常,所以也许她正在运行 Flash?也感谢歇斯底里的 swf 文件。
    【解决方案4】:

    在您的页面上播放假循环播放的 VIDEO 或 AUDIO

    您可以使用这个快速示例将带有虚假数据的循环视频添加到您的页面并防止移动设备进入睡眠状态:

    // Create the root video element
    var video = document.createElement('video');
    video.setAttribute('loop', '');
    // Add some styles if needed
    video.setAttribute('style', 'position: fixed;');
    
    // A helper to add sources to video
    function addSourceToVideo(element, type, dataURI) {
        var source = document.createElement('source');
        source.src = dataURI;
        source.type = 'video/' + type;
        element.appendChild(source);
    }
    
    // A helper to concat base64
    var base64 = function(mimeType, base64) {
        return 'data:' + mimeType + ';base64,' + base64;
    };
    
    // Add Fake sourced
    addSourceToVideo(video,'webm', base64('video/webm', 'GkXfo0AgQoaBAUL3gQFC8oEEQvOBCEKCQAR3ZWJtQoeBAkKFgQIYU4BnQI0VSalmQCgq17FAAw9CQE2AQAZ3aGFtbXlXQUAGd2hhbW15RIlACECPQAAAAAAAFlSua0AxrkAu14EBY8WBAZyBACK1nEADdW5khkAFVl9WUDglhohAA1ZQOIOBAeBABrCBCLqBCB9DtnVAIueBAKNAHIEAAIAwAQCdASoIAAgAAUAmJaQAA3AA/vz0AAA='));
    addSourceToVideo(video, 'mp4', base64('video/mp4', 'AAAAHGZ0eXBpc29tAAACAGlzb21pc28ybXA0MQAAAAhmcmVlAAAAG21kYXQAAAGzABAHAAABthADAowdbb9/AAAC6W1vb3YAAABsbXZoZAAAAAB8JbCAfCWwgAAAA+gAAAAAAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIVdHJhawAAAFx0a2hkAAAAD3wlsIB8JbCAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAIAAAACAAAAAABsW1kaWEAAAAgbWRoZAAAAAB8JbCAfCWwgAAAA+gAAAAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAAVxtaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAEcc3RibAAAALhzdHNkAAAAAAAAAAEAAACobXA0dgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAIAAgASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAAFJlc2RzAAAAAANEAAEABDwgEQAAAAADDUAAAAAABS0AAAGwAQAAAbWJEwAAAQAAAAEgAMSNiB9FAEQBFGMAAAGyTGF2YzUyLjg3LjQGAQIAAAAYc3R0cwAAAAAAAAABAAAAAQAAAAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAFHN0c3oAAAAAAAAAEwAAAAEAAAAUc3RjbwAAAAAAAAABAAAALAAAAGB1ZHRhAAAAWG1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAK2lsc3QAAAAjqXRvbwAAABtkYXRhAAAAAQAAAABMYXZmNTIuNzguMw=='));
    
    // Append the video to where ever you need
    document.body.appendChild(video);
    
    // Start playing video after any user interaction.
    // NOTE: Running video.play() handler without a user action may be blocked by browser.
    var playFn = function() {
        video.play();
        document.body.removeEventListener('touchend', playFn);
    };
    document.body.addEventListener('touchend', playFn);
    

    【讨论】:

      【解决方案5】:

      在 iOS 设备上,只需每隔几秒用 Javascript 刷新一次页面即可使屏幕保持唤醒状态。这似乎是正确的策略,希望 Android 将在未来的版本中采用此策略。

      【讨论】:

      • 我不同意。无需使用带宽向服务器发出不必要的 HTTP 请求,只是为了防止手机进入休眠状态。一定会有更好的办法。另外,你多久这样做一次?如果您的超时发生在手机休眠超时之后怎么办?
      猜你喜欢
      • 2019-09-19
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2011-06-08
      • 2015-04-08
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多