牙叔教程简单易懂
使用场景
在看英文的时候,我们会遇到不懂得单词,就需要查阅单词的意思,
一般步骤是长按出现菜单,选中单词,菜单里有的有翻译选项,点击之后跳转搜索单词的页面,
有的菜单里面没有翻译选项,复制以后,需要自行打开百度,或者其他翻译软件,再搜索翻译
这里面有很多非常干扰我们阅读的操作,在app之间跳来跳去,不爽;
目标
我们今天就做一个,当长按之后,选中单词,点击复制,直接出翻译的功能
主要功能
监听剪贴板
这个监听剪贴板的功能在高版本安卓是可以实现的,只是相比于安卓9之前的版本,步骤复杂一点点,
Google在近年来一直在打击第三方应用程序对剪切板的访问,目的是增强用户的个人资料安全。在发布Android10时就已经禁止后台应用读取剪贴板数据。
我的手机是安卓12,如果我阅读文章的app在前台,autojs在后台肯定是读取不到剪贴板内容的
在autojs的菜单中,有一个前台服务,打开之后,回到手机桌面,测试读取剪贴板,内容为空,读取不到
悬浮窗算前台吗?
前台服务不行的话,我们用悬浮窗试试,悬浮窗算前台吗?
试试就知道了
letw=floaty.window(
vertical
buttonid="readClipboard"text="读取剪贴板"w="auto"/
/vertical
);
w.readClipboard.click(()={
letcontent=getClip();
toastLog(content);
});
setInterval(()={},);
经过测试,toast气泡内容为空,证明悬浮窗不算安卓所说的前台,
焦点
查阅了一番教程之后,说安卓10获取剪贴板要获取焦点,
那么我们就给按钮申请焦点试试
w.readClipboard.click(()={
//申请焦点
w.requestFocus();
setTimeout(()={
letcontent=getClip();
toastLog(content);
},);
});
焦点申请了,第一次点击没有获取到剪贴板内容,之后的点击都获取到了剪贴板内容
时差
再次查阅资料,说申请焦点以后,还要等一下再获取剪贴板,那我们就等一下
w.readClipboard.click((view)={
log(view.text());
//申请焦点
w.requestFocus();
setTimeout(()={
letcontent=getClip();
toastLog(content);
},);
});
这下测试就正常了,第一次点击也可以获取到剪贴板内容,
这里有个问题,我们申请了焦点,用完之后应该去除焦点
w.readClipboard.click((view)={
w.requestFocus();
setTimeout(()={
letcontent=getClip();
toastLog(content);
w.disableFocus();
},);
});
监听剪贴板
获取剪贴板内容解决了,怎么监听呢?
开一个定时器,每隔一会读取一下剪贴板,
我们的目的是翻译单词,不想等太久,所以用ms,大家可以自行修改时间
切换焦点的问题
频繁切换焦点,当我们要聊天界面有输入框出现的时候,焦点会在悬浮窗和聊天输入框之间频繁切换,
甚至无法操作界面,因此我们要增加一个停止切换焦点的功能,以便我们可以正常打字聊天输入文字
必须用悬浮窗获取剪贴板内容吗
不想用悬浮窗,也可以试试adb,手机用usb连接电脑,然后执行下面的命令
adb-dshellappopssetorg.autojs.autojsproSYSTEM_ALERT_WINDOWallow;
adb-dshellpmgrantorg.autojs.autojsproandroid.permission.READ_LOGS;
adbshellamforce-stoporg.autojs.autojspro;
实测,这个方法没用,所以,必须用悬浮窗.
不过那个scrcpy投屏软件就可以直接获取剪贴板,有经验的大佬可以去看看研究下scrcpy的代码
翻译单词
翻译单词可以用在线的百度,有道,也可以用离线的词典.
百度和有道都有免费额度,
百度
免费调用量:标准版免费调用量由不限额度改为5万字符/月
有道
每小时次免费访问,超过访问次数后会进行封禁暂停服务,1小时后会自然恢复。
每个平台都要申请自己的key,这里以有道为例
这是有道的