功能需求
在我们进行视频的过程中,需要保持屏幕常亮,避免进入锁屏的需要。想法就是在人员加入到频道的时候调用屏幕常亮的方法,然后在离开频道的时候调用去除屏幕常亮的方法。
几种常见的方法
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(); |
这样的话整个调用的过程就完成了,能得到预期的视频的时候屏幕常亮的效果。