YAM项目功能点实现三

功能需求

在我们进行视频的过程中,需要保持屏幕常亮,避免进入锁屏的需要。想法就是在人员加入到频道的时候调用屏幕常亮的方法,然后在离开频道的时候调用去除屏幕常亮的方法。

几种常见的方法

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_ONFlag 之外,还可以对当前可见的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

通过HandlerunOnUiThread()去解决,具体的形式可以看链接。

所以在Java层的函数声明是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 开启屏幕常亮
*/
@ReactMethod
public void keepScreenOn() {
runOnUiThread(new Runnable() {
@Override
public void run() {
getCurrentActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
});
}

/**
* 取消屏幕常亮
*/
@ReactMethod
public void cancelScreenOn() {
runOnUiThread(new Runnable() {
@Override
public void run() {
getCurrentActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
});
}

Java层调用了之后我们还需要在对应的ts文件进行修改才能使得Js层能够调用这个函数。对应的操作就是对应的ReactNative的插件里面的YoumeVideoEngine.native.ts文件进行如下修改对应我们修改的Java层函数,

1
2
3
4
5
6
7
public static keepScreenOn() {
Youme.keepScreenOn();
}

public static cancelScreenOn() {
Youme.cancelScreenOn();
}

在此之后我们调用一些命令,把这个ts文件更新到js文件,使得对应的js文件得到修改

1
2
yarn
yarn build

做完这些需要的工作我们的接口的工作就已经完成了。

接下来应该做的是在Js层的sdk中调用这个函数,

按着初始的想法我们应该在leaveChanneljoinChannel中调用我们的接口函数:

joinChannel中调用:

1
YoumeVideoEngine.keepScreenOn();

leaveChannel中调用

1
YoumeVideoEngine.cancelScreenOn();

这样的话整个调用的过程就完成了,能得到预期的视频的时候屏幕常亮的效果。