常见问题
提示
内容比较多,可通过ctrl+F
搜索关键词
# 如果设置开机自启动?
首先不同的机型设置不太相同但是大体一致,你需要在权限设置里,允许开机自启动
# 开机自启动如何运行脚本?
这里注意开机自启动针对的是打包后的apk,软件开机自启动是启动app,app启动后会默认加载start.js文件,但是正常启动也是加载start.js文件如何区分是开机自启动,还是人工启动,我们可以去判断一个变量;autoStar==true
案例
复制if(autoStar==true){
printl("开机自启动");
}
# 如何定时停止脚本
问题:比如我想定时10分钟后停止主脚本运行应该如何实现?
回答:可以使用多线程来计时10分钟后然后stopAll()停止所有脚本
复制
//用多线程异步子任务运行一个定时
new thread().runJsCode(function fun(){
//这里倒计时10分钟
sleep.second(60*10);
stopAll();//停止所有脚本
},"-线程名")
//下面是主脚本内容
# 如何意图跳转
复制//导入包
importClass(Packages.android.content.Intent);
importClass(Packages.android.net.Uri);
//设置url
var url = "kwai://profile/2037335125";
//使用安卓intent跳转
var intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
# 如何打包apk
apk可在pc版本aiwork中打包.每个apk应该对应一个appid,也就是包名,包名的格式为 com.baidu.ai 类似域名的格式
# 打包apk是免费的吗
vip才具备打包apk的权限,具体vip价格请参考官网报价
# 打包出的apk需要再收费吗?
打包apk分两种,免费和收费,可自行选择
# 如何让一个线程控制另一个线程停止
//如何一个线程延迟结束另一个线程
//先定义一个线程t1
var t1= new thread();
t1.runJsCode( ()=>{
while(true){
printl("你好")
sleep.second(1);
}
},"主任务线程");
//定义t2线程
var t2= new thread();
t2.runJsCode( ()=>{
//10秒后停止t1线程
sleep.second(10)
t1.stop();
},"监控线程")
# 连接手机提示上传内核失败如果解决?
上传内核失败是因为adb无法推送文件到手机,一般可能是其他adb干扰,可以尝试从任务管理器结束全部adb.exe的进程然后再重试。
另外排查你aiwork是不是安装的路径不对,路径中有空格 比如 c://a b/aiwrok/ 这样就是不对的路径不能含有空格和特殊符号。
如果以上方法还不行就要手动上传aiwork安装根目录下adb目录下的 server.dex文件到手机 sdcard/autoApp/ 下就可以了
# 如何购买会员
用户中心注册账号 http://user.autoapp.net.cn/login
登录账号
找到vip购买二维码微信扫码即可
# 如何用悬浮窗实现HUB抬头显示
//初始化一个activity页面
var fui=new floatUI()
fui.loadXML(`
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80"
android:orientation="vertical"
android:padding="8dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="hud"
android:text="开始" ></TextView>
</LinearLayout>
`)
fui.setHeight(80)
fui.setWidth(400)
fui.setPosition(150,50);
var hud=fui.findViewById('hud');
//对控件的操作必须在ui线程下完成
fui.runOnUiThread(function fun(){
//动态设置按钮背景色
hud.setText("你好")
})
# 雷电模拟器5屏幕翻转问题如何解决
屏幕翻转可能是雷电5的一个bug获取免root截屏,就会横屏旋转。目前解决方法是切换截屏模式为agent模式。 在脚本开头加一句话执行一下就行了
//切换截屏模式为代理截屏,所以的要求模拟器root
seting.setAgentScreenShotModel(true);
# 利用多线程完成计划任务
需求: 比如有 3个脚本任务,我希望每个指定运行时间没运行完也结束,比如我想任务1运行20秒 其他任务也是20秒,然后总运行时间我设定30秒就算没有运行完也全部停止。
以下是实现案例:
function 计划任务(函数,运行时间){
var t=new thread();
t.runJsCode( ()=>{
函数();
},"计划任务")
sleep.second(运行时间);
t.stop();
}
function 脚本1(){
while(true){
printl("脚本1")
sleep.second(1);
}
}
function 脚本2(){
while(true){
printl("脚本2")
sleep.second(1);
}
}
function 脚本3(){
while(true){
printl("脚本3")
sleep.second(1);
}
}
//异步监控总运行时间然后全部停止
new thread().runJsCode( ()=>{
//总运行30秒后停止
sleep.second(30)
stopAll();
printl("全部停止");
},"总时间线程")
//脚本1运行20秒后停止
计划任务(脚本1,20)
//脚本2运行20秒后停止
计划任务(脚本2,20)
//脚本3运行30秒后停止
计划任务(脚本3,20)
# 如何播放mp3
/*
By: 好黑
*/
importClass(android.media.MediaPlayer);
importClass(android.media.AudioManager);
var mediaPlayer = new MediaPlayer()
var mp3 = "/sdcard/Pictures/1.mp3"
var ac = new activity();
ac.loadSXML(` <vertical>
<button text="播放" id="play"></button>
<button text="停止" id="stop"></button>
</vertical>`)
ac.findViewById("play").setOnClickListener(() => {
printl("播放")
if (file.isExists(mp3)) {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(mp3);
mediaPlayer.prepare();
mediaPlayer.start();
}else{
printl("mp3文件不存在!!")
}
})
ac.findViewById("stop").setOnClickListener(() => {
printl("停止")
mediaPlayer.stop()
})
# 如何获取短信
// 注意不同手机有信息保护 可以在设置里搜 安全保护 关闭保护即可
if(permissionManger.checkSMS()==-1){
//请求权限可以放到启动页
permissionManger.requestPremission('android.permission.READ_SMS')
}
function readLatestSms() {
var ContentResolver = Packages.android.content.ContentResolver;
var Uri = Packages.android.net.Uri;
var contentResolver = context.getContentResolver();
var smsUri = Uri.parse("content://sms/inbox");
var projection = java.lang.reflect.Array.newInstance(java.lang.String, 4); // 创建大小为4的字符串数组
projection[0] = "_id";
projection[1] = "address";
projection[2] = "date";
projection[3] = "body";
var sortOrder = "date DESC"; // 按日期降序
var cursor = contentResolver.query(smsUri, projection, null, null, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
var addressIndex = cursor.getColumnIndex("address");
var bodyIndex = cursor.getColumnIndex("body");
var address = cursor.getString(addressIndex);
var body = cursor.getString(bodyIndex);
return ("From: " + address + ", Content: " + body); // 使用print输出
cursor.close(); // 关闭cursor
} else {
return ("No SMS found.");
}
}
printl(readLatestSms());
# 为什么部分手机不弹出toast
1.手机需要设置中搜索通知权限然后把app加入通知权限 2.部分机型比如华为小米,要开启应用的允许后台弹窗权限。
# 如何获取顶端app包名
//手机设置里搜索 特殊应用 使用情况访问权限 找到自己app 打开权限即可使用
function getTopApp() {
// 获取UsageStatsManager
var usageStatsManager = context.getSystemService(Packages.android.content.Context.USAGE_STATS_SERVICE);
// 获取当前时间
var currentTime = Packages.java.lang.System.currentTimeMillis();
// 查询应用的使用统计信息
var appList = usageStatsManager.queryUsageStats(
Packages.android.app.usage.UsageStatsManager.INTERVAL_DAILY,
currentTime - 1000 * 60 * 60 * 1, // 过去1小时
currentTime
);
// 获取当前应用的包名
var currentPackageName = context.getPackageName();
// 检查appList是否有效
if (appList != null && !appList.isEmpty()) {
// 使用Java的Comparator进行排序,确保使用long进行比较
var Collections = Packages.java.util.Collections;
var Comparator = Packages.java.util.Comparator;
// 按时间倒序排列
Collections.sort(appList, new Comparator({
compare: function (a, b) {
var lastTimeUsedA = a.getLastTimeUsed();
var lastTimeUsedB = b.getLastTimeUsed();
return java.lang.Long.compare(lastTimeUsedB, lastTimeUsedA); // 倒序排列
}
}));
// 迭代排序后的appList
for (var i = 0; i < appList.size(); i++) {
var usageStats = appList.get(i);
// 排除系统应用和当前应用
var packageName = usageStats.getPackageName();
if (!packageName.contains("android") && !packageName.contains("oppo")&& packageName !== currentPackageName) {
return packageName; // 返回第一个符合条件的应用包名
}
}
}
return null; // 如果没有找到符合条件的应用,返回null
}
// 示例调用
var packageName = getTopApp();
if (packageName !== null) {
printl(packageName);
} else {
printl("No suitable non-system app found.");
}
# 指定线程停止和UI线程停止控制
var line=new thread();//创建一个线程对象
line.runJsCode(function fun(){
//这里写代码
printl(‘代码’)
},’代码’)
for(let i=0;i<10;i++){
printl(line.isAlive()) //线程是否存活
}
line.stop(); //停止线程
var line=new thread();//创建一个线程对象
line..runJsFile(‘1.js’,’代码’)
for(let i=0;i<10;i++){
printl(line.isAlive()) //线程是否存活
}
line.stop(); //停止线程
var line=new thread();//创建一个线程对象
line.runOnUiThread(function fun(){
//这里写代码
printl(‘UI线程执行代码’)
})
for(let i=0;i<10;i++){
printl(line.isAlive()) //线程是否存活
}
line.stop(); //停止线程
# setTimeout 异步执行
Promise 的构造函数
Promise 构造函数是 JavaScript 中用于创建 Promise 对象的内置构造函数。
Promise 构造函数接受一个函数作为参数,该函数是同步的并且会被立即执行,所以我们称之为起始函数。起始函数包含两个参数 resolve 和 reject,分别表示 Promise 成功和失败的状态。
起始函数执行成功时,它应该调用 resolve 函数并传递成功的结果。当起始函数执行失败时,它应该调用 reject 函数并传递失败的原因。
Promise 构造函数返回一个 Promise 对象,该对象具有以下几个方法:
●then:用于处理 Promise 成功状态的回调函数。
●catch:用于处理 Promise 失败状态的回调函数。
●finally:无论 Promise 是成功还是失败,都会执行的回调函数。
下面是一个使用 Promise 构造函数创建 Promise 对象的例子:
当 Promise 被构造时,起始函数会被同步执行:
setTimeout(function() {
console.log(‘延迟1秒钟执行’);
}, 1000);
上述代码会在 1 秒后执行 console.log() 函数。
function loop() {
console.log(‘循环执行’);
// 继续循环执行
setTimeout(loop, 1000);
}
// 开始执行
setTimeout(loop, 1000);
上述代码会每隔 1 秒钟执行一次 loop() 函数,实现了循环执行的效果。
function debounce(fn, delay) {
let timer = null;
return function() {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, arguments);
}, delay);
}
}
function test() {
console.log(‘防抖函数’);
}
let debounceTest = debounce(test, 1000);
// 如果在 1 秒钟内多次调用 debounceTest(),只会执行一次 test() 函数
function throttle(fn, delay) {
let timer = null;
return function() {
if(!timer) {
timer = setTimeout(() => {
fn.apply(this, arguments);
timer = null;
}, delay);
}
}
}
function test() {
console.log(‘节流函数’);
}
let throttleTest = throttle(test, 1000);
// 如果在 1 秒钟内多次调用 throttleTest(),只会每隔 1 秒钟执行一次 test() 函数
# 单个百分比坐标怎么转换真实坐标
例子: 0.5*1080= 540 1080 的中心点 就是540
公式是:百分数*屏幕 =实际坐标
# 怎样给APP设定“保持在手机后台运行”?以HarmonyOS 3.0为例
手机用久了就总会出现打开APP卡顿的情况,于是有不少人想要让某些常用的APP直接挂在后台,减少应用程序自动关闭的情况。这种需求,其实就是希望APP能够“保持在后台运行”。
**本篇文章用14张图片、7大步骤,讲解手机如何将某个APP保持在后台运行。**图片直接使用的是华为手机HarmonyOS 3.0的手机界面截图,其他手机型号也大同小异,可作参考。#鸿蒙HarmonyOS#
第一步,在手机自带的设置里,打开【应用与服务】,选定【应用管理】。
你可以直接在列表里翻找出自己想要保持在后台运行的APP,也可以在搜索框里搜,反正就是要点击进入目标APP,进入【通知管理】。
打开【允许通知】和【允许打扰】两个选项,然后返回上一个界面,点击【权限】。
第二步,在权限界面内,打开【后台弹窗】和【悬浮窗】两项,然后再次返回应用管理的界面(返回2次)。
第三步,在应用管理界面,点击【流量使用情况】,打开【移动数据】【WLAN】【后台数据】【漫游数据】4个选项。然后返回上一个界面。
第四步,进入【耗电详情】,点击【启动管理】,关闭【自动管理】,并且将手动管理的全部选项都打开,包括【允许自启动】【允许关联启动】【允许后台活动】。然后返回到设置界面。
第五步,点击【电池】,进入新界面后,关闭【省电模式】【超级省电】,然后进入【更多电池设置】,开启【休眠时始终保持网络连接】。
第六步,再次返回设置界面,点击【移动网络】,关闭【智能省流量】。然后就可以退出设置,进入手机的主屏幕。
第七步,在手机打开你想要设定保持在后台运行的那个APP。为了方便解说,这里直接用软件AirDroid替代目标软件的说法——将软件撤去后台(从手机底部边缘快速滑动至手机屏幕中间,进入手机APP的管理界面】,长按AirDroid并且往下拖一段距离,然后松手。
松手后就会出现一个锁型的图案,这就意味着AirDroid在后台被锁住了。一般软件设定保持后台运行到这里就结束了。
如果你恰好需要使用AirDroid的远程控制功能,也就是需要将AirDroid设定保持在后台运行,请继续根据下面的图片操作。
第八步,打开AirDroid并且登录账号,点击【个人】-【设置】。
关闭【省电模式】,点一下【保持AirDroid后台运行】,这时会弹出一个提示,问“是否忽略电池优化”,请点击【允许】。
如果你的AirDroid没有出现“保持AirDroid后台运行“,那说明在软件安装的时候,你已经同意了。
到此为止,华为手机HarmonyOS 3.0如何将某个APP设置保持在后台运行的操作已经解释完毕。
如果你使用的是其他系统型号的手机,并且你需要将AirDroid设定保持在后台运行,请在打开AirDroid后,点击【个人】-【安全及远程功能设置】,点击进入【远程控制】界面,里面有一行蓝色的字体,点击蓝色字体即可查看其他系统型号的手机如何将AirDroid设定保持在后台运行(以下两图所示)。
# 问题:右击获取的真实坐标 实际点击是点击位置不正确 是怎么回事啊
答:遇到这样的事,只需要操作一下下图的这个手机软件图标侧栏没有启动,重启动就可以,一般是没有打开,或是手机开好权限后,重启一下就可以解决了。
# 问题一:打不开Aiwork
1.有的电脑系统缺少微软c++动态链接库,可以到官方群文件下载安装
2.默认安装到c盘,默认软件给的路径就行
# 问题二:IDE不会自动更新
原因是点过忽略此版本。
解决方法从注册表删除记录
打开注册表 可以用 命令行输入 regedit
搜索AutoUpdater
在重启就会提示升级了
# 问题三:IDE右侧文档打不开
1.请链接移动端开发助手,文档就可正常打开
2.注意:助手版本大于或等于IDE开发环境版本
# 问题四:链接不了移动端开发助手
1.关闭任务管理器,adb进程,在链接,可能是其他adb进程影响
2.ide授权的网络权限没有打开,第一次授权你没有同意
3.请卸载鲁大师,关闭其他网络加速软件,会影响网络链接
4.以下方法可以授权adb链接
在本文件打开cmd控制台,输入命令,看以下:
输入完成,在次打开ide,adb链接设备
5.真机设备请,保证是同一个局域网,可链接内网穿透
6..真机设备请,保证usb数据线正常,可adb链接,出现adb冲突,请先把其他adb进程关闭
# hid.swip滑动有卡顿现象怎么办?
hid.swip滑动有卡顿现象怎么办?
答:蓝牙信号因为信号延迟用swipex滑动就可以了。
# 手机短信采集按需采集
/*
这个是获取手机短信的例子,
最近很多人用AIWORK怎么获取短信验证码,这样就不用去打开,然后一点一点的采集了。
其实AIwork是有很便捷的方式进验证码采集的,比如下面这段,按时间排序的短信验证码,这样就可以采集出验证码,
并且可以全部输入数字出来,有哪位朋友需要这段代码的请加群或是加我Q获取这段现成的代码。
下面是AIWORK演示代码操作:
*/
// 定义一个函数,用于读取最新的短信
function readLatestSms() {
// 引入Android的ContentResolver和Uri类
var ContentResolver = Packages.android.content.ContentResolver;
var Uri = Packages.android.net.Uri;
// 获取当前上下文的内容解析器
var contentResolver = context.getContentResolver();
// 指定短信内容的URI
var smsUri = Uri.parse("content://sms/inbox");
// 创建一个大小为4的字符串数组,用于指定查询的字段
var projection = java.lang.reflect.Array.newInstance(java.lang.String, 4);
projection[0] = "_id"; // 短信ID
projection[1] = "address"; // 短信发送者地址
projection[2] = "date"; // 短信发送日期
projection[3] = "body"; // 短信内容
// 按照日期降序排列
var sortOrder = "date DESC";
// 查询短信内容
var cursor = contentResolver.query(smsUri, projection, null, null, sortOrder);
// 检查游标是否有效并移动到第一条记录
if (cursor != null && cursor.moveToFirst()) {
// 获取发送者地址和短信内容的索引
var addressIndex = cursor.getColumnIndex("address");
var bodyIndex = cursor.getColumnIndex("body");
// 获取发送者地址和短信内容
var address = cursor.getString(addressIndex);
var body = cursor.getString(bodyIndex);
// 返回短信的发送者和内容
return ("From: " + address + ", Content: " + body);
cursor.close(); // 关闭游标
} else {
// 如果没有找到短信,返回提示信息
return ("No SMS found.");
}
}
// 调用函数,获取最新的短信内容并打印
printl(readLatestSms());
// 获取短信内容
let smsContent = readLatestSms();
// 打印短信内容
console.log(smsContent);
// 定义正则表达式,用于匹配验证码(假设验证码在特定格式的短信中)
let regex = /【新浪】(\d+)/;
// 执行正则表达式匹配
let match = regex.exec(smsContent);
// 如果找到了匹配的验证码
if (match) {
let captchaCode = match[1]; // 提取验证码
console.log("验证码是:", captchaCode); // 打印验证码
} else {
console.log("未能找到验证码"); // 如果未找到,打印提示信息
}
# 截图并保存到本地手机
// 定义图像对象
var 图像 = {};
// 定义截图并保存的函数
图像.截图并保存 = function (path, x1, y1, x2, y2) {
if (typeof path === "undefined") return null;
if (typeof x1 === "undefined") return null;
if (typeof y1 === "undefined") return null;
if (typeof x2 === "undefined") return null;
if (typeof y2 === "undefined") return null;
// 全屏截图并裁剪
let ima = screen.screenShotFull().cutImage(x1, y1, x2, y2);
// 保存裁剪后的图像
ima.save(path);
return ima;
}
// 调用示例
var filePath = "/sdcard/123/screenshot.jpg"; // 请修改为您想保存的路径
var x1 = 0; // 裁剪区域左上角的x坐标
var y1 = 0; // 裁剪区域左上角的y坐标
var x2 = screen.getScreenWidth(); // 裁剪区域右下角的x坐标
var y2 = screen.getScreenHeight(); // 裁剪区域右下角的y坐标
// 调用函数进行截图并保存
var resultImage = 图像.截图并保存(filePath, x1, y1, x2, y2);
// 检查是否成功
if (resultImage) {
printl("截图已保存到:" + filePath);
} else {
printl("截图保存失败");
}
# 字符串的md5值 怎么获取
com.autoapp.autoapp.StaticClass.codeBase.md5("123");