如何实现接近身体自动灭屏的功能
===============

#### 问题现象

在接听电话的时候，手机靠近身体，为了避免误触，需要将手机灭屏，怎么实现？

#### 背景知识

*   [RunningLock锁](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-runninglock)：运行锁，能够阻止CPU进入低功耗状态，保证业务能够在系统待机状态下继续活动的一种锁机制。
*   [RunningLockType.PROXIMITY\_SCREEN\_CONTROL](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-runninglock#runninglocktype)：接近光锁，使能接近光传感器，并根据传感器与障碍物的距离远近发起亮灭屏流程。
*   [RunningLock.create](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-runninglock#runninglockcreate9)：创建RunningLock锁。

#### 解决方案

利用光传感器去判断手机与障碍物的距离，并依据与障碍物的距离发起亮灭屏的流程。

*   实现过程：
    1.  src/main/module.json5文件配置RunningLock权限。
        
        {
          "name": "ohos.permission.RUNNING\_LOCK"
        }
        
    2.  创建一个接近光锁。
        
        runningLock.create('running\_lock\_test', runningLock.RunningLockType.PROXIMITY\_SCREEN\_CONTROL)
          .then((lock: runningLock.RunningLock) \=\> {
            this.runLock \= lock;
            this.runLock.hold(\-1);
          })
          .catch((err: Error) \=\> {
            console.error(\`create running lock failed, err: ${err}\`);
          });
        

*   完整示例参考如下：
    
    import { runningLock } from '@kit.BasicServicesKit';
    
    @Entry
    @Component
    struct RunningLockDemo {
      message: string \= '接近光锁';
      private runLock: runningLock.RunningLock | null \= null;
    
      build() {
        Column() {
          Text(this.message)
            .maxLines(10)
            .fontSize(50)
            .fontWeight(FontWeight.Bold)
            .alignRules({
              center: { anchor: '\_\_container\_\_', align: VerticalAlign.Center },
              middle: { anchor: '\_\_container\_\_', align: HorizontalAlign.Center }
            });
          Button('启用RunningLock').onClick(() \=\> {
            this.runningLock();
          });
        }
        .height('100%')
        .width('100%');
      }
    
      runningLock() {
        runningLock.create('running\_lock\_test', runningLock.RunningLockType.PROXIMITY\_SCREEN\_CONTROL)
          .then((lock: runningLock.RunningLock) \=\> {
            this.runLock \= lock;
            this.runLock.hold(\-1);
          })
          .catch((err: Error) \=\> {
            console.error(\`create running lock failed, err: ${err}\`);
          });
      }
    }