编写Uniapp扩展 引入 AutoJS [script,无障碍服务]到Uniapp

1.  UniApp 扩展是什么?

UniApp 提供了扩展原生能力的方式,通过创建一个原生插件(Native Plugin),可以在原生平台(Android 和 iOS)上实现自定义的功能。对于 Android 平台,需要通过 Java 编写扩展代码并通过 JNI 与 UniApp 通信。

2. 创建 UniApp 扩展插件

        2.1 下载 UniApp 插件开发模板
        2.2 设置 Android 开发环境 【自行配置】

3. 打包 Auto.js 为库模块

整合 Auto.js 源码到扩展中
  1. 确定必要模块

    • JS 引擎:Auto.js 使用 V8 引擎或 Rhino 引擎运行脚本。
    • 无障碍服务:支持自动化操作的核心功能。
    • 悬浮窗功能:显示运行状态或脚本交互界面。
    • 脚本管理模块:提供脚本启动、停止等功能。
  2. 将 Auto.js 源码导入到 Android 项目中

    • 创建一个新的 Android Library 模块(library 类型)。
    • 将 Auto.js 源码的关键文件复制到 src/main/java 文件夹下。例如:/src/main/java/com/autojs/core /src/main/java/com/autojs/accessibility /src/main/java/com/autojs/scripts
    •  Auto.js 项目依赖 .so 文件(如 V8 引擎的本地库),将这些文件放入 src/main/jniLibs 目录下,结构如下:
      • /src/main/jniLibs/arm64-v8a/libv8.so
      • /src/main/jniLibs/armeabi-v7a/libv8.so
    • build.gradle 中配置本地库支持:

      android { sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } }

4. 暴露接口给 UniApp

实现插件的 Native 方法

UniApp 插件需要通过 Native 层暴露方法给 JavaScript 调用。以 Auto.js 的功能为例,以下是如何实现这些接口。

示例功能:启动脚本
  1. 定义一个接口: 在插件的 Java 类中,实现脚本启动功能。

    package com.example.autojsplugin;
    
    import android.content.Context;
    import android.util.Log;
    import com.alibaba.fastjson.JSONObject;
    import com.autojs.core.ScriptEngine;
    
    public class AutoJsPlugin {
        private ScriptEngine scriptEngine;
    
        // 初始化脚本引擎
        public void initPlugin(Context context) {
            scriptEngine = new ScriptEngine(context);
        }
    
        // 启动脚本
        public String startScript(JSONObject args) {
            String scriptPath = args.getString("path");
            try {
                scriptEngine.execute(scriptPath);
                return "Script started: " + scriptPath;
            } catch (Exception e) {
                Log.e("AutoJsPlugin", "Failed to start script", e);
                return "Error: " + e.getMessage();
            }
        }
    
        // 停止脚本
        public String stopScript() {
            if (scriptEngine != null) {
                scriptEngine.stop();
                return "Script stopped.";
            }
            return "No script running.";
        }
    }
    

5. 注册方法给 UniApp

  1. AndroidManifest.xml 中注册插件,并通过 UniApp 桥接暴露方法。

  2. 继承 UniJSCallback

    • UniApp 的插件需要实现 AbsSDKInstanceUniJSCallback
  3. 实现桥接: 在 JavaScript 中通过 uni.requireNativePlugin 调用以下方法:

@Override
public void invoke(Context context, String method, JSONObject args, UniJSCallback callback) {
    switch (method) {
        case "startScript":
            String result = startScript(args);
            callback.invoke(result);
            break;
        case "stopScript":
            String result = stopScript();
            callback.invoke(result);
            break;
        case "enableAccessibility":
            enableAccessibilityService(context);
            callback.invoke("Accessibility Service Enabled");
            break;
        default:
            callback.invoke("Unknown method: " + method);
    }
}

  6. 配置 AndroidManifest.xml 权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />

<application>
    <service
        android:name=".AccessibilityService"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_config" />
    </service>
</application>

7. 测试

  • manifest.json 中声明插件。

  • 编写 JavaScript 调用逻辑。
    const autojs = uni.requireNativePlugin('AutoJsPlugin');
    
    // 启动脚本
    autojs.startScript({
        path: '/sdcard/scripts/test.js'
    });
    
    // 停止脚本
    autojs.stopScript();
    
    // 启用无障碍服务
    autojs.enableAccessibility();
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值