Chromium全屏播放视频电源管理

介绍

Android为了达到节约电源的目的,在屏幕没有操作时便会自动息屏,那么比如我们在播放视频时,尽管对屏幕没有操作,但是我们此时是不希望它息屏的,如果视频处于暂停状态,此时是希望它自动息屏的。

下面来看一下如何在Chromium全屏播放视频时是如何控制屏幕的。

实现

因为全屏播放是和ContentVideoView.java相关的,那么就在这个类中来实现。

首先在content_switches.h中声明一个PowerSaveBlocker 开关:

CONTENT_EXPORT extern const char kEnableContentVideoViewPowerSaveBlocker[];

在content_switches.cc中初始化:

// Enable the PowerSaveBlocker in ContentVideoView. Android only.
const char kEnableContentVideoViewPowerSaveBlocker[] = "enable-content-video-view-power-save-blocker";

然后在aw_main_delegate.cc中把开关打开:

在AwMainDelegate::BasicStartupComplete中加上

cl->AppendSwitch(switches::kEnableContentVideoViewPowerSaveBlocker)

接下来就要在ContentVideoView.java中来实现了:

首先ContentVideoView要实现一下ViewAndroidDelegate接口:

实现它的三个方法:

    @Override
    public View acquireAnchorView() {
        View anchorView = new View(getContext());
        addView(anchorView);
        return anchorView;
    }

    @Override
    public void setAnchorViewPosition(View view, float x, float y, float width, float height) {
        Log.e(TAG, "setAnchorViewPosition isn‘t implemented");
    }

    @Override
    public void releaseAnchorView(View anchorView) {
        removeView(anchorView);
    }

添加一个成员变量:

// The ViewAndroid is used to keep screen on during video playback.
private ViewAndroid mViewAndroid;

在构造函数中实现:

mViewAndroid = new ViewAndroid(new WindowAndroid(context.getApplicationContext()), this);

实现一个函数供jni层调用:

    @CalledByNative
    private long getNativeViewAndroid() {
        return mViewAndroid.getNativePointer();
    }

ContentVideoView类对应的jni层类在content_video_view.cc中实现,那么电源管理也主要在这个类中进行:

首先看content_video_view.h,要在content的命名空间中申明PowerSaveBlocker类和添加成员变量和方法:

#include "base/timer/timer.h"

class PowerSaveBlocker;

  // Returns the associated NativeView
  gfx::NativeView GetNativeView();

  void CreatePowerSaveBlocker();

  // PowerSaveBlock to keep screen on for fullscreen video.
  // There is already blocker when inline video started, and it requires the
  // ContentView‘s container displayed to take effect; but in WebView, apps
  // could use another container to hold ContentVideoView, and the blocker in
  // ContentView‘s container can not keep screen on; so we need another blocker
  // here, it is no harm, just an additonal blocker.
  scoped_ptr<PowerSaveBlocker> power_save_blocker_;

在content_video_view.cc中实现:

gfx::NativeView ContentVideoView::GetNativeView() {
  JNIEnv* env = AttachCurrentThread();
  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
  if (content_video_view.is_null())
    return NULL;

  return reinterpret_cast<gfx::NativeView>(
      Java_ContentVideoView_getNativeViewAndroid(env,
                                                 content_video_view.obj()));

}

void ContentVideoView::CreatePowerSaveBlocker() {
  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
      switches::kEnableContentVideoViewPowerSaveBlocker)) {
    // In fullscreen Clank reuses the power save blocker attached to the
    // container view that was created for embedded video. The WebView cannot
    // reuse that so we create a new blocker instead.
    if (power_save_blocker_) return;
    power_save_blocker_ = PowerSaveBlocker::Create(
        PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
        "Playing video").Pass();
    static_cast<PowerSaveBlockerImpl*>(power_save_blocker_.get())->
        InitDisplaySleepBlocker(GetNativeView());
  }
}

在构造函数中调用CreatePowerSaveBlocker

ContentVideoView::ContentVideoView(
    BrowserMediaPlayerManager* manager)
    : manager_(manager),
      weak_factory_(this) {
  ……
  CreatePowerSaveBlocker();
}

ContentVideoView::OpenVideo()ContentVideoView::Play时调用CreatePowerSaveBlocker()来保持不息屏:

ContentVideoView::OnMediaPlayerErrorContentVideoView::OnPlaybackComplete()ContentVideoView::PauseContentVideoView::ExitFullscreen时调用power_save_blocker_.reset()来让系统重新控制屏幕。

这样就达到了我们对播放视频是屏幕控制的目的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-07 04:12:31

Chromium全屏播放视频电源管理的相关文章

H5.video在微信中禁止全屏播放视频和直播流

这段时间在做一个直播项目,有直播需求,也有视频播放需求,要求能在微信中以半屏的方式播放,另外半屏可以做一些操作,还有些组件需要悬浮在视频上方.网上各种扒拉,各种实验,以求在微信中实现不全屏就能播放和自动播放,最终还是用了单纯的video标签.自动播放到目前还是没找到完美的解决方法. 非全屏播放视频 <video loop autoPlay src={url} controls={true} poster={pic} playsinline webkit-playsinline x5-video-

webview加载网页与全屏播放视频?

上篇我们大致了解了webview的一些属性,以及重要的方法.这篇我们就要一些案列来说明,一般webview最广泛的作用就是,加载一个html的网页(实现与js交互),,webview加载网页网页当中含有视频,webview文件下载等等. 首先我们来了解下webview是如何加载网页的?首先我们看下网页在家的效果? 代码也是比较简单 1 package cn.xiao.webviewplayvideo; 2 import android.app.Activity; 3 import android

iOS UIWebView 全屏播放视频, 需横屏,单app不支持横屏, 解决办法

原文  http://blog.csdn.net/alincexiaohao/article/details/39294523 参考blog: UIWebView中视频播放屏幕自动旋转,app不支持旋转但是某一个页面需要旋转等 使用UIWebView播放视频时捕捉全屏播放事件 iOS两个强制旋转屏幕的方法 IOS:屏幕旋转与Transform 在使用UIWebView播放视频的时候,想到视频应该能够旋转播放.但是app本身是不支持旋转的,所以把代码记录如下,引申出来的答案就是:所有的你想要进行页

Chromium为视频标签&lt;video&gt;全屏播放的过程分析

在Chromium中,<video>标签有全屏和非全屏两种播放模式.在非全屏模式下,<video>标签播放的视频嵌入在网页中显示,也就是视频画面作为网页的一部分显示.在全屏模式下,我们是看不到网页其它内容的,因此<video>标签播放的视频可以在一个独立的全屏窗口中显示.这两种截然不同的播放模式,导致Chromium使用不同的方式渲染视频画面.本文接下来就详细分析<video>标签全屏播放的过程. 从前面Chromium为视频标签<video>渲

3d 视频切换到全屏播放

项目:3d场景中播放一个小窗口的视频,点击视频,放大为屏幕上的全屏视频.再点击视频,缩小为原来的小窗口的视频继续播放视频. 1.Unity3D 中,在三维场景中呈现播放视频,将视频组件放到相应的Plane下,调整其位置,缩放,旋转. 2.在视频所附Plane上放置世界空间的UI canvas Button,大小一致,处于透明状态,注意UGUI的Image组件不能remove,button点击的效果可以设为无. 3.全屏播放视频,需要加入屏幕UI Canvas,加入子节点raw image组件,再

video 视频全屏播放

public videofull() { //全屏播放视频 var _this = this; _this.video = document.getElementById('homeVideo'); //视频 _this.btnFullScreen = document.getElementById('btn_fullscreen'); // 全屏点击按钮 //实现全屏功能 _this.btnFullScreen.addEventListener('click',function() { //

android webview 全屏播放H5 (Playing HTML5 video on fullscreen in android webview)

最近关于webview的问题遇到的比较多,关于如何在webview中全屏播放视频,网上有很多种解决方法,这里也有一种方法,试了几种后发现还是这种比较好用. 这里就拿出来与大家分享,出自http://stackoverflow.com/questions/15768837/playing-html5-video-on-fullscreen-in-android-webview#userconsent# 代码里面已经有很好的注释了,我就不画蛇添足了. VideoEnabledWebChromeCli

Android解决WebView的定位功能、视频全屏播放、下载功能、页面Url的处理、进度条处理

解决WebView的定位功能.视频全屏播放.下载功能.页面Url的处理.进度条处理 事先说明: 定位功能在安卓6.0需要用户手动确认权限后才能使用 若需在安卓6.0适配WebView的定位功能,则需要在WebView中手动增加用户权限访问 详细可百度安卓6.0权限管理系统,或者采用第三方封装好的权限管理类进行编写(如Bmob) 如果对内容不理解的话,可参考最后的整个类的代码 如果对BaseActivity这个抽象类不理解的话,可以查看下面一篇文章对BaseActivity的介绍 步骤一:webv

手机影音第九天,控制视频全屏播放与退出全屏播放,音量调节按钮来控制视频音量与静音的实现

代码以托管到码云,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 一.视频全屏播放与退出全屏 系统默认的videoview类,没有调整大小的方法,因此需要自定义一个类,继承videoview,然后重写里面的三个构造方法,再自定义一个调整视频播放页面大小的方法. 1.布局文件 同时,在视频播放的布局文件中,videoview布局要引用上面自定义的类. <?xml version="1.0" encoding=&