功能需求
在我们进行视频的过程中,需要保持屏幕常亮,避免进入锁屏的需要。想法就是在人员加入到频道的时候调用屏幕常亮的方法,然后在离开频道的时候调用去除屏幕常亮的方法。
几种常见的方法
FLAG_KEEP_SCREEN_ON
它是基于一个activity的方法,它是一个页面 Window 上的一个Flag,使用 addFlags() 方法添加。
1 | activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); |
这里使用完成之后,也是需要取消掉的。取消这个 Flag 使用 clearFlags() 方法来取消。
1 | activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); |
keepScreenOn
除了给Window添加一个FLAG_KEEP_SCREEN_ON的 Flag 之外,还可以对当前可见的View调用 keepScreenOn() 方法来设置屏幕常亮。它是是 View 对象上的方法。它的原理和FLAG_KEEP_SCREEN_ON一样的,只是它更简单,只需要对某个View设置,如果View可见即生效,否者就不生效。
需要注意的一点,使用keepScreenOn()设置的常亮标识,需要当前View保持屏幕可见才行。所以一般而言,我们会在页面的根布局中,添加此属性。
实际使用
首先我需要在Java层实现这个函数,就是使用我们上面说的那个方法,但是在开始的时候是不能在方法内直接调用上面的方法的,因为视图层的更新必须是通过主线程更新的也就是UI线程更新,如果在主线程之外的线程中直接更新页面的话是会抛出以下的异常:
1 | android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. |
解决方法是:https://blog.csdn.net/luckyjda/article/details/8601517
通过Handle和runOnUiThread()去解决,具体的形式可以看链接。
所以在Java层的函数声明是这样的:
1 | /** |
在Java层调用了之后我们还需要在对应的ts文件进行修改才能使得Js层能够调用这个函数。对应的操作就是对应的ReactNative的插件里面的YoumeVideoEngine.native.ts文件进行如下修改对应我们修改的Java层函数,
1 | public static keepScreenOn() { |
在此之后我们调用一些命令,把这个ts文件更新到js文件,使得对应的js文件得到修改
1 | yarn |
做完这些需要的工作我们的接口的工作就已经完成了。
接下来应该做的是在Js层的sdk中调用这个函数,
按着初始的想法我们应该在leaveChannel和joinChannel中调用我们的接口函数:
joinChannel中调用:
1 | YoumeVideoEngine.keepScreenOn(); |
leaveChannel中调用
1 | YoumeVideoEngine.cancelScreenOn(); |
这样的话整个调用的过程就完成了,能得到预期的视频的时候屏幕常亮的效果。