前言
AutoX.js 使用的是 Rhino 作为 JavaScript
引擎,并不支持完整的 nodejs
模块,所以没法直接调用 nodejs
下的 OSS 包。
下面展示使用 OSS Android SDK 完成上传的过程
准备工作
前往 OSS Android SDK,下载依赖包
将
aar
格式的SDK
转换为dex
这里使用 Android Studio 提供的工具 d8
,进入到 Android Studio 安装目录下,d8
一般在 build-tools
下,MacOS
下为 ~/Library/Android/sdk/build-tools/{version}/
./d8 --release --output output_folder oss-android-sdk-2.9.13.aar
会生成一个 classes.dex
的文件
- 拷贝
classes.dex
到手机
截图
// 安卓版本高于 Android 9,需要手动确认授权
if (device.sdkInt > 28) {
// 等待截屏权限申请并同意
threads.start(function () {
// 这里的系统提示框可能不是运行,改成对应文本即可
packageName("com.android.systemui").text("运行").waitFor();
text("运行").click();
});
}
// 申请截屏权限,false 竖屏
if (!requestScreenCapture(false)) {
console.error("请求截图失败");
exit();
}
// 获取到截图
var image = images.captureScreen();
上传
这里使用了字节数组的方式上传,也可以保存到本地,再上传
// 使用绝对路径导入 SDK
var dexPath = files.path("/storage/emulated/0/Download/classes.dex");
runtime.loadDex(dexPath);
// 导入 OSS 中的类
importClass(com.alibaba.sdk.android.oss.ClientConfiguration);
importClass(com.alibaba.sdk.android.oss.ClientException);
importClass(com.alibaba.sdk.android.oss.OSS);
importClass(com.alibaba.sdk.android.oss.OSSClient);
importClass(com.alibaba.sdk.android.oss.ServiceException);
importClass(com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider);
importClass(
com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider
);
importClass(com.alibaba.sdk.android.oss.model.PutObjectRequest);
importClass(com.alibaba.sdk.android.oss.model.PutObjectResult);
// 下面的参数是在阿里云生成
var OSS_ENDPOINT = "yourEndpoint";
var OSS_ACCESS_KEY_ID = "yourAccessKeyId";
var OSS_ACCESS_KEY_SECRET = "yourAccessKeySecret";
var bucketName = "yourBucket";
var credentialProvider = new OSSStsTokenCredentialProvider(
OSS_ACCESS_KEY_ID,
OSS_ACCESS_KEY_SECRET,
""
);
// OSSClient 的配置类
var conf = new ClientConfiguration();
conf.setConnectionTimeout(60000); // 建立连接的超时时间,单位为毫秒。默认为60000毫秒
conf.setSocketTimeout(60000); // Socket层传输数据的超时时间,单位为毫秒。默认为60000毫秒
conf.setMaxConcurrentRequest(5); // 最大并发数。默认为5
conf.setMaxErrorRetry(2); // 请求失败后最大的重试次数。默认2次
var oss = new OSSClient(context, OSS_ENDPOINT, credentialProvider, conf);
// 文件名
var filename = "screenshot.jpg";
// 使用字节数组上传
var imageBytes = images.toBytes(image, "jpg", 100);
var put = new PutObjectRequest(bucketName, filename, imageBytes);
putResult = oss.putObject(put);
// 上传后的链接
var ossUrl = `https://${bucketName}.${OSS_ENDPOINT}/${filename}`;
// 上传成功
if (putResult.getStatusCode() === 200) {
console.log(ossUrl);
}