docs: events, automator
This commit is contained in:
@@ -86,6 +86,7 @@
|
||||
<li><span class="stability_undefined"><a href="#app_app_uninstall_packagename">app.uninstall(packageName)</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#app_app_openurl_url">app.openUrl(url)</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#app_app_sendemail_options">app.sendEmail(options)</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#app_app_startactivity_name">app.startActivity(name)</a></span></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><span class="stability_undefined"><a href="#app_intent">进阶: 意图Intent</a></span><ul>
|
||||
@@ -191,6 +192,16 @@ app.sendEmail({
|
||||
subject: "这是一个邮件标题",
|
||||
text: "这是邮件正文"
|
||||
});
|
||||
</code></pre><h2>app.startActivity(name)<span><a class="mark" href="#app_app_startactivity_name" id="app_app_startactivity_name">#</a></span></h2>
|
||||
<div class="signature"><ul>
|
||||
<li><code>name</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 活动名称,可选的值为:<ul>
|
||||
<li><code>console</code> 日志界面</li>
|
||||
<li><code>settings</code> 设置界面</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div><p>启动Auto.js的特定界面。该函数在Auto.js内运行则会打开Auto.js内的界面,在打包应用中运行则会打开打包应用的相应界面。</p>
|
||||
<pre><code>app.startActivity("console");
|
||||
</code></pre><h1>进阶: 意图Intent<span><a class="mark" href="#app_intent" id="app_intent">#</a></span></h1>
|
||||
<p>Intent(意图) 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:</p>
|
||||
<ul>
|
||||
|
||||
@@ -83,6 +83,7 @@
|
||||
<li><span class="stability_undefined"><a href="#events_events_oncekeyup_keyname_listener">events.onceKeyUp(keyName, listener)</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#events_events_removeallkeydownlisteners_keyname">events.removeAllKeyDownListeners(keyName)</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#events_events_removeallkeyuplisteners_keyname">events.removeAllKeyUpListeners(keyName)</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#events_events_setkeyinterceptionenabled_key_enabled">events.setKeyInterceptionEnabled([key, ]enabled)</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#events_events_observetouch">events.observeTouch()</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#events_events_settoucheventtimeout_timeout">events.setTouchEventTimeout(timeout)</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#events_events_gettoucheventtimeout">events.getTouchEventTimeout()</a></span></li>
|
||||
@@ -219,6 +220,21 @@ events.onKeyDown("home", function(event){
|
||||
<li><code>keyName</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 按键名称</li>
|
||||
</ul>
|
||||
</div><p>删除该按键的KeyUp(弹起)事件的所有监听。</p>
|
||||
<h2>events.setKeyInterceptionEnabled([key, ]enabled)<span><a class="mark" href="#events_events_setkeyinterceptionenabled_key_enabled" id="events_events_setkeyinterceptionenabled_key_enabled">#</a></span></h2>
|
||||
<div class="signature"><ul>
|
||||
<li><code>enabled</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type"><boolean></a></li>
|
||||
<li><code>key</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 要屏蔽的按键</li>
|
||||
</ul>
|
||||
</div><p>设置按键屏蔽是否启用。所谓按键屏蔽指的是,屏蔽原有按键的功能,例如使得音量键不再能调节音量,但此时仍然能通过按键事件监听按键。</p>
|
||||
<p>如果不加参数key则会屏蔽所有按键。</p>
|
||||
<p>例如,调用<code>events.setKeyInterceptionEnabled(true)</code>会使系统的音量、Home、返回等键不再具有调节音量、回到主页、返回的作用,但此时仍然能通过按键事件监听按键。</p>
|
||||
<p>该函数通常于按键监听结合,例如想监听音量键并使音量键按下时不弹出音量调节框则为:</p>
|
||||
<pre><code>events.setKeyInterceptionEnabled("volume_up", true);
|
||||
events.observeKey();
|
||||
events.onKeyDown("volume_up", ()=>{
|
||||
log("音量上键被按下");
|
||||
});
|
||||
</code></pre><p>只要有一个脚本屏蔽了某个按键,该按键便会被屏蔽;当脚本退出时,会自动解除所有按键屏蔽。</p>
|
||||
<h2>events.observeTouch()<span><a class="mark" href="#events_events_observetouch" id="events_events_observetouch">#</a></span></h2>
|
||||
<p>启用屏幕触摸监听。(需要root权限)</p>
|
||||
<p>只有这个函数被成功执行后, 触摸事件的监听才有效。</p>
|
||||
|
||||
@@ -118,8 +118,8 @@ http.get("www.baidu.com", {}, function(res, err){
|
||||
console.error(err);
|
||||
return;
|
||||
}
|
||||
log("code = " + r.statusCode);
|
||||
log("html = " + r.body.string());
|
||||
log("code = " + res.statusCode);
|
||||
log("html = " + res.body.string());
|
||||
});
|
||||
</code></pre><p>如果要增加HTTP头部信息,则在options参数中添加,例如:</p>
|
||||
<pre><code>console.show();
|
||||
|
||||
@@ -76,6 +76,8 @@
|
||||
<ul>
|
||||
<li><span class="stability_undefined"><a href="#widgets_based_automation">基于控件的操作</a></span><ul>
|
||||
<li><span class="stability_undefined"><a href="#widgets_based_automation_auto_mode">auto([mode])</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#widgets_based_automation_auto_waitfor">auto.waitFor()</a></span></li>
|
||||
<li><span class="stability_undefined"><a href="#widgets_based_automation_auto_setmode_mode">auto.setMode(mode)</a></span></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><span class="stability_2"><a href="#widgets_based_automation_simpleactionautomator">SimpleActionAutomator</a></span><ul>
|
||||
@@ -213,11 +215,23 @@
|
||||
<li><code>normal</code> 正常模式,默认。</li>
|
||||
</ul>
|
||||
<p>如果不加mode参数,则为正常模式。</p>
|
||||
<p>建议使用<code>auto.waitFor()</code>和<code>auto.setMode()</code>代替该函数,因为<code>auto()</code>函数如果无障碍服务未启动会停止脚本;而<code>auto.waitFor()</code>则会在在无障碍服务启动后继续运行。</p>
|
||||
<p>示例:</p>
|
||||
<pre><code>auto("fast");
|
||||
</code></pre><p>示例2:</p>
|
||||
<pre><code>auto();
|
||||
</code></pre><h1>SimpleActionAutomator<span><a class="mark" href="#widgets_based_automation_simpleactionautomator" id="widgets_based_automation_simpleactionautomator">#</a></span></h1>
|
||||
</code></pre><h2>auto.waitFor()<span><a class="mark" href="#widgets_based_automation_auto_waitfor" id="widgets_based_automation_auto_waitfor">#</a></span></h2>
|
||||
<p>检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。</p>
|
||||
<h2>auto.setMode(mode)<span><a class="mark" href="#widgets_based_automation_auto_setmode_mode" id="widgets_based_automation_auto_setmode_mode">#</a></span></h2>
|
||||
<div class="signature"><ul>
|
||||
<li><code>mode</code> <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type"><string></a> 模式</li>
|
||||
</ul>
|
||||
</div><p>设置无障碍模式为mode。mode的可选值为:</p>
|
||||
<ul>
|
||||
<li><code>fast</code> 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。</li>
|
||||
<li><code>normal</code> 正常模式,默认。</li>
|
||||
</ul>
|
||||
<h1>SimpleActionAutomator<span><a class="mark" href="#widgets_based_automation_simpleactionautomator" id="widgets_based_automation_simpleactionautomator">#</a></span></h1>
|
||||
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><p>SimpleActionAutomator提供了一些模拟简单操作的函数,例如点击文字、模拟按键等。这些函数可以直接作为全局函数使用。</p>
|
||||
<h2>click(text[, i])<span><a class="mark" href="#widgets_based_automation_click_text_i" id="widgets_based_automation_click_text_i">#</a></span></h2>
|
||||
<div class="signature"><ul>
|
||||
|
||||
@@ -513,6 +513,11 @@
|
||||
"url": "events.html#events_events_observekey",
|
||||
"summary": "监听按键"
|
||||
},
|
||||
{
|
||||
"key": "setKeyInterceptionEnabled",
|
||||
"url": "events.html#events_events_setkeyinterceptionenabled_key_enabled",
|
||||
"summary": "屏蔽按键"
|
||||
},
|
||||
{
|
||||
"key": "observeTouch",
|
||||
"url": "events.html#events_events_observetouch",
|
||||
|
||||
@@ -111,13 +111,8 @@ module.exports = function(runtime, global){
|
||||
|
||||
global.auto = function(mode){
|
||||
if(mode){
|
||||
if(typeof(mode) !== "string"){
|
||||
throw new TypeError("mode should be a string");
|
||||
}
|
||||
mode = modes[mode.toLowerCase()];
|
||||
global.auto.setMode(mode);
|
||||
}
|
||||
mode = mode || 0;
|
||||
runtime.accessibilityBridge.setMode(mode);
|
||||
runtime.accessibilityBridge.ensureServiceEnabled();
|
||||
}
|
||||
|
||||
@@ -125,6 +120,14 @@ module.exports = function(runtime, global){
|
||||
runtime.accessibilityBridge.waitForServiceEnabled();
|
||||
}
|
||||
|
||||
global.auto.setMode = function(mode){
|
||||
if(typeof(mode) !== "string"){
|
||||
throw new TypeError("mode should be a string");
|
||||
}
|
||||
mode = modes[mode.toLowerCase()] || 0;
|
||||
runtime.accessibilityBridge.setMode(mode);
|
||||
}
|
||||
|
||||
|
||||
global.__asGlobal__(runtime.automator, ['back', 'home', 'powerDialog', 'notifications', 'quickSettings', 'recents', 'splitScreen']);
|
||||
global.__asGlobal__(automator, ['click', 'longClick', 'press', 'swipe', 'gesture', 'gestures', 'gestureAsync', 'gesturesAsync', 'scrollDown', 'scrollUp', 'input', 'setText']);
|
||||
|
||||
@@ -9,8 +9,6 @@ import android.os.Handler;
|
||||
import android.provider.Settings;
|
||||
import android.support.annotation.RequiresApi;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.stardust.autojs.R;
|
||||
import com.stardust.autojs.core.accessibility.AccessibilityBridge;
|
||||
@@ -30,6 +28,9 @@ import com.stardust.view.accessibility.KeyInterceptor;
|
||||
import com.stardust.view.accessibility.NotificationListener;
|
||||
import com.stardust.view.accessibility.OnKeyListener;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/7/18.
|
||||
*/
|
||||
@@ -50,8 +51,9 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
|
||||
private boolean mListeningNotification = false;
|
||||
private boolean mListeningToast = false;
|
||||
private ScriptRuntime mScriptRuntime;
|
||||
private volatile boolean mInterceptsKey = false;
|
||||
private volatile boolean mInterceptsAllKey = false;
|
||||
private KeyInterceptor mKeyInterceptor;
|
||||
private Set<String> mInterceptedKeys = new HashSet<>();
|
||||
|
||||
public Events(Context context, AccessibilityBridge accessibilityBridge, ScriptRuntime runtime) {
|
||||
super(runtime.bridges);
|
||||
@@ -105,13 +107,33 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
|
||||
}
|
||||
|
||||
public void setKeyInterceptionEnabled(boolean enabled) {
|
||||
mInterceptsKey = enabled;
|
||||
if (mInterceptsKey && mKeyInterceptor == null) {
|
||||
mKeyInterceptor = event -> mInterceptsKey;
|
||||
getAccessibilityService().getKeyInterrupterObserver().addKeyInterrupter(mKeyInterceptor);
|
||||
mInterceptsAllKey = enabled;
|
||||
if (mInterceptsAllKey) {
|
||||
ensureKeyInterceptor();
|
||||
}
|
||||
}
|
||||
|
||||
public void setKeyInterceptionEnabled(String key, boolean enabled) {
|
||||
if (enabled) {
|
||||
mInterceptedKeys.add(key);
|
||||
ensureKeyInterceptor();
|
||||
} else {
|
||||
mInterceptedKeys.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
private void ensureKeyInterceptor() {
|
||||
if (mKeyInterceptor != null)
|
||||
return;
|
||||
mKeyInterceptor = event -> {
|
||||
if (mInterceptsAllKey)
|
||||
return true;
|
||||
String keyName = KeyEvent.keyCodeToString(event.getKeyCode()).substring(8).toLowerCase();
|
||||
return mInterceptedKeys.contains(keyName);
|
||||
};
|
||||
getAccessibilityService().getKeyInterrupterObserver().addKeyInterrupter(mKeyInterceptor);
|
||||
}
|
||||
|
||||
private AccessibilityService getAccessibilityService() {
|
||||
mScriptRuntime.ensureAccessibilityServiceEnabled();
|
||||
AccessibilityService service = mAccessibilityBridge.getService();
|
||||
|
||||
Reference in New Issue
Block a user