想要在脚本运行完后锁定屏幕,但开发文档中没有锁屏函数。市场里有一些锁屏脚本,可都是通过第三方应用或小部件实现。能不能只用代码就可以锁屏呢?
不多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中的实现方式进行锁屏呢?
- 查看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)
}
//……
}
- 但是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;
//……
}
- ScriptRuntime 就是脚本中的全局变量runtime,所以最终可以通过runtime中的accessibilityBridge的getService()来获取service对象,然后使用performGlobalAction(AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN)进行锁屏,调用后返回true或false表示是否成功。
runtime.accessibilityBridge.getService().performGlobalAction(AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN)