两行代码实现锁屏

ddddx
404
·
1 个回应

想要在脚本运行完后锁定屏幕,但开发文档中没有锁屏函数。市场里有一些锁屏脚本,可都是通过第三方应用或小部件实现。能不能只用代码就可以锁屏呢?

不多BB,先贴代码

importClass(android.accessibilityservice.AccessibilityService)
var success = runtime.accessibilityBridge.getService().performGlobalAction(AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN)

以上代码运行后即可锁屏,仅支持Android9.0及以上系统。

现成脚本:锁屏

实现思路
我们都知道Hamibot是基于Auto.JS的,而同样从Auto.JS修改来的AutoX.JS中提供了锁屏函数,而脚本又是可以调用Android函数的,那么能否利用AutoX.JS中的实现方式进行锁屏呢?

  1. 查看AutoX.JS源码,全局搜索lockScreen(),发现以下代码,可见仍是由无障碍服务实现锁屏。
class GlobalActionAutomator(private val mHandler: Handler?, private val serviceProvider: () -> AccessibilityService) {
//……
    /**
     * Action to lock the screen
     */
    @RequiresApi(Build.VERSION_CODES.P)
    fun lockScreen(): Boolean {
        return performGlobalAction(AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN)
    }
//……
}
  1. 但是js中无法写一个类去继承AccessibilityService,所以只能去找到APP中的AccessibilityService对象,然后通过对象调用performGlobalAction方法。接下来在Hambot中搜索AccessibilityService相关,查找service对象,发现:
public abstract class AccessibilityBridge {
//……
    @Nullable
    public abstract AccessibilityService getService();
//……
}
public class ScriptRuntime {
//……
    @ScriptVariable
    public final AccessibilityBridge accessibilityBridge;
//……
}
  1. ScriptRuntime 就是脚本中的全局变量runtime,所以最终可以通过runtime中的accessibilityBridge的getService()来获取service对象,然后使用performGlobalAction(AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN)进行锁屏,调用后返回true或false表示是否成功。
runtime.accessibilityBridge.getService().performGlobalAction(AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN)
发布于 2023-11-11
更新于 2023-11-11
好文需要鼓励,点赞获取更新通知
投了 2000 金币