Chromium全屏播放视频电源管理

原创 2015年07月09日 16:40:59

介绍

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()来让系统重新控制屏幕。
这样就达到了我们对播放视频是屏幕控制的目的。

版权声明:转载请注明出处

Chromium为视频标签<video>全屏播放的过程分析

在Chromium中,标签有全屏和非全屏两种播放模式。在非全屏模式下,标签播放的视频嵌入在网页中显示,也就是视频画面作为网页的一部分显示。在全屏模式下,我们是看不到网页其它内容的,因此标签播放的视频可...
  • Luoshengyang
  • Luoshengyang
  • 2016年08月29日 01:00
  • 42499

浏览器内核分析2 -- Webkit和Chromium源码结构

1 Webkit架构Webkit和Blink代码量都是几百万行级别,阅读难度很大,故先了解下它的大体架构是十分有意义的。下面是《Webkit技术内幕》一书中给出的架构图由图中可见,大体分为以下几个层次...
  • u013510838
  • u013510838
  • 2017年02月15日 16:33
  • 1827

安卓WebView中全屏播放网页视频

Android中WebView是支持播放网页视频的,但是要全屏播放网页中的视频,在Android 4.0以下,能支持,4.0以上就有点鸡肋了。解决方法是需要重写WebView和WebChromeCie...
  • zengd0
  • zengd0
  • 2016年08月23日 14:13
  • 2552

Android 播放视频(四)VideoView全屏视频播放

Android 播放视频(四)VideoView全屏视频播放在教程(二)中讲述了VideoView如何播放视频,我们就总会产生一个需求,如何让VidoView进行全屏播放呢?当手机旋转进入横屏的时候让...
  • kingroc
  • kingroc
  • 2016年04月09日 23:56
  • 10112

Vuforia在ios上全屏播放网络视频的方法

项目中要求使用Vuforia在ios上扫描识别图全屏播放相关视频: 以下是最开始的几种失败的尝试方法并列出相应的坑: 1. 舍弃掉Vuforia的VideoPlay组件,直接在OnTracki...
  • a8856621
  • a8856621
  • 2017年06月23日 21:03
  • 184

chromium 视频播放逻辑梳理(chromium41)

chromium 视频播放逻辑梳理
  • u011882998
  • u011882998
  • 2016年04月01日 14:40
  • 1045

webview 加载h5页面,播放视频+全屏,实现简单封装

前段时间项目中用到了h5。从目前的市场来看,原生和h5的结合受到很多公司的欢迎,刚好最近微信也推出了它自己的“小程序”,这在Android程序员之间也掀起了波澜,引起大家讨论。 个人觉得Googl...
  • u010918416
  • u010918416
  • 2016年09月29日 22:50
  • 7767

智能电源管理技术--原理简介

一、专业术语          1. LDO(Low Dropout Regulator)              低压差线性稳压器              优点:稳定性好,负载响应快,输出纹波小...
  • wlwl0071986
  • wlwl0071986
  • 2015年02月28日 10:46
  • 2786

Linux系统中电源管理框架详解

转载地址:http://www.wowotech.net/linux_kenrel/suspend_and_resume.html 1. 前言 Linux内核提供了三种Suspend: F...
  • qq_21792169
  • qq_21792169
  • 2016年05月04日 12:50
  • 6535

linux内核电源管理浅析

一 reboot实现 应用通过reboot系统调用,reboot系统调用定义在kernel/sys.c文件中: SYSCALL_DEFINE4(reboot, int, magic1, int, ma...
  • whuzm08
  • whuzm08
  • 2017年05月26日 19:00
  • 190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Chromium全屏播放视频电源管理
举报原因:
原因补充:

(最多只允许输入30个字)