diff --git a/app/src/main/assets/docs/all.html b/app/src/main/assets/docs/all.html index 1920eb19..b9861522 100644 --- a/app/src/main/assets/docs/all.html +++ b/app/src/main/assets/docs/all.html @@ -2,8 +2,8 @@ - 综述 | Auto.js 3.0.0 文档 - + 综述 | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@
-

Auto.js 3.0.0 文档

+

Auto.js 4.1.0 文档

索引 | @@ -77,8 +77,9 @@

  • 综述
  • Q & A
  • @@ -105,6 +106,11 @@
  • app.intent(options)
  • app.startActivity(options)
  • app.sendBroadcast(options)
  • +
  • app.startService(options)
  • +
  • app.sendBroadcast(name)
  • +
  • app.intentToShell(options)
  • +
  • app.parseUri(uri)
  • +
  • app.getUriForFile(path)
  • Console
  • @@ -415,6 +425,8 @@
  • requiresApi(api)
  • requiresAutojsVersion(version)
  • runtime.requestPermissions(permissions)
  • +
  • runtime.loadJar(path)
  • +
  • runtime.loadDex(path)
  • context
  • @@ -462,19 +474,35 @@
  • colors.MAGENTA
  • colors.TRANSPARENT
  • Images +
  • +
  • MatchingResult
  • Image
  • SimpleActionAutomator
      @@ -552,6 +602,7 @@
    • UiSelector
      • selector()
      • +
      • UiSelector.algorithm(algorithm)
      • UiSelector.text(str)
      • UiSelector.textContains(str)
      • UiSelector.textStartsWith(prefix)
      • @@ -933,35 +984,30 @@

        Q & A#

        如何定时运行脚本#

        点击脚本右边的菜单按钮->更多->定时任务即可定时运行脚本,但是必须保持Auto.js后台运行(自启动白名单、电源管理白名单等)。同时,可以在脚本的开头使用device.wakeUp()来唤醒屏幕;但是,Auto.js没有解锁屏幕的功能,因此难以在有锁屏密码的设备上达到效果。

        -

        如何把图片和脚本一起打包,或者打包多个脚本#

        -

        如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目打包功能。

        -
          -
        1. 新建一个文件夹,命名为项目名称。
        2. -
        3. 在该文件夹下新建脚本,或者移动脚本到该文件夹,命名为main.js,表示主脚本。脚本打包后将会从该脚本开始运行。
        4. -
        5. 把其他资源或脚本放在该文件夹,并通过相对路径引用。
        6. -
        7. 通过文件夹菜单的"打包"功能来打包该项目
        8. -
        +

        定时任何如何获取外部参数#

        +

        如果一个脚本是用intent"启动"的,比如定时任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent获取启动的intent,从而获取外部参数。

        +

        如何把图片和脚本一起打包,或者打包多个脚本#

        +

        如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。

        +

        点击Auto.js的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的apk打包图标即可打包一个项目,点击工具栏可以重新配置项目。

        例如,主脚本要读取同一文件夹下的图片1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录1.png图片;ui中的图片控件要引用同一文件夹的2.png图片则为<img src="file://2.png"/>。Auto.js内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。

        -

        目前Auto.js还不支持项目的图形化管理,后续会加入。

        -

        如何使打包的应用不显示主界面#

        -

        需要使用项目打包功能。

        -
          -
        1. 新建一个文件夹,命名为项目名称。
        2. -
        3. 在该文件夹下新建脚本,或者移动脚本到该文件夹,命名为main.js,表示主脚本。脚本打包后将会从该脚本开始运行。
        4. -
        5. 在该文件夹下新建一个project.json的文件,其内容如下:
          {
          -"name": "项目名称",
          -"versionName": "1.0.0",
          -"versionCode": 1,
          -"packageName": "org.autojs.example",
          -"main": "main.js",
          -"launchConfig": {
          -   "hideLogs": true
          +

          如何使打包的应用不显示主界面#

          +

          需要使用项目功能。新建项目后,修改项目下的project.json文件,增加以下条目:

          +
          "launchConfig": {
          +    "hideLogs": true
           }
          +

          例如:

          +
          {
          +  "name": "项目名称",
          +  "versionName": "1.0.0",
          +  "versionCode": 1,
          +  "packageName": "org.autojs.example",
          +  "main": "main.js",
          +  "launchConfig": {
          +      "hideLogs": true
          +  }
           }
          -
          其中,项目名称改为自己的项目名称,"org.autojs.example"改成自己的包名,下面的"launchConfig"表示启动配置,"hideLogs"表示隐藏日志。
        6. -
        7. 通过文件夹菜单的"打包"功能来打包该项目
        8. -
        -

        有关项目打包和配置的更多信息,参见项目与项目配置(待补)。

        +

        "launchConfig"表示启动配置,"hideLogs"表示隐藏日志。

        +

        参见项目与项目配置。

        Auto.js自带的模块和函数中没有的功能如何实现#

        由于Auto.js支持直接调用Android的API,对于Auto.js没有内置的函数,可以直接通过修改Android代码为JavaScript代码实现。例如旋转图片的Android代码为:

        import android.graphics.Bitmap;
        @@ -1060,7 +1106,7 @@ launch("com.tencent.mm");
         

        该函数也可以作为全局函数使用。

        app.viewFile(path)#

        用其他应用查看文件。文件不存在的情况由查看文件的应用处理。

        如果找不出可以查看该文件的应用,则抛出ActivityNotException

        @@ -1068,7 +1114,7 @@ launch("com.tencent.mm"); app.viewFile("/sdcard/1.txt");

        app.editFile(path)#

        用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。

        如果找不出可以编辑该文件的应用,则抛出ActivityNotException

        @@ -1132,17 +1178,36 @@ app.sendEmail({

      本模块提供了构建Intent的函数(app.intent()), 启动Activity的函数app.startActivity(), 发送广播的函数app.sendBroadcast()

      使用这些方法可以用来方便的调用其他应用。例如直接打开某个QQ号的个人卡片页,打开某个QQ号的聊天窗口等。

      -
      
      +
      var qq = "2732014414";
      +app.startActivity({ 
      +    action: "android.intent.action.VIEW", 
      +    data:"mqq://im/chat?chat_type=wpa&version=1&src_type=web&uin=" + qq, 
      +    packageName: "com.tencent.mobileqq", 
      +});
       

      app.intent(options)#

        -
      • options <Object> 选项,包括:
          -
        • action <string> 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。常见的action参见常用的意图动作
        • -
        • type <string> 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。
        • -
        • data <string> 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。
        • -
        • category <Array> 意图的类别。比较少用。
        • -
        • packageName <string> 目标包名
        • -
        • className <string> 目标Activity或Service等组件的名称
        • -
        • extras <Object> 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。
        • +
        • options <Object> 选项,包括:

          +
            +
          • action <string> 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。参见Actions

            +
          • +
          • type <string> 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。

            +
          • +
          • data <string> 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。

            +
          • +
          • category <Array> 意图的类别。比较少用。参见Categories

            +
          • +
          • packageName <string> 目标包名

            +
          • +
          • className <string> 目标Activity或Service等组件的名称

            +
          • +
          • extras <Object> 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。参见Extras

            +
          • +
          • flags <Array> intent的标识,字符串数组,例如["activity_new_task", "grant_read_uri_permission"]。参见Flags

            +

            [v4.1.0新增]

            +
          • +
          • root <Boolea> 是否以root权限启动、发送该intent。使用该参数后,不能使用context.startActivity()等方法,而应该直接使用诸如app.startActivity({...})的方法。

            +

            [v4.1.0新增]

            +
        @@ -1154,19 +1219,75 @@ var i = app.intent({ type: "image/png", data: "file:///sdcard/1.png" }); -app.startActivity(i); -

      更多信息,请百度安卓Intent或参考Android指南: Intent

      +context.startActivity(i); +

      需要注意的是,除非应用专门暴露Activity出来,否则在没有root权限的情况下使用intent是无法跳转到特定Activity、应用的特定界面的。例如我们能通过Intent跳转到QQ的分享界面,是因为QQ对外暴露了分享的Activity;而在没有root权限的情况下,我们无法通过intent跳转到QQ的设置界面,因为QQ并没有暴露这个Activity。

      +

      但如果有root权限,则在intent的参数加上"root": true即可。例如使用root权限跳转到Auto.js的设置界面为:

      +
      app.startActivity({
      +    packageName: "org.autojs.autojs",
      +    className: "org.autojs.autojs.ui.settings.SettingsActivity_",
      +    root: true
      +});
      +

      另外,关于intent的参数如何获取的问题,一些intent是意外发现并且在网络中传播的(例如跳转QQ聊天窗口是因为QQ给网页提供了跳转到客服QQ的方法),如果要自己获取活动的intent的参数,可以通过例如"intent记录","隐式启动"等应用拦截内部intent或者查询暴露的intent。其中拦截内部intent需要XPosed框架,或者可以通过反编译等手段获取参数。总之,没有简单直接的方法。

      +

      更多信息,请百度安卓Intent或参考Android指南: Intent

      app.startActivity(options)#

      根据选项构造一个Intent,并启动该Activity。

      -

      app.sendBroadcast(options)#

      +
      app.startActivity({
      +    action: "SEND",
      +    type: "text/plain",
      +    data: "file:///sdcard/1.txt"
      +});
      +

      app.sendBroadcast(options)#

      根据选项构造一个Intent,并发送该广播。

      - +

      app.startService(options)#

      +
      +

      根据选项构造一个Intent,并启动该服务。

      +

      app.sendBroadcast(name)#

      +

      [v4.1.0新增]

      +
        +
      • name <string> 特定的广播名称,包括:
          +
        • inspect_layout_hierarchy 布局层次分析
        • +
        • inspect_layout_bounds 布局范围
        • +
        +
      • +
      +

      发送以上特定名称的广播可以触发Auto.js的布局分析,方便脚本调试。这些广播在Auto.js发送才有效,在打包的脚本上运行将没有任何效果。

      +
      app.sendBroadcast("inspect_layout_bounds");
      +

      app.intentToShell(options)#

      +

      [v4.1.0新增]

      + +

      根据选项构造一个Intent,转换为对应的shell的intent命令的参数。

      +

      例如:

      +
      shell("am start " + app.intentToShell({
      +    packageName: "org.autojs.autojs",
      +    className: "org.autojs.autojs.ui.settings.SettingsActivity_"
      +}), true);
      +

      参见intent参数的规范

      +

      app.parseUri(uri)#

      +

      [v4.1.0新增]

      + +

      解析uri字符串并返回相应的Uri对象。即使Uri格式错误,该函数也会返回一个Uri对象,但之后如果访问该对象的scheme, path等值可能因解析失败而返回null

      +

      需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此如果uri字符串是文件file://...,返回的Uri会是诸如content://...的形式。

      +

      app.getUriForFile(path)#

      +

      [v4.1.0新增]

      +
        +
      • path <string> 文件路径,例如"/sdcard/1.txt"
      • +
      • 返回 <Uri> 一个指向该文件的Uri的对象,参见android.net.Uri
      • +
      +

      从一个文件路径创建一个uri对象。需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此返回的Uri会是诸如content://...的形式。 +

      Console#

      Stability: 2 - Stable

      控制台模块提供了一个和Web浏览器中相似的用于调试的控制台。用于输出一些调试信息、中间结果等。 @@ -1179,8 +1300,8 @@ console模块中的一些函数也可以直接作为全局函数使用,例如l

      清空控制台。

      console.log([data][, ...args])#

        -
      • data
      • -
      • ...args
      • +
      • data <any>
      • +
      • ...args <any>

      打印到控制台,并带上换行符。 可以传入多个参数,第一个参数作为主要信息,其他参数作为类似于 printf(3) 中的代替值(参数都会传给 util.format())。

      const count = 5;
      @@ -1192,26 +1313,26 @@ console.log('count:', count);
       

      该函数也可以作为全局函数使用。

      console.verbose([data][, ...args])#

        -
      • data
      • -
      • ...args
      • +
      • data <any>
      • +
      • ...args <any>

      与console.log类似,但输出结果以灰色字体显示。输出优先级低于log,用于输出观察性质的信息。

      console.info([data][, ...args])#

        -
      • data
      • -
      • ...args
      • +
      • data <any>
      • +
      • ...args <any>

      与console.log类似,但输出结果以绿色字体显示。输出优先级高于log, 用于输出重要信息。

      console.warn([data][, ...args])#

        -
      • data
      • -
      • ...args
      • +
      • data <any>
      • +
      • ...args <any>

      与console.log类似,但输出结果以蓝色字体显示。输出优先级高于info, 用于输出警告信息。

      console.error([data][, ...args])#

        -
      • data
      • -
      • ...args
      • +
      • data <any>
      • +
      • ...args <any>

      与console.log类似,但输出结果以红色字体显示。输出优先级高于warn, 用于输出错误信息。

      console.assert(value, message)#

      @@ -1222,10 +1343,46 @@ console.log('count:', count);
  • 断言。如果value为false则输出错误信息message并停止脚本运行。

    var a = 1 + 1;
     console.assert(a == 2, "加法出错啦");
    -

    console.input(data[, ...args])#

    +

    console.time([label])#

    +

    [v4.1.0新增]

    + +

    启动一个定时器,用以计算一个操作的持续时间。 +定时器由一个唯一的 label 标识。 +当调用 console.timeEnd() 时,可以使用相同的 label 来停止定时器,并以毫秒为单位将持续时间输出到控制台。 +重复启动同一个标签的定时器会覆盖之前启动同一标签的定时器。

    +

    console.timeEnd(label)#

    +

    [v4.1.0新增]

    + +

    停止之前通过调用 console.time() 启动的定时器,并打印结果到控制台。 +调用 console.timeEnd() 后定时器会被删除。如果不存在标签指定的定时器则会打印 NaNms

    +
    console.time('求和');
    +var sum = 0;
    +for(let i = 0; i < 100000; i++){
    +    sum += i;
    +}
    +console.timeEnd('求和');
    +// 打印 求和: xxx ms
    +
    +

    console.trace([data][, ...args])#

    +

    [v4.1.0新增]

    + +

    与console.log类似,同时会打印出调用这个函数所在的调用栈信息(即当前运行的文件、行数等信息)。

    +
    console.trace('Show me');
    +// 打印: (堆栈跟踪会根据被调用的跟踪的位置而变化)
    +// Show me
    +//  at <test>:7
    +
    +

    console.input(data[, ...args])#

      -
    • data
    • -
    • ...args
    • +
    • data <any>
    • +
    • ...args <any>

    与console.log一样输出信息,并在控制台显示输入框等待输入。按控制台的确认按钮后会将输入的字符串用eval计算后返回。

    部分机型可能会有控制台不显示输入框的情况,属于bug。

    @@ -1236,8 +1393,8 @@ toast(n + 1); //显示124

    console.rawInput(data[, ...args])#

      -
    • data
    • -
    • ...args
    • +
    • data <any>
    • +
    • ...args <any>

    与console.log一样输出信息,并在控制台显示输入框等待输入。按控制台的确认按钮后会将输入的字符串直接返回。

    部分机型可能会有控制台不显示输入框的情况,属于bug。

    @@ -1263,7 +1420,24 @@ console.setSize(device.width / 2, device.height / 2);

    设置控制台的位置,单位像素。

    console.show();
     console.setPosition(100, 100);
    -

    print(text)#

    +

    console.setGlobalLogConfig(config)#

    +

    [v4.1.0新增]

    + +

    设置日志保存的路径和配置。例如把日志保存到"/sdcard/1.txt":

    +
    console.setGlobalLogConfig({
    +    "file": "/sdcard/1.txt"
    +});
    +

    注意该函数会影响所有脚本的日志记录。

    +

    print(text)#

    @@ -2225,6 +2399,10 @@ exec(add, {a: 1, b:2});

    停止所有正在运行的脚本并显示停止的脚本数量。包括当前脚本自身。

    engines.myEngine()#

    返回当前脚本的脚本引擎对象(ScriptEngine)

    +

    [v4.1.0新增] +特别的,该对象可以通过execArgv来获取他的运行参数,包括外部参数、intent等。例如:

    +
    log(engines.myEngine().execArgv);
    +

    普通脚本的运行参数通常为空,通过定时任务的广播启动的则可以获取到启动的intent。

    engines.all()#

    您可以通过APK编辑器来增加Auto.js以及Auto.js打包的应用的权限。

    安卓所有的权限列表参见Permissions Overview。(并没有用)

    +

    runtime.loadJar(path)#

    +
    +

    加载目标jar文件,加载成功后将可以使用该Jar文件的类。

    +
    // 加载jsoup.jar
    +runtime.loadJar("./jsoup.jar");
    +// 使用jsoup解析html
    +importClass(org.jsoup.Jsoup);
    +log(Jsoup.parse(files.read("./test.html")));
    +

    (jsoup是一个Java实现的解析Html DOM的库,可以在Jsoup下载)

    +

    runtime.loadDex(path)#

    +
    +

    加载目标dex文件,加载成功后将可以使用该dex文件的类。

    +

    因为加载jar实际上是把jar转换为dex再加载的,因此加载dex文件会比jar文件快得多。可以使用Android SDK的build tools的dx工具把jar转换为dex。

    context#

    全局变量。一个android.content.Context对象。

    注意该对象为ApplicationContext,因此不能用于界面、对话框等的创建。 @@ -3608,7 +3803,304 @@ log(colors.equals(0xFF112233, 0xFF223344));

    colors.TRANSPARENT#

    透明,颜色值 #00000000

    Images#

    -
    Stability: 2 - Stable

    images模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、找色、找图等。

    +
    Stability: 2 - Stable

    images模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。

    +

    该模块分为两个部分,找图找色部分和图片处理部分。

    +

    需要注意的是,image对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管Auto.js通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。

    +

    Image对象通过调用recycle()函数来回收。例如:

    +
    // 读取图片
    +var img = images.read("./1.png");
    +//对图片进行操作
    +... 
    +// 回收图片
    +img.recycle();
    +

    例外的是,caputerScreen()返回的图片不需要回收。

    +

    图片处理#

    +

    images.read(path)#

    +
    +

    读取在路径path的图片文件并返回一个Image对象。如果文件不存在或者文件无法解码则返回null。

    +

    images.load(url)#

    +
    +

    加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。

    +

    images.copy(img)#

    +
      +
    • img <Image> 图片
    • +
    • 返回 <Image>
    • +
    +

    复制一张图片并返回新的副本。该函数会完全复制img对象的数据。

    +

    images.save(image, path[, format = "png", quality = 100])#

    +
      +
    • image <Image> 图片
    • +
    • path <string> 路径
    • +
    • format <string> 图片格式,可选的值为:
        +
      • png
      • +
      • jpeg/jpg
      • +
      • webp
      • +
      +
    • +
    • quality <number> 图片质量,为0~100的整数值
    • +
    +

    把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。

    +
    //把图片压缩为原来的一半质量并保存
    +var img = images.read("/sdcard/1.png");
    +images.save(img, "/sdcard/1.jpg", "jpg", 50);
    +app.viewFile("/sdcard/1.jpg");
    +

    images.fromBase64(base64)#

    +
      +
    • base64 <string> 图片的Base64数据
    • +
    • 返回 <Image>
    • +
    +

    解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null

    +

    images.toBase64(img[, format = "png", quality = 100])#

    +
      +
    • image <image> 图片
    • +
    • format <string> 图片格式,可选的值为:
        +
      • png
      • +
      • jpeg/jpg
      • +
      • webp
      • +
      +
    • +
    • quality <number> 图片质量,为0~100的整数值
    • +
    • 返回 <string>
    • +
    +

    把图片编码为base64数据并返回。

    +

    images.fromBytes(bytes)#

    +
      +
    • bytes <byte[]> 字节数组
    • +
    +

    解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null

    +

    images.toBytes(img[, format = "png", quality = 100])#

    +
      +
    • image <image> 图片
    • +
    • format <string> 图片格式,可选的值为:
        +
      • png
      • +
      • jpeg/jpg
      • +
      • webp
      • +
      +
    • +
    • quality <number> 图片质量,为0~100的整数值
    • +
    • 返回 <byte[]>
    • +
    +

    把图片编码为字节数组并返回。

    +

    images.clip(img, x, y, w, h)#

    +
      +
    • img <Image> 图片
    • +
    • x <number> 剪切区域的左上角横坐标
    • +
    • y <number> 剪切区域的左上角纵坐标
    • +
    • w <number> 剪切区域的宽度
    • +
    • h <number> 剪切区域的高度
    • +
    • 返回 <Image>
    • +
    +

    从图片img的位置(x, y)处剪切大小为w * h的区域,并返回该剪切区域的新图片。

    +
    var src = images.read("/sdcard/1.png");
    +var clip = images.clip(src, 100, 100, 400, 400);
    +images.save(clip, "/sdcard/clip.png");
    +

    images.resize(img, size[, interpolation])#

    +

    [v4.1.0新增]

    + +

    调整图片大小,并返回调整后的图片。例如把图片放缩为200*300:images.resize(img, [200, 300])

    +

    参见Imgproc.resize

    +

    images.scale(img, fx, fy[, interpolation])#

    +

    [v4.1.0新增]

    + +

    放缩图片,并返回放缩后的图片。例如把图片变成原来的一半:images.scale(img, 0.5, 0.5)

    +

    参见Imgproc.resize

    +

    images.rotate(img, degress[, x, y])#

    +

    [v4.1.0新增]

    + +

    将图片逆时针旋转degress度,返回旋转后的图片对象。

    +

    例如逆时针旋转90度为images.rotate(img, 90)

    +

    images.concat(img1, image2[, direction])#

    +

    [v4.1.0新增]

    + +

    连接两张图片,并返回连接后的图像。如果两张图片大小不一致,小的那张将适当居中。

    +

    images.grayscale(img)#

    +

    [v4.1.0新增]

    + +

    灰度化图片,并返回灰度化后的图片。

    +

    image.threshold(img, threshold, maxVal[, type])#

    +

    [v4.1.0新增]

    + +

    将图片阈值化,并返回处理后的图像。可以用这个函数进行图片二值化。例如:images.threshold(img, 100, 255, "BINARY"),这个代码将图片中大于100的值全部变成255,其余变成0,从而达到二值化的效果。如果img是一张灰度化图片,这个代码将会得到一张黑白图片。

    +

    可以参考有关博客(比如threshold函数的使用)或者OpenCV文档threshold

    +

    images.adaptiveThreshold(img, maxValue, adaptiveMethod, thresholdType, blockSize, C)#

    +

    [v4.1.0新增]

    + +

    对图片进行自适应阈值化处理,并返回处理后的图像。

    +

    可以参考有关博客(比如threshold与adaptiveThreshold)或者OpenCV文档adaptiveThreshold

    +

    images.cvtColor(img, code[, dstCn])#

    +

    [v4.1.0新增]

    + +

    对图像进行颜色空间转换,并返回转换后的图像。

    +

    可以参考有关博客(比如颜色空间转换)或者OpenCV文档cvtColor

    +

    images.inRange(img, lowerBound, upperBound)#

    +

    [v4.1.0新增]

    + +

    将图片二值化,在lowerBound~upperBound范围以外的颜色都变成0,在范围以内的颜色都变成255。

    +

    例如images.inRange(img, "#000000", "#222222")

    +

    images.interval(img, color, interval)#

    +

    [v4.1.0新增]

    + +

    将图片二值化,在color-interval ~ color+interval范围以外的颜色都变成0,在范围以内的颜色都变成255。这里对color的加减是对每个通道而言的。

    +

    例如images.interval(img, "#888888", 16),每个通道的颜色值均为0x88,加减16后的范围是[0x78, 0x98],因此这个代码将把#787878~#989898的颜色变成#FFFFFF,而把这个范围以外的变成#000000。

    +

    images.blur(img, size[, anchor, type])#

    +

    [v4.1.0新增]

    + +

    对图像进行模糊(平滑处理),返回处理后的图像。

    +

    可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档blur

    +

    images.medianBlur(img, size)#

    +

    [v4.1.0新增]

    + +

    对图像进行中值滤波,返回处理后的图像。

    +

    可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档blur

    +

    images.gaussianBlur(img, size[, sigmaX, sigmaY, type])#

    +

    [v4.1.0新增]

    + +

    对图像进行高斯模糊,返回处理后的图像。

    +

    可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档GaussianBlur

    +

    images.matToImage(mat)#

    +

    [v4.1.0新增]

    + +

    把Mat对象转换为Image对象。

    +

    找图找色#

    images.requestScreenCapture([landscape])#

    • landscape <boolean> 布尔值, 表示将要执行的截屏是否为横屏。如果landscape为false, 则表示竖屏截图; true为横屏截图。
    • @@ -3662,90 +4154,7 @@ toast(colors.toString(color));

    返回图片image在点(x, y)处的像素的ARGB值。

    该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。

    坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。

    -

    images.copy(img)#

    -
      -
    • img <Image> 图片
    • -
    • 返回 <Image>
    • -
    -

    复制一张图片并返回新的副本。该函数会完全复制img对象的数据。

    -

    images.save(image, path[, format = "png", quality = 100])#

    -
      -
    • image <Image> 图片
    • -
    • path <string> 路径
    • -
    • format <string> 图片格式,可选的值为:
        -
      • png
      • -
      • jpeg/jpg
      • -
      • webp
      • -
      -
    • -
    • quality <number> 图片质量,为0~100的整数值
    • -
    -

    把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。

    -
    //把图片压缩为原来的一半质量并保存
    -var img = images.read("/sdcard/1.png");
    -images.save(img, "/sdcard/1.jpg", "jpg", 50);
    -app.viewFile("/sdcard/1.jpg");
    -

    images.read(path)#

    -
    -

    读取在路径path的图片文件并返回一个Image对象。如果文件不存在或者文件无法解码则返回null。

    -

    images.load(url)#

    -
    -

    加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。

    -

    images.fromBase64(base64)#

    -
      -
    • base64 <string> 图片的Base64数据
    • -
    • 返回 <Image>
    • -
    -

    解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null

    -

    images.toBase64(img[, format = "png", quality = 100])#

    -
      -
    • image <image> 图片
    • -
    • format <string> 图片格式,可选的值为:
        -
      • png
      • -
      • jpeg/jpg
      • -
      • webp
      • -
      -
    • -
    • quality <number> 图片质量,为0~100的整数值
    • -
    • 返回 <string>
    • -
    -

    把图片编码为base64数据并返回。

    -

    images.fromBytes(bytes)#

    -
      -
    • bytes <byte[]> 字节数组
    • -
    -

    解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null

    -

    images.toBytes(img[, format = "png", quality = 100])#

    -
      -
    • image <image> 图片
    • -
    • format <string> 图片格式,可选的值为:
        -
      • png
      • -
      • jpeg/jpg
      • -
      • webp
      • -
      -
    • -
    • quality <number> 图片质量,为0~100的整数值
    • -
    • 返回 <byte[]>
    • -
    -

    把图片编码为字节数组并返回。

    -

    images.clip(img, x, y, w, h)#

    -
      -
    • img <Image> 图片
    • -
    • x <number> 剪切区域的左上角横坐标
    • -
    • y <number> 剪切区域的左上角纵坐标
    • -
    • w <number> 剪切区域的宽度
    • -
    • h <number> 剪切区域的高度
    • -
    • 返回 <Image>
    • -
    -

    从图片img的位置(x, y)处剪切大小为w * h的区域,并返回该剪切区域的新图片。

    -
    var src = images.read("/sdcard/1.png");
    -var clip = images.clip(src, 100, 100, 400, 400);
    -images.save(clip, "/sdcard/clip.png");
    -

    images.findColor(image, color, options)#

    +

    images.findColor(image, color, options)#

    • image <Image> 图片
    • color <number> | <string> 要寻找的颜色的RGB值。如果是一个整数,则以0xRRGGBB的形式代表RGB值(A通道会被忽略);如果是字符串,则以"#RRGGBB"代表其RGB值。
    • @@ -3923,7 +4332,94 @@ if(p){ threshold: threshold })

      该函数也可以作为全局函数使用。

      -

      Image#

      +

      images.matchTemplate(img, template, options)#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 大图片
      • +
      • template <Image> 小图片(模板)
      • +
      • options <Object> 找图选项:
          +
        • threshold <number> 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
        • +
        • region <Array> 找图区域。参见findColor函数关于region的说明。
        • +
        • max <number> 找图结果最大数量,默认为5
        • +
        • level <number> 一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次, level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。
        • +
        +
      • +
      • 返回 <MatchingResult>
      • +
      +

      在大图片中搜索小图片,并返回搜索结果MatchingResult。该函数可以用于找图时找出多个位置,可以通过max参数控制最大的结果数量。也可以对匹配结果进行排序、求最值等操作。

      +

      MatchingResult#

      +

      [v4.1.0新增]

      +

      matches#

      +
        +
      • <Array> 匹配结果的数组。
      • +
      +

      数组的元素是一个Match对象:

      +
        +
      • point <Point> 匹配位置
      • +
      • similarity <number> 相似度
      • +
      +

      例如:

      +
      var result = images.matchTemplate(img, template, {
      +    max: 100
      +});
      +result.matches.forEach(match => {
      +    log("point = " + match.point + ", similarity = " + match.similarity);
      +});
      +

      points#

      +
        +
      • <Array> 匹配位置的数组。
      • +
      +

      first()#

      +
        +
      • 返回 <Match>
      • +
      +

      第一个匹配结果。如果没有任何匹配,则返回null

      +

      last()#

      +
        +
      • 返回 <Match>
      • +
      +

      最后一个匹配结果。如果没有任何匹配,则返回null

      +

      leftmost()#

      +
        +
      • 返回 <Match>
      • +
      +

      位于大图片最左边的匹配结果。如果没有任何匹配,则返回null

      +

      topmost()#

      +
        +
      • 返回 <Match>
      • +
      +

      位于大图片最上边的匹配结果。如果没有任何匹配,则返回null

      +

      rightmost()#

      +
        +
      • 返回 <Match>
      • +
      +

      位于大图片最右边的匹配结果。如果没有任何匹配,则返回null

      +

      bottommost()#

      +
        +
      • 返回 <Match>
      • +
      +

      位于大图片最下边的匹配结果。如果没有任何匹配,则返回null

      +

      best()#

      +
        +
      • 返回 <Match>
      • +
      +

      相似度最高的匹配结果。如果没有任何匹配,则返回null

      +

      worst()#

      +
        +
      • 返回 <Match>
      • +
      +

      相似度最低的匹配结果。如果没有任何匹配,则返回null

      +

      sortBy(cmp)#

      +
        +
      • cmp <Function>|<string> 比较函数,或者是一个字符串表示排序方向。例如"left"表示将匹配结果按匹配位置从左往右排序、"top"表示将匹配结果按匹配位置从上往下排序,"left-top"表示将匹配结果按匹配位置从左往右、从上往下排序。方向包括left(左), top (上), right (右), bottom(下)。
      • +
      • <MatchingResult>
      • +
      +

      对匹配结果进行排序,并返回排序后的结果。

      +
      var result = images.matchTemplate(img, template, {
      +    max: 100
      +});
      +log(result.sortBy("top-right"));
      +

      Image#

      表示一张图片,可以是截图的图片,或者本地读取的图片,或者从网络获取的图片。

      Image.getWidth()#

      返回以像素为单位图片宽度。

      @@ -3942,6 +4438,7 @@ if(p){

    返回图片image在点(x, y)处的像素的ARGB值。

    该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。

    坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。

    +

    ##

    Point#

    findColor, findImage返回的对象。表示一个点(坐标)。

    Point.x#

    @@ -4210,7 +4707,7 @@ sleep(media.getMusicDuration() - 30 * 1000);

    module (模块)#

    Stability: 2 - Stable

    Auto.js 有一个简单的模块加载系统。 在 Auto.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块)。

    例子,假设有一个名为 foo.js 的文件:

    -
    const circle = require('circle.js');
    +
    var circle = require('circle.js');
     console.log("半径为 4 的圆的面积是 %d", circle.area(4));
     

    在第一行中,foo.js 加载了同一目录下的 circle.js 模块。

    circle.js 文件的内容为:

    @@ -4218,7 +4715,9 @@ console.log("半径为 4 的圆的面积是 %d", circle.area(4)); var circle = {}; -circle.area = (r) => PI * r ** 2; +circle.area = function (r) { + return PI * r * r; +}; circle.circumference = (r) => 2 * PI * r; @@ -4261,6 +4760,7 @@ module.exports = function(width) {
    auto();
     

    auto.waitFor()#

    检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。

    +

    因为该函数是阻塞的,因此除非是有协程特性,否则不能在ui模式下运行该函数,建议在ui模式下使用auto()函数。

    auto.setMode(mode)#

    • mode <string> 模式
    • @@ -4270,6 +4770,72 @@ module.exports = function(width) {
    • fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
    • normal 正常模式,默认。
    +

    auto.setFlags(flags)#

    +

    [v4.1.0新增]

    +
      +
    • flags <string> | <Array> 一些标志,来启用和禁用某些特性,包括:
        +
      • findOnUiThread 使用该特性后,选择器搜索时会在主进程进行。该特性用于解决线程安全问题导致的次生问题,不过目前貌似已知问题并不是线程安全问题。
      • +
      • useUsageStats 使用该特性后,将会以"使用情况统计"服务的结果来检测当前正在运行的应用包名(需要授予"查看使用情况统计"权限)。如果觉得currentPackage()返回的结果不太准确,可以尝试该特性。
      • +
      • useShell 使用该特性后,将使用shell命令获取当前正在运行的应用的包名、活动名称,但是需要root权限。
      • +
      +
    • +
    +

    启用有关automator的一些特性。例如:

    +
    auto.setFlags(["findOnUiThread", "useShell"]);
    +

    auto.serivce#

    +

    [v4.1.0新增]

    + +

    获取无障碍服务。如果无障碍服务没有启动,则返回null

    +

    参见AccessibilityService

    +

    auto.windows#

    +

    [v4.1.0新增]

    + +

    当前所有窗口(AccessibilityWindowInfo)的数组,可能包括状态栏、输入法、当前应用窗口,弹出窗口、悬浮窗、分屏应用窗口等。可以分别获取每个窗口的布局信息。

    +

    该函数需要Android 5.0以上才能运行。

    +

    auto.root#

    +

    [v4.1.0新增]

    +
      +
    • <UiObject>
    • +
    +

    当前窗口的布局根元素。如果无障碍服务未启动或者WindowFilter均返回false,则会返回null

    +

    如果不设置windowFilter,则当前窗口即为活跃的窗口(获取到焦点、正在触摸的窗口);如果设置了windowFilter,则获取的是过滤的窗口中的第一个窗口。

    +

    如果系统是Android5.0以下,则始终返回当前活跃的窗口的布局根元素。

    +

    auto.rootInActiveWindow#

    +

    [v4.1.0新增]

    +
      +
    • <UiObject>
    • +
    +

    当前活跃的窗口(获取到焦点、正在触摸的窗口)的布局根元素。如果无障碍服务未启动则为null

    +

    auto.setWindowFilter(filter)#

    +

    [v4.1.0新增]

    + +

    设置窗口过滤器。这个过滤器可以决定哪些窗口是目标窗口,并影响选择器的搜索。例如,如果想要选择器在所有窗口(包括状态栏、输入法等)中搜索,只需要使用以下代码:

    +
    auto.setWindowFilter(function(window){
    +    //不管是如何窗口,都返回true,表示在该窗口中搜索
    +    return true;
    +});
    +

    又例如,当前使用了分屏功能,屏幕上有Auto.js和QQ两个应用,但我们只想选择器对QQ界面进行搜索,则:

    +
    auto.setWindowFilter(function(window){
    +    // 对于应用窗口,他的title属性就是应用的名称,因此可以通过title属性来判断一个应用
    +    return window.title == "QQ";
    +});
    +

    选择器默认是在当前活跃的窗口中搜索,不会搜索诸如悬浮窗、状态栏之类的,使用WindowFilter则可以控制搜索的窗口。

    +

    需要注意的是, 如果WindowFilter返回的结果均为false,则选择器的搜索结果将为空。

    +

    另外setWindowFilter函数也会影响auto.windowRoots的结果。

    +

    该函数需要Android 5.0以上才有效。

    +

    auto.windowRoots#

    +

    [v4.1.0新增]

    + +

    返回当前被WindowFilter过滤的窗口的布局根元素组成的数组。

    +

    如果系统是Android5.0以下,则始终返回当前活跃的窗口的布局根元素的数组。

    SimpleActionAutomator#

    Stability: 2 - Stable

    SimpleActionAutomator提供了一些模拟简单操作的函数,例如点击文字、模拟按键等。这些函数可以直接作为全局函数使用。

    click(text[, i])#

    @@ -4402,6 +4968,18 @@ sendButton.click();

    创建一个新的选择器。但一般情况不需要使用该函数,因为可以直接用相应条件的语句创建选择器。

    由于历史遗留原因,本不应该这样设计(不应该让id(), text()等作为全局函数,而是应该用By.id(), By.text()),但为了后向兼容性只能保留这个设计。

    这样的API设计会污染全局变量,后续可能会支持"去掉这些全局函数而使用By.*"的选项。

    +

    UiSelector.algorithm(algorithm)#

    +

    [v4.1.0新增]

    +
      +
    • algorithm <string> 搜索算法,可选的值有:
        +
      • DFS 深度优先算法,选择器的默认算法
      • +
      • BFS 广度优先算法
      • +
      +
    • +
    +

    指定选择器的搜索算法。例如:

    +
    log(selector().text("文本").algorithm("BFS").find());
    +

    广度优先在控件所在层次较低时,或者布局的层次不多时,通常能更快找到控件。

    UiSelector.text(str)#

    • str <string> 控件文本
    • @@ -6005,11 +6583,12 @@ setTimeout(function(){

      用户界面: UI#

      ui模块提供了编写用户界面的支持。

      -

      带有ui的脚本的第一行必须使用"ui"指定ui模式,否则脚本将不会以ui模式运行。正确示范:

      +

      带有ui的脚本的的最前面必须使用"ui";指定ui模式,否则脚本将不会以ui模式运行。正确示范:

      "ui";
       
       //脚本的其他代码
      -

      界面是由视图(View)组成的。View分成两种,控件(Widget)和布局(Layout)。控件(Widget)用来具体显示文字、图片、网页等,比如文本控件(text)用来显示文字,按钮控件(button)则可以显示一个按钮并提供点击效果,图片控件(img)则用来显示来自网络或者文件的图片,除此之外还有输入框控件(input)、进度条控件(progressbar)、单选复选框控件(checkbox)等;布局(Layout)则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置,比如垂直布局(vertical)会把他里面的控件从上往下依次显示(即纵向排列),水平布局(horizontal)则会把他里面的控件从左往右依次显示(即横向排列),以及帧布局(frame),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。

      +

    字符串"ui"的前面可以有注释、空行和空格[v4.1.0新增],但是不能有其他代码。

    +

    界面是由视图(View)组成的。View分成两种,控件(Widget)和布局(Layout)。控件(Widget)用来具体显示文字、图片、网页等,比如文本控件(text)用来显示文字,按钮控件(button)则可以显示一个按钮并提供点击效果,图片控件(img)则用来显示来自网络或者文件的图片,除此之外还有输入框控件(input)、进度条控件(progressbar)、单选复选框控件(checkbox)等;布局(Layout)则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置,比如垂直布局(vertical)会把他里面的控件从上往下依次显示(即纵向排列),水平布局(horizontal)则会把他里面的控件从左往右依次显示(即横向排列),以及帧布局(frame),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。

    我们使用xml来编写界面,并通过ui.layout()函数指定界面的布局xml。举个例子:

    "ui";
     ui.layout(
    diff --git a/app/src/main/assets/docs/app.html b/app/src/main/assets/docs/app.html
    index ca798aa3..b67caca8 100644
    --- a/app/src/main/assets/docs/app.html
    +++ b/app/src/main/assets/docs/app.html
    @@ -2,8 +2,8 @@
     
     
       
    -  App | Auto.js 3.0.0 文档
    -  
    +  App | Auto.js 4.1.0 文档
    +  
       
       
       
    @@ -61,7 +61,7 @@
     
         
    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | @@ -97,6 +97,11 @@

  • app.intent(options)
  • app.startActivity(options)
  • app.sendBroadcast(options)
  • +
  • app.startService(options)
  • +
  • app.sendBroadcast(name)
  • +
  • app.intentToShell(options)
  • +
  • app.parseUri(uri)
  • +
  • app.getUriForFile(path)
  • @@ -173,7 +178,7 @@ launch("com.tencent.mm");

    该函数也可以作为全局函数使用。

    app.viewFile(path)#

    用其他应用查看文件。文件不存在的情况由查看文件的应用处理。

    如果找不出可以查看该文件的应用,则抛出ActivityNotException

    @@ -181,7 +186,7 @@ launch("com.tencent.mm"); app.viewFile("/sdcard/1.txt");

    app.editFile(path)#

    用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。

    如果找不出可以编辑该文件的应用,则抛出ActivityNotException

    @@ -245,17 +250,36 @@ app.sendEmail({

    本模块提供了构建Intent的函数(app.intent()), 启动Activity的函数app.startActivity(), 发送广播的函数app.sendBroadcast()

    使用这些方法可以用来方便的调用其他应用。例如直接打开某个QQ号的个人卡片页,打开某个QQ号的聊天窗口等。

    -
    
    +
    var qq = "2732014414";
    +app.startActivity({ 
    +    action: "android.intent.action.VIEW", 
    +    data:"mqq://im/chat?chat_type=wpa&version=1&src_type=web&uin=" + qq, 
    +    packageName: "com.tencent.mobileqq", 
    +});
     

    app.intent(options)#

      -
    • options <Object> 选项,包括:
        -
      • action <string> 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。常见的action参见常用的意图动作
      • -
      • type <string> 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。
      • -
      • data <string> 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。
      • -
      • category <Array> 意图的类别。比较少用。
      • -
      • packageName <string> 目标包名
      • -
      • className <string> 目标Activity或Service等组件的名称
      • -
      • extras <Object> 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。
      • +
      • options <Object> 选项,包括:

        +
          +
        • action <string> 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。参见Actions

          +
        • +
        • type <string> 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。

          +
        • +
        • data <string> 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。

          +
        • +
        • category <Array> 意图的类别。比较少用。参见Categories

          +
        • +
        • packageName <string> 目标包名

          +
        • +
        • className <string> 目标Activity或Service等组件的名称

          +
        • +
        • extras <Object> 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。参见Extras

          +
        • +
        • flags <Array> intent的标识,字符串数组,例如["activity_new_task", "grant_read_uri_permission"]。参见Flags

          +

          [v4.1.0新增]

          +
        • +
        • root <Boolea> 是否以root权限启动、发送该intent。使用该参数后,不能使用context.startActivity()等方法,而应该直接使用诸如app.startActivity({...})的方法。

          +

          [v4.1.0新增]

          +
      @@ -267,18 +291,74 @@ var i = app.intent({ type: "image/png", data: "file:///sdcard/1.png" }); -app.startActivity(i); -

    更多信息,请百度安卓Intent或参考Android指南: Intent

    +context.startActivity(i); +

    需要注意的是,除非应用专门暴露Activity出来,否则在没有root权限的情况下使用intent是无法跳转到特定Activity、应用的特定界面的。例如我们能通过Intent跳转到QQ的分享界面,是因为QQ对外暴露了分享的Activity;而在没有root权限的情况下,我们无法通过intent跳转到QQ的设置界面,因为QQ并没有暴露这个Activity。

    +

    但如果有root权限,则在intent的参数加上"root": true即可。例如使用root权限跳转到Auto.js的设置界面为:

    +
    app.startActivity({
    +    packageName: "org.autojs.autojs",
    +    className: "org.autojs.autojs.ui.settings.SettingsActivity_",
    +    root: true
    +});
    +

    另外,关于intent的参数如何获取的问题,一些intent是意外发现并且在网络中传播的(例如跳转QQ聊天窗口是因为QQ给网页提供了跳转到客服QQ的方法),如果要自己获取活动的intent的参数,可以通过例如"intent记录","隐式启动"等应用拦截内部intent或者查询暴露的intent。其中拦截内部intent需要XPosed框架,或者可以通过反编译等手段获取参数。总之,没有简单直接的方法。

    +

    更多信息,请百度安卓Intent或参考Android指南: Intent

    app.startActivity(options)#

    根据选项构造一个Intent,并启动该Activity。

    -

    app.sendBroadcast(options)#

    +
    app.startActivity({
    +    action: "SEND",
    +    type: "text/plain",
    +    data: "file:///sdcard/1.txt"
    +});
    +

    app.sendBroadcast(options)#

    根据选项构造一个Intent,并发送该广播。

    +

    app.startService(options)#

    +
    +

    根据选项构造一个Intent,并启动该服务。

    +

    app.sendBroadcast(name)#

    +

    [v4.1.0新增]

    + +

    发送以上特定名称的广播可以触发Auto.js的布局分析,方便脚本调试。这些广播在Auto.js发送才有效,在打包的脚本上运行将没有任何效果。

    +
    app.sendBroadcast("inspect_layout_bounds");
    +

    app.intentToShell(options)#

    +

    [v4.1.0新增]

    + +

    根据选项构造一个Intent,转换为对应的shell的intent命令的参数。

    +

    例如:

    +
    shell("am start " + app.intentToShell({
    +    packageName: "org.autojs.autojs",
    +    className: "org.autojs.autojs.ui.settings.SettingsActivity_"
    +}), true);
    +

    参见intent参数的规范

    +

    app.parseUri(uri)#

    +

    [v4.1.0新增]

    + +

    解析uri字符串并返回相应的Uri对象。即使Uri格式错误,该函数也会返回一个Uri对象,但之后如果访问该对象的scheme, path等值可能因解析失败而返回null

    +

    需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此如果uri字符串是文件file://...,返回的Uri会是诸如content://...的形式。

    +

    app.getUriForFile(path)#

    +

    [v4.1.0新增]

    + +

    从一个文件路径创建一个uri对象。需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此返回的Uri会是诸如content://...的形式。

    diff --git a/app/src/main/assets/docs/assets/fonts.css b/app/src/main/assets/docs/assets/fonts.css new file mode 100644 index 00000000..40e55798 --- /dev/null +++ b/app/src/main/assets/docs/assets/fonts.css @@ -0,0 +1,48 @@ +/* latin-ext */ +@font-face { + font-family: 'Lato'; + font-style: italic; + font-weight: 400; + src: local('Lato Italic'), local('Lato-Italic'), url(fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; + } + /* latin */ + @font-face { + font-family: 'Lato'; + font-style: italic; + font-weight: 400; + src: local('Lato Italic'), local('Lato-Italic'), url(fonts/S6u8w4BMUTPHjxsAXC-q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + /* latin-ext */ + @font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: local('Lato Regular'), local('Lato-Regular'), url(fonts/S6uyw4BMUTPHjxAwXjeu.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; + } + /* latin */ + @font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: local('Lato Regular'), local('Lato-Regular'), url(fonts/S6uyw4BMUTPHjx4wXg.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + /* latin-ext */ + @font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 700; + src: local('Lato Bold'), local('Lato-Bold'), url(fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; + } + /* latin */ + @font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 700; + src: local('Lato Bold'), local('Lato-Bold'), url(fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } \ No newline at end of file diff --git a/app/src/main/assets/docs/assets/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 b/app/src/main/assets/docs/assets/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 new file mode 100644 index 00000000..d88f1af8 Binary files /dev/null and b/app/src/main/assets/docs/assets/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 differ diff --git a/app/src/main/assets/docs/assets/fonts/S6uyw4BMUTPHjx4wXg.woff2 b/app/src/main/assets/docs/assets/fonts/S6uyw4BMUTPHjx4wXg.woff2 new file mode 100644 index 00000000..b14c76ca Binary files /dev/null and b/app/src/main/assets/docs/assets/fonts/S6uyw4BMUTPHjx4wXg.woff2 differ diff --git a/app/src/main/assets/docs/canvas.html b/app/src/main/assets/docs/canvas.html index 46bfd8c1..15d58806 100644 --- a/app/src/main/assets/docs/canvas.html +++ b/app/src/main/assets/docs/canvas.html @@ -2,8 +2,8 @@ - Canvas | Auto.js 3.0.0 文档 - + Canvas | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@
    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | diff --git a/app/src/main/assets/docs/console.html b/app/src/main/assets/docs/console.html index 3a12754c..30ca88cf 100644 --- a/app/src/main/assets/docs/console.html +++ b/app/src/main/assets/docs/console.html @@ -2,8 +2,8 @@ - Console | Auto.js 3.0.0 文档 - + Console | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | @@ -84,10 +84,14 @@

  • console.warn([data][, ...args])
  • console.error([data][, ...args])
  • console.assert(value, message)
  • +
  • console.time([label])
  • +
  • console.timeEnd(label)
  • +
  • console.trace([data][, ...args])
  • console.input(data[, ...args])
  • console.rawInput(data[, ...args])
  • console.setSize(w, h)
  • console.setPosition(x, y)
  • +
  • console.setGlobalLogConfig(config)
  • print(text)
  • @@ -107,8 +111,8 @@ console模块中的一些函数也可以直接作为全局函数使用,例如l

    清空控制台。

    console.log([data][, ...args])#

      -
    • data
    • -
    • ...args
    • +
    • data <any>
    • +
    • ...args <any>

    打印到控制台,并带上换行符。 可以传入多个参数,第一个参数作为主要信息,其他参数作为类似于 printf(3) 中的代替值(参数都会传给 util.format())。

    const count = 5;
    @@ -120,26 +124,26 @@ console.log('count:', count);
     

    该函数也可以作为全局函数使用。

    console.verbose([data][, ...args])#

      -
    • data
    • -
    • ...args
    • +
    • data <any>
    • +
    • ...args <any>

    与console.log类似,但输出结果以灰色字体显示。输出优先级低于log,用于输出观察性质的信息。

    console.info([data][, ...args])#

      -
    • data
    • -
    • ...args
    • +
    • data <any>
    • +
    • ...args <any>

    与console.log类似,但输出结果以绿色字体显示。输出优先级高于log, 用于输出重要信息。

    console.warn([data][, ...args])#

      -
    • data
    • -
    • ...args
    • +
    • data <any>
    • +
    • ...args <any>

    与console.log类似,但输出结果以蓝色字体显示。输出优先级高于info, 用于输出警告信息。

    console.error([data][, ...args])#

      -
    • data
    • -
    • ...args
    • +
    • data <any>
    • +
    • ...args <any>

    与console.log类似,但输出结果以红色字体显示。输出优先级高于warn, 用于输出错误信息。

    console.assert(value, message)#

    @@ -150,10 +154,46 @@ console.log('count:', count);

    断言。如果value为false则输出错误信息message并停止脚本运行。

    var a = 1 + 1;
     console.assert(a == 2, "加法出错啦");
    -

    console.input(data[, ...args])#

    +

    console.time([label])#

    +

    [v4.1.0新增]

    +
      +
    • label <String> 计时器标签,可省略
    • +
    +

    启动一个定时器,用以计算一个操作的持续时间。 +定时器由一个唯一的 label 标识。 +当调用 console.timeEnd() 时,可以使用相同的 label 来停止定时器,并以毫秒为单位将持续时间输出到控制台。 +重复启动同一个标签的定时器会覆盖之前启动同一标签的定时器。

    +

    console.timeEnd(label)#

    +

    [v4.1.0新增]

    + +

    停止之前通过调用 console.time() 启动的定时器,并打印结果到控制台。 +调用 console.timeEnd() 后定时器会被删除。如果不存在标签指定的定时器则会打印 NaNms

    +
    console.time('求和');
    +var sum = 0;
    +for(let i = 0; i < 100000; i++){
    +    sum += i;
    +}
    +console.timeEnd('求和');
    +// 打印 求和: xxx ms
    +
    +

    console.trace([data][, ...args])#

    +

    [v4.1.0新增]

    +
      +
    • data <any>
    • +
    • ...args <any>
    • +
    +

    与console.log类似,同时会打印出调用这个函数所在的调用栈信息(即当前运行的文件、行数等信息)。

    +
    console.trace('Show me');
    +// 打印: (堆栈跟踪会根据被调用的跟踪的位置而变化)
    +// Show me
    +//  at <test>:7
    +
    +

    console.input(data[, ...args])#

      -
    • data
    • -
    • ...args
    • +
    • data <any>
    • +
    • ...args <any>

    与console.log一样输出信息,并在控制台显示输入框等待输入。按控制台的确认按钮后会将输入的字符串用eval计算后返回。

    部分机型可能会有控制台不显示输入框的情况,属于bug。

    @@ -164,8 +204,8 @@ toast(n + 1); //显示124

    console.rawInput(data[, ...args])#

      -
    • data
    • -
    • ...args
    • +
    • data <any>
    • +
    • ...args <any>

    与console.log一样输出信息,并在控制台显示输入框等待输入。按控制台的确认按钮后会将输入的字符串直接返回。

    部分机型可能会有控制台不显示输入框的情况,属于bug。

    @@ -191,7 +231,24 @@ console.setSize(device.width / 2, device.height / 2);

    设置控制台的位置,单位像素。

    console.show();
     console.setPosition(100, 100);
    -

    print(text)#

    +

    console.setGlobalLogConfig(config)#

    +

    [v4.1.0新增]

    +
      +
    • config <Object> 日志配置,可选的项有:
        +
      • file <string> 日志文件路径,将会把日志写入该文件中
      • +
      • maxFileSize <number> 最大文件大小,单位字节,默认为512 * 1024 (512KB)
      • +
      • rootLevel <string> 写入的日志级别,默认为"ALL"(所有日志),可以为"OFF"(关闭), "DEBUG", "INFO", "WARN", "ERROR", "FATAL"等。
      • +
      • maxBackupSize <number> 日志备份文件最大数量,默认为5
      • +
      • filePattern <string> 日志写入格式,参见PatternLayout
      • +
      +
    • +
    +

    设置日志保存的路径和配置。例如把日志保存到"/sdcard/1.txt":

    +
    console.setGlobalLogConfig({
    +    "file": "/sdcard/1.txt"
    +});
    +

    注意该函数会影响所有脚本的日志记录。

    +

    print(text)#

    diff --git a/app/src/main/assets/docs/coordinates-based-automation.html b/app/src/main/assets/docs/coordinates-based-automation.html index 2a3cd81f..4854db8f 100644 --- a/app/src/main/assets/docs/coordinates-based-automation.html +++ b/app/src/main/assets/docs/coordinates-based-automation.html @@ -2,8 +2,8 @@ - 基于坐标的触摸模拟 | Auto.js 3.0.0 文档 - + 基于坐标的触摸模拟 | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@
    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | diff --git a/app/src/main/assets/docs/device.html b/app/src/main/assets/docs/device.html index 39d288ea..865171b4 100644 --- a/app/src/main/assets/docs/device.html +++ b/app/src/main/assets/docs/device.html @@ -2,8 +2,8 @@ - Device | Auto.js 3.0.0 文档 - + Device | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | diff --git a/app/src/main/assets/docs/dialogs.html b/app/src/main/assets/docs/dialogs.html index 29ae1be5..2e8d7a3b 100644 --- a/app/src/main/assets/docs/dialogs.html +++ b/app/src/main/assets/docs/dialogs.html @@ -2,8 +2,8 @@ - Dialogs | Auto.js 3.0.0 文档 - + Dialogs | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | @@ -99,6 +99,9 @@

  • 事件: multi_choice
  • 事件: input
  • 事件: input_change
  • +
  • dialog.getProgress()
  • +
  • dialog.getMaxProgress()
  • +
  • dialog.getActionButton(action)
  • @@ -271,11 +274,11 @@ dialogs.select("请选择一个选项", ["选项A", "
  • itemsColor <string> | <number> 对话框列表的选项的文字颜色
  • itemsSelectMode <string> 对话框列表的选项选择模式,可以为:
    • select 普通选择模式
    • -
    • singleChoice 单选模式
    • -
    • multiChoice 多选模式
    • +
    • single 单选模式
    • +
    • multi 多选模式
  • -
  • itemsSelectedIndex <number> | <Array> 对话框列表中???
  • +
  • itemsSelectedIndex <number> | <Array> 对话框列表中预先选中的项目索引,如果是单选模式为一个索引;多选模式则为数组
  • positive <string> 对话框确定按钮的文字内容(最右边按钮)
  • positiveColor <string> | <number> 对话框确定按钮的文字颜色(最右边按钮)
  • neutral <string> 对话框中立按钮的文字内容(最左边按钮)
  • @@ -317,9 +320,9 @@ dialogs.select("请选择一个选项", ["选项A", "
    dialogs.build({
         title: "单选",
         items: ["选项1", "选项2", "选项3", "选项4"],
    -    itemsSelectMode: "singleChoice",
    +    itemsSelectMode: "single",
         itemsSelectedIndex: 3
    -}).on("item_select", (index, item)->{
    +}).on("single_choice", (index, item)=>{
         toast("您选择的是" + item);
     }).show();
     

    "处理中"对话框:

    @@ -528,7 +531,26 @@ setTimeout(()=>{ }).on("input_change", (text, dialog)=>{ toast("你输入的是" + text); }).show(); - +

    dialog.getProgress()#

    +
    +

    获取当前进度条的进度值,是一个整数

    +

    dialog.getMaxProgress()#

    +
    +

    获取当前进度条的最大进度值,是一个整数

    +

    dialog.getActionButton(action)#

    +
      +
    • action <string> 动作,包括:
        +
      • positive
      • +
      • negative
      • +
      • neutral
      • +
      +
    • +
    +
    diff --git a/app/src/main/assets/docs/documentation.html b/app/src/main/assets/docs/documentation.html index 2d07b665..3e314ef1 100644 --- a/app/src/main/assets/docs/documentation.html +++ b/app/src/main/assets/docs/documentation.html @@ -2,8 +2,8 @@ - 关于本文档 | Auto.js 3.0.0 文档 - + 关于本文档 | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@
    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | diff --git a/app/src/main/assets/docs/engines.html b/app/src/main/assets/docs/engines.html index f58ed3d8..3f941928 100644 --- a/app/src/main/assets/docs/engines.html +++ b/app/src/main/assets/docs/engines.html @@ -2,8 +2,8 @@ - Engines | Auto.js 3.0.0 文档 - + Engines | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | @@ -185,6 +185,10 @@ exec(add, {a: 1, b:2});

    停止所有正在运行的脚本并显示停止的脚本数量。包括当前脚本自身。

    engines.myEngine()#

    返回当前脚本的脚本引擎对象(ScriptEngine)

    +

    [v4.1.0新增] +特别的,该对象可以通过execArgv来获取他的运行参数,包括外部参数、intent等。例如:

    +
    log(engines.myEngine().execArgv);
    +

    普通脚本的运行参数通常为空,通过定时任务的广播启动的则可以获取到启动的intent。

    engines.all()#

    • 返回 <Array>
    • diff --git a/app/src/main/assets/docs/events.html b/app/src/main/assets/docs/events.html index b3f43660..b601d5e0 100644 --- a/app/src/main/assets/docs/events.html +++ b/app/src/main/assets/docs/events.html @@ -2,8 +2,8 @@ - Events | Auto.js 3.0.0 文档 - + Events | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@
      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/files.html b/app/src/main/assets/docs/files.html index a182e972..01ffe297 100644 --- a/app/src/main/assets/docs/files.html +++ b/app/src/main/assets/docs/files.html @@ -2,8 +2,8 @@ - Files | Auto.js 3.0.0 文档 - + Files | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/floaty.html b/app/src/main/assets/docs/floaty.html index c68ae3a6..145e078f 100644 --- a/app/src/main/assets/docs/floaty.html +++ b/app/src/main/assets/docs/floaty.html @@ -2,8 +2,8 @@ - Floaty | Auto.js 3.0.0 文档 - + Floaty | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/globals.html b/app/src/main/assets/docs/globals.html index 0635fe44..1301d20e 100644 --- a/app/src/main/assets/docs/globals.html +++ b/app/src/main/assets/docs/globals.html @@ -2,8 +2,8 @@ - 全局变量与函数 | Auto.js 3.0.0 文档 - + 全局变量与函数 | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

    @@ -232,6 +234,23 @@ runtime.requestPermissions(["access_fine_location"]);

    您可以通过APK编辑器来增加Auto.js以及Auto.js打包的应用的权限。

    安卓所有的权限列表参见Permissions Overview。(并没有用)

    +

    runtime.loadJar(path)#

    +
    +

    加载目标jar文件,加载成功后将可以使用该Jar文件的类。

    +
    // 加载jsoup.jar
    +runtime.loadJar("./jsoup.jar");
    +// 使用jsoup解析html
    +importClass(org.jsoup.Jsoup);
    +log(Jsoup.parse(files.read("./test.html")));
    +

    (jsoup是一个Java实现的解析Html DOM的库,可以在Jsoup下载)

    +

    runtime.loadDex(path)#

    +
    +

    加载目标dex文件,加载成功后将可以使用该dex文件的类。

    +

    因为加载jar实际上是把jar转换为dex再加载的,因此加载dex文件会比jar文件快得多。可以使用Android SDK的build tools的dx工具把jar转换为dex。

    context#

    全局变量。一个android.content.Context对象。

    注意该对象为ApplicationContext,因此不能用于界面、对话框等的创建。

    diff --git a/app/src/main/assets/docs/http.html b/app/src/main/assets/docs/http.html index 1d49d548..d3f85e40 100644 --- a/app/src/main/assets/docs/http.html +++ b/app/src/main/assets/docs/http.html @@ -2,8 +2,8 @@ - HTTP | Auto.js 3.0.0 文档 - + HTTP | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@
    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | diff --git a/app/src/main/assets/docs/images.html b/app/src/main/assets/docs/images.html index 9e009677..7cb1f7c3 100644 --- a/app/src/main/assets/docs/images.html +++ b/app/src/main/assets/docs/images.html @@ -2,8 +2,8 @@ - colors | Auto.js 3.0.0 文档 - + colors | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

    -

    Auto.js 3.0.0 文档

    +

    Auto.js 4.1.0 文档

    索引 | @@ -100,19 +100,35 @@

  • colors.MAGENTA
  • colors.TRANSPARENT
  • Images +
  • +
  • MatchingResult
  • Image
      @@ -246,7 +277,304 @@ log(colors.equals(0xFF112233, 0xFF223344));

      colors.TRANSPARENT#

      透明,颜色值 #00000000

      Images#

      -
      Stability: 2 - Stable

      images模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、找色、找图等。

      +
      Stability: 2 - Stable

      images模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。

      +

      该模块分为两个部分,找图找色部分和图片处理部分。

      +

      需要注意的是,image对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管Auto.js通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。

      +

      Image对象通过调用recycle()函数来回收。例如:

      +
      // 读取图片
      +var img = images.read("./1.png");
      +//对图片进行操作
      +... 
      +// 回收图片
      +img.recycle();
      +

      例外的是,caputerScreen()返回的图片不需要回收。

      +

      图片处理#

      +

      images.read(path)#

      +
      +

      读取在路径path的图片文件并返回一个Image对象。如果文件不存在或者文件无法解码则返回null。

      +

      images.load(url)#

      +
      +

      加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。

      +

      images.copy(img)#

      +
        +
      • img <Image> 图片
      • +
      • 返回 <Image>
      • +
      +

      复制一张图片并返回新的副本。该函数会完全复制img对象的数据。

      +

      images.save(image, path[, format = "png", quality = 100])#

      +
        +
      • image <Image> 图片
      • +
      • path <string> 路径
      • +
      • format <string> 图片格式,可选的值为:
          +
        • png
        • +
        • jpeg/jpg
        • +
        • webp
        • +
        +
      • +
      • quality <number> 图片质量,为0~100的整数值
      • +
      +

      把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。

      +
      //把图片压缩为原来的一半质量并保存
      +var img = images.read("/sdcard/1.png");
      +images.save(img, "/sdcard/1.jpg", "jpg", 50);
      +app.viewFile("/sdcard/1.jpg");
      +

      images.fromBase64(base64)#

      +
        +
      • base64 <string> 图片的Base64数据
      • +
      • 返回 <Image>
      • +
      +

      解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null

      +

      images.toBase64(img[, format = "png", quality = 100])#

      +
        +
      • image <image> 图片
      • +
      • format <string> 图片格式,可选的值为:
          +
        • png
        • +
        • jpeg/jpg
        • +
        • webp
        • +
        +
      • +
      • quality <number> 图片质量,为0~100的整数值
      • +
      • 返回 <string>
      • +
      +

      把图片编码为base64数据并返回。

      +

      images.fromBytes(bytes)#

      +
        +
      • bytes <byte[]> 字节数组
      • +
      +

      解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null

      +

      images.toBytes(img[, format = "png", quality = 100])#

      +
        +
      • image <image> 图片
      • +
      • format <string> 图片格式,可选的值为:
          +
        • png
        • +
        • jpeg/jpg
        • +
        • webp
        • +
        +
      • +
      • quality <number> 图片质量,为0~100的整数值
      • +
      • 返回 <byte[]>
      • +
      +

      把图片编码为字节数组并返回。

      +

      images.clip(img, x, y, w, h)#

      +
        +
      • img <Image> 图片
      • +
      • x <number> 剪切区域的左上角横坐标
      • +
      • y <number> 剪切区域的左上角纵坐标
      • +
      • w <number> 剪切区域的宽度
      • +
      • h <number> 剪切区域的高度
      • +
      • 返回 <Image>
      • +
      +

      从图片img的位置(x, y)处剪切大小为w * h的区域,并返回该剪切区域的新图片。

      +
      var src = images.read("/sdcard/1.png");
      +var clip = images.clip(src, 100, 100, 400, 400);
      +images.save(clip, "/sdcard/clip.png");
      +

      images.resize(img, size[, interpolation])#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • size <Array> 两个元素的数组[w, h],分别表示宽度和高度;如果只有一个元素,则宽度和高度相等
      • +
      • interpolation <string> 插值方法,可选,默认为"LINEAR"(线性插值),可选的值有:

        +
          +
        • NEAREST 最近邻插值
        • +
        • LINEAR 线性插值(默认)
        • +
        • AREA 区域插值
        • +
        • CUBIC 三次样条插值
        • +
        • LANCZOS4 Lanczos插值 +参见InterpolationFlags
        • +
        +
      • +
      • 返回 <Image>

        +
      • +
      +

      调整图片大小,并返回调整后的图片。例如把图片放缩为200*300:images.resize(img, [200, 300])

      +

      参见Imgproc.resize

      +

      images.scale(img, fx, fy[, interpolation])#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • fx <number> 宽度放缩倍数
      • +
      • fy <number> 高度放缩倍数
      • +
      • interpolation <string> 插值方法,可选,默认为"LINEAR"(线性插值),可选的值有:

        +
          +
        • NEAREST 最近邻插值
        • +
        • LINEAR 线性插值(默认)
        • +
        • AREA 区域插值
        • +
        • CUBIC 三次样条插值
        • +
        • LANCZOS4 Lanczos插值 +参见InterpolationFlags
        • +
        +
      • +
      • 返回 <Image>

        +
      • +
      +

      放缩图片,并返回放缩后的图片。例如把图片变成原来的一半:images.scale(img, 0.5, 0.5)

      +

      参见Imgproc.resize

      +

      images.rotate(img, degress[, x, y])#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • degress <number> 旋转角度。
      • +
      • x <number> 旋转中心x坐标,默认为图片中点
      • +
      • y <number> 旋转中心y坐标,默认为图片中点
      • +
      • 返回 <Image>
      • +
      +

      将图片逆时针旋转degress度,返回旋转后的图片对象。

      +

      例如逆时针旋转90度为images.rotate(img, 90)

      +

      images.concat(img1, image2[, direction])#

      +

      [v4.1.0新增]

      +
        +
      • img1 <Image> 图片1
      • +
      • img2 <Image> 图片2
      • +
      • direction <string> 连接方向,默认为"RIGHT",可选的值有:
          +
        • LEFT 将图片2接到图片1左边
        • +
        • RIGHT 将图片2接到图片1右边
        • +
        • TOP 将图片2接到图片1上边
        • +
        • BOTTOM 将图片2接到图片1下边
        • +
        +
      • +
      • 返回 <Image>
      • +
      +

      连接两张图片,并返回连接后的图像。如果两张图片大小不一致,小的那张将适当居中。

      +

      images.grayscale(img)#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • 返回 <Image>
      • +
      +

      灰度化图片,并返回灰度化后的图片。

      +

      image.threshold(img, threshold, maxVal[, type])#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • threshold <number> 阈值
      • +
      • maxVal <number> 最大值
      • +
      • type <string> 阈值化类型,默认为"BINARY",参见ThresholdTypes, 可选的值:

        +
          +
        • BINARY
        • +
        • BINARY_INV
        • +
        • TRUNC
        • +
        • TOZERO
        • +
        • TOZERO_INV
        • +
        • OTSU
        • +
        • TRIANGLE
        • +
        +
      • +
      • 返回 <Image>

        +
      • +
      +

      将图片阈值化,并返回处理后的图像。可以用这个函数进行图片二值化。例如:images.threshold(img, 100, 255, "BINARY"),这个代码将图片中大于100的值全部变成255,其余变成0,从而达到二值化的效果。如果img是一张灰度化图片,这个代码将会得到一张黑白图片。

      +

      可以参考有关博客(比如threshold函数的使用)或者OpenCV文档threshold

      +

      images.adaptiveThreshold(img, maxValue, adaptiveMethod, thresholdType, blockSize, C)#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • maxValue <number> 最大值
      • +
      • adaptiveMethod <string> 在一个邻域内计算阈值所采用的算法,可选的值有:
          +
        • MEAN_C 计算出领域的平均值再减去参数C的值
        • +
        • GAUSSIAN_C 计算出领域的高斯均值再减去参数C的值
        • +
        +
      • +
      • thresholdType <string> 阈值化类型,可选的值有:
          +
        • BINARY
        • +
        • BINARY_INV
        • +
        +
      • +
      • blockSize <number> 邻域块大小
      • +
      • C <number> 偏移值调整量
      • +
      • 返回 <Image>
      • +
      +

      对图片进行自适应阈值化处理,并返回处理后的图像。

      +

      可以参考有关博客(比如threshold与adaptiveThreshold)或者OpenCV文档adaptiveThreshold

      +

      images.cvtColor(img, code[, dstCn])#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • code <string> 颜色空间转换的类型,可选的值有一共有205个(参见ColorConversionCodes),这里只列出几个:
          +
        • BGR2GRAY BGR转换为灰度
        • +
        • BGR2HSV BGR转换为HSV
        • +
        • ``
        • +
        +
      • +
      • dstCn <number> 目标图像的颜色通道数量,如果不填写则根据其他参数自动决定。
      • +
      • 返回 <Image>
      • +
      +

      对图像进行颜色空间转换,并返回转换后的图像。

      +

      可以参考有关博客(比如颜色空间转换)或者OpenCV文档cvtColor

      +

      images.inRange(img, lowerBound, upperBound)#

      +

      [v4.1.0新增]

      + +

      将图片二值化,在lowerBound~upperBound范围以外的颜色都变成0,在范围以内的颜色都变成255。

      +

      例如images.inRange(img, "#000000", "#222222")

      +

      images.interval(img, color, interval)#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • color <string> | <number> 颜色值
      • +
      • interval <number> 每个通道的范围间隔
      • +
      • 返回 <Image>
      • +
      +

      将图片二值化,在color-interval ~ color+interval范围以外的颜色都变成0,在范围以内的颜色都变成255。这里对color的加减是对每个通道而言的。

      +

      例如images.interval(img, "#888888", 16),每个通道的颜色值均为0x88,加减16后的范围是[0x78, 0x98],因此这个代码将把#787878~#989898的颜色变成#FFFFFF,而把这个范围以外的变成#000000。

      +

      images.blur(img, size[, anchor, type])#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • size <Array> 定义滤波器的大小,如[3, 3]
      • +
      • anchor <Array> 指定锚点位置(被平滑点),默认为图像中心
      • +
      • type <string> 推断边缘像素类型,默认为"DEFAULT",可选的值有:
          +
        • CONSTANT iiiiii|abcdefgh|iiiiiii with some specified i
        • +
        • REPLICATE aaaaaa|abcdefgh|hhhhhhh
        • +
        • REFLECT fedcba|abcdefgh|hgfedcb
        • +
        • WRAP cdefgh|abcdefgh|abcdefg
        • +
        • REFLECT_101 gfedcb|abcdefgh|gfedcba
        • +
        • TRANSPARENT uvwxyz|abcdefgh|ijklmno
        • +
        • REFLECT101 same as BORDER_REFLECT_101
        • +
        • DEFAULT same as BORDER_REFLECT_101
        • +
        • ISOLATED do not look outside of ROI
        • +
        +
      • +
      • 返回 <Image>
      • +
      +

      对图像进行模糊(平滑处理),返回处理后的图像。

      +

      可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档blur

      +

      images.medianBlur(img, size)#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • size <Array> 定义滤波器的大小,如[3, 3]
      • +
      • 返回 <Image>
      • +
      +

      对图像进行中值滤波,返回处理后的图像。

      +

      可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档blur

      +

      images.gaussianBlur(img, size[, sigmaX, sigmaY, type])#

      +

      [v4.1.0新增]

      +
        +
      • img <Image> 图片
      • +
      • size <Array> 定义滤波器的大小,如[3, 3]
      • +
      • sigmaX <number> x方向的标准方差,不填写则自动计算
      • +
      • sigmaY <number> y方向的标准方差,不填写则自动计算
      • +
      • type <string> 推断边缘像素类型,默认为"DEFAULT",参见images.blur
      • +
      • 返回 <Image>
      • +
      +

      对图像进行高斯模糊,返回处理后的图像。

      +

      可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档GaussianBlur

      +

      images.matToImage(mat)#

      +

      [v4.1.0新增]

      +
        +
      • mat <Mat> OpenCV的Mat对象
      • +
      • 返回 <Image>
      • +
      +

      把Mat对象转换为Image对象。

      +

      找图找色#

      images.requestScreenCapture([landscape])#

      • landscape <boolean> 布尔值, 表示将要执行的截屏是否为横屏。如果landscape为false, 则表示竖屏截图; true为横屏截图。
      • @@ -300,90 +628,7 @@ toast(colors.toString(color));

      返回图片image在点(x, y)处的像素的ARGB值。

      该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。

      坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。

      -

      images.copy(img)#

      -
        -
      • img <Image> 图片
      • -
      • 返回 <Image>
      • -
      -

      复制一张图片并返回新的副本。该函数会完全复制img对象的数据。

      -

      images.save(image, path[, format = "png", quality = 100])#

      -
        -
      • image <Image> 图片
      • -
      • path <string> 路径
      • -
      • format <string> 图片格式,可选的值为:
          -
        • png
        • -
        • jpeg/jpg
        • -
        • webp
        • -
        -
      • -
      • quality <number> 图片质量,为0~100的整数值
      • -
      -

      把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。

      -
      //把图片压缩为原来的一半质量并保存
      -var img = images.read("/sdcard/1.png");
      -images.save(img, "/sdcard/1.jpg", "jpg", 50);
      -app.viewFile("/sdcard/1.jpg");
      -

      images.read(path)#

      -
      -

      读取在路径path的图片文件并返回一个Image对象。如果文件不存在或者文件无法解码则返回null。

      -

      images.load(url)#

      -
      -

      加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。

      -

      images.fromBase64(base64)#

      -
        -
      • base64 <string> 图片的Base64数据
      • -
      • 返回 <Image>
      • -
      -

      解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null

      -

      images.toBase64(img[, format = "png", quality = 100])#

      -
        -
      • image <image> 图片
      • -
      • format <string> 图片格式,可选的值为:
          -
        • png
        • -
        • jpeg/jpg
        • -
        • webp
        • -
        -
      • -
      • quality <number> 图片质量,为0~100的整数值
      • -
      • 返回 <string>
      • -
      -

      把图片编码为base64数据并返回。

      -

      images.fromBytes(bytes)#

      -
        -
      • bytes <byte[]> 字节数组
      • -
      -

      解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null

      -

      images.toBytes(img[, format = "png", quality = 100])#

      -
        -
      • image <image> 图片
      • -
      • format <string> 图片格式,可选的值为:
          -
        • png
        • -
        • jpeg/jpg
        • -
        • webp
        • -
        -
      • -
      • quality <number> 图片质量,为0~100的整数值
      • -
      • 返回 <byte[]>
      • -
      -

      把图片编码为字节数组并返回。

      -

      images.clip(img, x, y, w, h)#

      -
        -
      • img <Image> 图片
      • -
      • x <number> 剪切区域的左上角横坐标
      • -
      • y <number> 剪切区域的左上角纵坐标
      • -
      • w <number> 剪切区域的宽度
      • -
      • h <number> 剪切区域的高度
      • -
      • 返回 <Image>
      • -
      -

      从图片img的位置(x, y)处剪切大小为w * h的区域,并返回该剪切区域的新图片。

      -
      var src = images.read("/sdcard/1.png");
      -var clip = images.clip(src, 100, 100, 400, 400);
      -images.save(clip, "/sdcard/clip.png");
      -

      images.findColor(image, color, options)#

      +

      images.findColor(image, color, options)#

      • image <Image> 图片
      • color <number> | <string> 要寻找的颜色的RGB值。如果是一个整数,则以0xRRGGBB的形式代表RGB值(A通道会被忽略);如果是字符串,则以"#RRGGBB"代表其RGB值。
      • @@ -561,7 +806,94 @@ if(p){ threshold: threshold })

        该函数也可以作为全局函数使用。

        -

        Image#

        +

        images.matchTemplate(img, template, options)#

        +

        [v4.1.0新增]

        +
          +
        • img <Image> 大图片
        • +
        • template <Image> 小图片(模板)
        • +
        • options <Object> 找图选项:
            +
          • threshold <number> 图片相似度。取值范围为0~1的浮点数。默认值为0.9。
          • +
          • region <Array> 找图区域。参见findColor函数关于region的说明。
          • +
          • max <number> 找图结果最大数量,默认为5
          • +
          • level <number> 一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次, level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。
          • +
          +
        • +
        • 返回 <MatchingResult>
        • +
        +

        在大图片中搜索小图片,并返回搜索结果MatchingResult。该函数可以用于找图时找出多个位置,可以通过max参数控制最大的结果数量。也可以对匹配结果进行排序、求最值等操作。

        +

        MatchingResult#

        +

        [v4.1.0新增]

        +

        matches#

        +
          +
        • <Array> 匹配结果的数组。
        • +
        +

        数组的元素是一个Match对象:

        +
          +
        • point <Point> 匹配位置
        • +
        • similarity <number> 相似度
        • +
        +

        例如:

        +
        var result = images.matchTemplate(img, template, {
        +    max: 100
        +});
        +result.matches.forEach(match => {
        +    log("point = " + match.point + ", similarity = " + match.similarity);
        +});
        +

        points#

        +
          +
        • <Array> 匹配位置的数组。
        • +
        +

        first()#

        +
          +
        • 返回 <Match>
        • +
        +

        第一个匹配结果。如果没有任何匹配,则返回null

        +

        last()#

        +
          +
        • 返回 <Match>
        • +
        +

        最后一个匹配结果。如果没有任何匹配,则返回null

        +

        leftmost()#

        +
          +
        • 返回 <Match>
        • +
        +

        位于大图片最左边的匹配结果。如果没有任何匹配,则返回null

        +

        topmost()#

        +
          +
        • 返回 <Match>
        • +
        +

        位于大图片最上边的匹配结果。如果没有任何匹配,则返回null

        +

        rightmost()#

        +
          +
        • 返回 <Match>
        • +
        +

        位于大图片最右边的匹配结果。如果没有任何匹配,则返回null

        +

        bottommost()#

        +
          +
        • 返回 <Match>
        • +
        +

        位于大图片最下边的匹配结果。如果没有任何匹配,则返回null

        +

        best()#

        +
          +
        • 返回 <Match>
        • +
        +

        相似度最高的匹配结果。如果没有任何匹配,则返回null

        +

        worst()#

        +
          +
        • 返回 <Match>
        • +
        +

        相似度最低的匹配结果。如果没有任何匹配,则返回null

        +

        sortBy(cmp)#

        +
          +
        • cmp <Function>|<string> 比较函数,或者是一个字符串表示排序方向。例如"left"表示将匹配结果按匹配位置从左往右排序、"top"表示将匹配结果按匹配位置从上往下排序,"left-top"表示将匹配结果按匹配位置从左往右、从上往下排序。方向包括left(左), top (上), right (右), bottom(下)。
        • +
        • <MatchingResult>
        • +
        +

        对匹配结果进行排序,并返回排序后的结果。

        +
        var result = images.matchTemplate(img, template, {
        +    max: 100
        +});
        +log(result.sortBy("top-right"));
        +

        Image#

        表示一张图片,可以是截图的图片,或者本地读取的图片,或者从网络获取的图片。

        Image.getWidth()#

        返回以像素为单位图片宽度。

        @@ -580,6 +912,7 @@ if(p){

      返回图片image在点(x, y)处的像素的ARGB值。

      该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。

      坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。

      +

      ##

      Point#

      findColor, findImage返回的对象。表示一个点(坐标)。

      Point.x#

      diff --git a/app/src/main/assets/docs/index.html b/app/src/main/assets/docs/index.html index eb58ec90..770dccde 100644 --- a/app/src/main/assets/docs/index.html +++ b/app/src/main/assets/docs/index.html @@ -2,8 +2,8 @@ - Index | Auto.js 3.0.0 文档 - + Index | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@
      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/keys.html b/app/src/main/assets/docs/keys.html index 5bf46617..521833d9 100644 --- a/app/src/main/assets/docs/keys.html +++ b/app/src/main/assets/docs/keys.html @@ -2,8 +2,8 @@ - Keys | Auto.js 3.0.0 文档 - + Keys | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/media.html b/app/src/main/assets/docs/media.html index 68c9a799..ec975664 100644 --- a/app/src/main/assets/docs/media.html +++ b/app/src/main/assets/docs/media.html @@ -2,8 +2,8 @@ - Media | Auto.js 3.0.0 文档 - + Media | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/modules.html b/app/src/main/assets/docs/modules.html index 06c95226..823b5edb 100644 --- a/app/src/main/assets/docs/modules.html +++ b/app/src/main/assets/docs/modules.html @@ -2,8 +2,8 @@ - module (模块) | Auto.js 3.0.0 文档 - + module (模块) | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | @@ -83,7 +83,7 @@

      module (模块)#

      Stability: 2 - Stable

      Auto.js 有一个简单的模块加载系统。 在 Auto.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块)。

      例子,假设有一个名为 foo.js 的文件:

      -
      const circle = require('circle.js');
      +
      var circle = require('circle.js');
       console.log("半径为 4 的圆的面积是 %d", circle.area(4));
       

      在第一行中,foo.js 加载了同一目录下的 circle.js 模块。

      circle.js 文件的内容为:

      @@ -91,7 +91,9 @@ console.log("半径为 4 的圆的面积是 %d", circle.area(4)); var circle = {}; -circle.area = (r) => PI * r ** 2; +circle.area = function (r) { + return PI * r * r; +}; circle.circumference = (r) => 2 * PI * r; diff --git a/app/src/main/assets/docs/overview.html b/app/src/main/assets/docs/overview.html index d69dd815..62da9798 100644 --- a/app/src/main/assets/docs/overview.html +++ b/app/src/main/assets/docs/overview.html @@ -2,8 +2,8 @@ - 综述 | Auto.js 3.0.0 文档 - + 综述 | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@
      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/qa.html b/app/src/main/assets/docs/qa.html index 2aaf28af..bc39a66e 100644 --- a/app/src/main/assets/docs/qa.html +++ b/app/src/main/assets/docs/qa.html @@ -2,8 +2,8 @@ - Q & A | Auto.js 3.0.0 文档 - + Q & A | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | @@ -76,8 +76,9 @@

      • Q & A
      • @@ -89,35 +90,30 @@

        Q & A#

        如何定时运行脚本#

        点击脚本右边的菜单按钮->更多->定时任务即可定时运行脚本,但是必须保持Auto.js后台运行(自启动白名单、电源管理白名单等)。同时,可以在脚本的开头使用device.wakeUp()来唤醒屏幕;但是,Auto.js没有解锁屏幕的功能,因此难以在有锁屏密码的设备上达到效果。

        -

        如何把图片和脚本一起打包,或者打包多个脚本#

        -

        如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目打包功能。

        -
          -
        1. 新建一个文件夹,命名为项目名称。
        2. -
        3. 在该文件夹下新建脚本,或者移动脚本到该文件夹,命名为main.js,表示主脚本。脚本打包后将会从该脚本开始运行。
        4. -
        5. 把其他资源或脚本放在该文件夹,并通过相对路径引用。
        6. -
        7. 通过文件夹菜单的"打包"功能来打包该项目
        8. -
        +

        定时任何如何获取外部参数#

        +

        如果一个脚本是用intent"启动"的,比如定时任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent获取启动的intent,从而获取外部参数。

        +

        如何把图片和脚本一起打包,或者打包多个脚本#

        +

        如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。

        +

        点击Auto.js的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的apk打包图标即可打包一个项目,点击工具栏可以重新配置项目。

        例如,主脚本要读取同一文件夹下的图片1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录1.png图片;ui中的图片控件要引用同一文件夹的2.png图片则为<img src="file://2.png"/>。Auto.js内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。

        -

        目前Auto.js还不支持项目的图形化管理,后续会加入。

        -

        如何使打包的应用不显示主界面#

        -

        需要使用项目打包功能。

        -
          -
        1. 新建一个文件夹,命名为项目名称。
        2. -
        3. 在该文件夹下新建脚本,或者移动脚本到该文件夹,命名为main.js,表示主脚本。脚本打包后将会从该脚本开始运行。
        4. -
        5. 在该文件夹下新建一个project.json的文件,其内容如下:
          {
          -"name": "项目名称",
          -"versionName": "1.0.0",
          -"versionCode": 1,
          -"packageName": "org.autojs.example",
          -"main": "main.js",
          -"launchConfig": {
          -   "hideLogs": true
          +

          如何使打包的应用不显示主界面#

          +

          需要使用项目功能。新建项目后,修改项目下的project.json文件,增加以下条目:

          +
          "launchConfig": {
          +    "hideLogs": true
           }
          +

          例如:

          +
          {
          +  "name": "项目名称",
          +  "versionName": "1.0.0",
          +  "versionCode": 1,
          +  "packageName": "org.autojs.example",
          +  "main": "main.js",
          +  "launchConfig": {
          +      "hideLogs": true
          +  }
           }
          -
          其中,项目名称改为自己的项目名称,"org.autojs.example"改成自己的包名,下面的"launchConfig"表示启动配置,"hideLogs"表示隐藏日志。
        6. -
        7. 通过文件夹菜单的"打包"功能来打包该项目
        8. -
        -

        有关项目打包和配置的更多信息,参见项目与项目配置(待补)。

        +

      "launchConfig"表示启动配置,"hideLogs"表示隐藏日志。

      +

      参见项目与项目配置。

      Auto.js自带的模块和函数中没有的功能如何实现#

      由于Auto.js支持直接调用Android的API,对于Auto.js没有内置的函数,可以直接通过修改Android代码为JavaScript代码实现。例如旋转图片的Android代码为:

      import android.graphics.Bitmap;
      diff --git a/app/src/main/assets/docs/sensors.html b/app/src/main/assets/docs/sensors.html
      index f4c768df..92acf063 100644
      --- a/app/src/main/assets/docs/sensors.html
      +++ b/app/src/main/assets/docs/sensors.html
      @@ -2,8 +2,8 @@
       
       
         
      -  Sensors | Auto.js 3.0.0 文档
      -  
      +  Sensors | Auto.js 4.1.0 文档
      +  
         
         
         
      @@ -61,7 +61,7 @@
       
           
      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/shell.html b/app/src/main/assets/docs/shell.html index 3457d550..92521f32 100644 --- a/app/src/main/assets/docs/shell.html +++ b/app/src/main/assets/docs/shell.html @@ -2,8 +2,8 @@ - shell函数 | Auto.js 3.0.0 文档 - + shell函数 | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/storages.html b/app/src/main/assets/docs/storages.html index 382c36d2..e9cb9b39 100644 --- a/app/src/main/assets/docs/storages.html +++ b/app/src/main/assets/docs/storages.html @@ -2,8 +2,8 @@ - Storages | Auto.js 3.0.0 文档 - + Storages | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/threads.html b/app/src/main/assets/docs/threads.html index d36ade17..08dc2bfe 100644 --- a/app/src/main/assets/docs/threads.html +++ b/app/src/main/assets/docs/threads.html @@ -2,8 +2,8 @@ - Threads | Auto.js 3.0.0 文档 - + Threads | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/timers.html b/app/src/main/assets/docs/timers.html index 264743d5..e7b58674 100644 --- a/app/src/main/assets/docs/timers.html +++ b/app/src/main/assets/docs/timers.html @@ -2,8 +2,8 @@ - Timers | Auto.js 3.0.0 文档 - + Timers | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/ui.html b/app/src/main/assets/docs/ui.html index 3e830c80..784a9458 100644 --- a/app/src/main/assets/docs/ui.html +++ b/app/src/main/assets/docs/ui.html @@ -2,8 +2,8 @@ - 用户界面: UI | Auto.js 3.0.0 文档 - + 用户界面: UI | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | @@ -191,11 +191,12 @@

      用户界面: UI#

      ui模块提供了编写用户界面的支持。

      -

      带有ui的脚本的第一行必须使用"ui"指定ui模式,否则脚本将不会以ui模式运行。正确示范:

      +

      带有ui的脚本的的最前面必须使用"ui";指定ui模式,否则脚本将不会以ui模式运行。正确示范:

      "ui";
       
       //脚本的其他代码
      -

      界面是由视图(View)组成的。View分成两种,控件(Widget)和布局(Layout)。控件(Widget)用来具体显示文字、图片、网页等,比如文本控件(text)用来显示文字,按钮控件(button)则可以显示一个按钮并提供点击效果,图片控件(img)则用来显示来自网络或者文件的图片,除此之外还有输入框控件(input)、进度条控件(progressbar)、单选复选框控件(checkbox)等;布局(Layout)则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置,比如垂直布局(vertical)会把他里面的控件从上往下依次显示(即纵向排列),水平布局(horizontal)则会把他里面的控件从左往右依次显示(即横向排列),以及帧布局(frame),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。

      +

      字符串"ui"的前面可以有注释、空行和空格[v4.1.0新增],但是不能有其他代码。

      +

      界面是由视图(View)组成的。View分成两种,控件(Widget)和布局(Layout)。控件(Widget)用来具体显示文字、图片、网页等,比如文本控件(text)用来显示文字,按钮控件(button)则可以显示一个按钮并提供点击效果,图片控件(img)则用来显示来自网络或者文件的图片,除此之外还有输入框控件(input)、进度条控件(progressbar)、单选复选框控件(checkbox)等;布局(Layout)则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置,比如垂直布局(vertical)会把他里面的控件从上往下依次显示(即纵向排列),水平布局(horizontal)则会把他里面的控件从左往右依次显示(即横向排列),以及帧布局(frame),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。

      我们使用xml来编写界面,并通过ui.layout()函数指定界面的布局xml。举个例子:

      "ui";
       ui.layout(
      diff --git a/app/src/main/assets/docs/util.html b/app/src/main/assets/docs/util.html
      index 95a7ab29..b759edac 100644
      --- a/app/src/main/assets/docs/util.html
      +++ b/app/src/main/assets/docs/util.html
      @@ -2,8 +2,8 @@
       
       
         
      -  Util | Auto.js 3.0.0 文档
      -  
      +  Util | Auto.js 4.1.0 文档
      +  
         
         
         
      @@ -61,7 +61,7 @@
       
           
      -

      Auto.js 3.0.0 文档

      +

      Auto.js 4.1.0 文档

      索引 | diff --git a/app/src/main/assets/docs/widgets-based-automation.html b/app/src/main/assets/docs/widgets-based-automation.html index d0dc5fec..857f7dfd 100644 --- a/app/src/main/assets/docs/widgets-based-automation.html +++ b/app/src/main/assets/docs/widgets-based-automation.html @@ -2,8 +2,8 @@ - 基于控件的操作 | Auto.js 3.0.0 文档 - + 基于控件的操作 | Auto.js 4.1.0 文档 + @@ -61,7 +61,7 @@

  • SimpleActionAutomator
      @@ -92,6 +99,7 @@
    • UiSelector
      • selector()
      • +
      • UiSelector.algorithm(algorithm)
      • UiSelector.text(str)
      • UiSelector.textContains(str)
      • UiSelector.textStartsWith(prefix)
      • @@ -222,6 +230,7 @@
        auto();
         

        auto.waitFor()#

        检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。

        +

        因为该函数是阻塞的,因此除非是有协程特性,否则不能在ui模式下运行该函数,建议在ui模式下使用auto()函数。

        auto.setMode(mode)#

        • mode <string> 模式
        • @@ -231,6 +240,72 @@
        • fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
        • normal 正常模式,默认。
        +

        auto.setFlags(flags)#

        +

        [v4.1.0新增]

        +
          +
        • flags <string> | <Array> 一些标志,来启用和禁用某些特性,包括:
            +
          • findOnUiThread 使用该特性后,选择器搜索时会在主进程进行。该特性用于解决线程安全问题导致的次生问题,不过目前貌似已知问题并不是线程安全问题。
          • +
          • useUsageStats 使用该特性后,将会以"使用情况统计"服务的结果来检测当前正在运行的应用包名(需要授予"查看使用情况统计"权限)。如果觉得currentPackage()返回的结果不太准确,可以尝试该特性。
          • +
          • useShell 使用该特性后,将使用shell命令获取当前正在运行的应用的包名、活动名称,但是需要root权限。
          • +
          +
        • +
        +

        启用有关automator的一些特性。例如:

        +
        auto.setFlags(["findOnUiThread", "useShell"]);
        +

        auto.serivce#

        +

        [v4.1.0新增]

        + +

        获取无障碍服务。如果无障碍服务没有启动,则返回null

        +

        参见AccessibilityService

        +

        auto.windows#

        +

        [v4.1.0新增]

        + +

        当前所有窗口(AccessibilityWindowInfo)的数组,可能包括状态栏、输入法、当前应用窗口,弹出窗口、悬浮窗、分屏应用窗口等。可以分别获取每个窗口的布局信息。

        +

        该函数需要Android 5.0以上才能运行。

        +

        auto.root#

        +

        [v4.1.0新增]

        +
          +
        • <UiObject>
        • +
        +

        当前窗口的布局根元素。如果无障碍服务未启动或者WindowFilter均返回false,则会返回null

        +

        如果不设置windowFilter,则当前窗口即为活跃的窗口(获取到焦点、正在触摸的窗口);如果设置了windowFilter,则获取的是过滤的窗口中的第一个窗口。

        +

        如果系统是Android5.0以下,则始终返回当前活跃的窗口的布局根元素。

        +

        auto.rootInActiveWindow#

        +

        [v4.1.0新增]

        +
          +
        • <UiObject>
        • +
        +

        当前活跃的窗口(获取到焦点、正在触摸的窗口)的布局根元素。如果无障碍服务未启动则为null

        +

        auto.setWindowFilter(filter)#

        +

        [v4.1.0新增]

        + +

        设置窗口过滤器。这个过滤器可以决定哪些窗口是目标窗口,并影响选择器的搜索。例如,如果想要选择器在所有窗口(包括状态栏、输入法等)中搜索,只需要使用以下代码:

        +
        auto.setWindowFilter(function(window){
        +    //不管是如何窗口,都返回true,表示在该窗口中搜索
        +    return true;
        +});
        +

        又例如,当前使用了分屏功能,屏幕上有Auto.js和QQ两个应用,但我们只想选择器对QQ界面进行搜索,则:

        +
        auto.setWindowFilter(function(window){
        +    // 对于应用窗口,他的title属性就是应用的名称,因此可以通过title属性来判断一个应用
        +    return window.title == "QQ";
        +});
        +

        选择器默认是在当前活跃的窗口中搜索,不会搜索诸如悬浮窗、状态栏之类的,使用WindowFilter则可以控制搜索的窗口。

        +

        需要注意的是, 如果WindowFilter返回的结果均为false,则选择器的搜索结果将为空。

        +

        另外setWindowFilter函数也会影响auto.windowRoots的结果。

        +

        该函数需要Android 5.0以上才有效。

        +

        auto.windowRoots#

        +

        [v4.1.0新增]

        + +

        返回当前被WindowFilter过滤的窗口的布局根元素组成的数组。

        +

        如果系统是Android5.0以下,则始终返回当前活跃的窗口的布局根元素的数组。

        SimpleActionAutomator#

        Stability: 2 - Stable

        SimpleActionAutomator提供了一些模拟简单操作的函数,例如点击文字、模拟按键等。这些函数可以直接作为全局函数使用。

        click(text[, i])#

        @@ -363,6 +438,18 @@ sendButton.click();

        创建一个新的选择器。但一般情况不需要使用该函数,因为可以直接用相应条件的语句创建选择器。

        由于历史遗留原因,本不应该这样设计(不应该让id(), text()等作为全局函数,而是应该用By.id(), By.text()),但为了后向兼容性只能保留这个设计。

        这样的API设计会污染全局变量,后续可能会支持"去掉这些全局函数而使用By.*"的选项。

        +

        UiSelector.algorithm(algorithm)#

        +

        [v4.1.0新增]

        +
          +
        • algorithm <string> 搜索算法,可选的值有:
            +
          • DFS 深度优先算法,选择器的默认算法
          • +
          • BFS 广度优先算法
          • +
          +
        • +
        +

        指定选择器的搜索算法。例如:

        +
        log(selector().text("文本").algorithm("BFS").find());
        +

        广度优先在控件所在层次较低时,或者布局的层次不多时,通常能更快找到控件。

        UiSelector.text(str)#