常用例子
[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md)
AndroidUtilCode 🔥 是一个强大易用的安卓工具类库,它合理地封装了安卓开发中常用的函数,具有完善的 Demo 和单元测试,利用其封装好的 APIs 可以大大提高开发效率,如今它主要包括两部分模块,其一是主工具类模块:utilcode,其中的工具类是开发中常用到的;其二是子工具类模块:subutil,它包含的工具类并不是很常用,它的出现是为了防止主工具类的臃肿。
## 注册开关飞行模式
```js
function 开关飞行() {
log("删除immomo缓存文件夹-->> " + files.removeDir("/sdcard/immomo/"));
log("删除cvmomo缓存文件夹-->> " + files.removeDir("/sdcard/cvmomo/"));
log("删除data数据-->> " + files.removeDir("/sdcard/Android/data/com.immomo.momo/"));
home();
sleep(1000);
home();
sleep(1000);
while (!click('设置')); //点击按钮直至成功
waitForActivity("com.android.settings.MiuiSettings");
text("更多连接方式").findOne().parent().parent().click();
waitForActivity("com.android.settings.SubSettings");
text("飞行模式").findOne().parent().parent().click();
sleep(8000);
text("飞行模式").findOne().parent().parent().click();
waitForNetworking(1000); //等待联网
};
```
## 屏幕是否为锁定状态
```js
// 屏幕是否为锁定状态
function isDeviceLocked() {
importClass(android.app.KeyguardManager)
importClass(android.content.Context)
var km = context.getSystemService(Context.KEYGUARD_SERVICE)
return km.isKeyguardLocked()
}
```
## 锁屏
```js
//锁屏
function lockScreen() {
//处在run_once模式时由外部脚本进行锁屏
if (runOnceFlag) { return }
console.log("关闭屏幕")
// 锁屏方案1:Root
// Power()
// 锁屏方案2:No Root
// press(Math.floor(device.width / 2), Math.floor(device.height * 0.973), 1000) // 小米的快捷手势:长按Home键锁屏
// 万能锁屏方案:向Tasker发送广播, 触发系统锁屏动作。配置方法见 2021-03-09 更新日志
//app.sendBroadcast({action: ACTION_LOCK_SCREEN});
device.setBrightnessMode(1) // 自动亮度模式
device.cancelKeepingAwake() // 取消设备常亮
if (isDeviceLocked()) {
console.info("屏幕已关闭")
}
else {
//发送锁屏意图
app.sendBroadcast({ action: ACTION_LOCK_SCREEN });
//console.error("屏幕未关闭, 请尝试其他锁屏方案, 或等待屏幕自动关闭")
}
}
```
## 飞行模式切换IP
```js
function 打开飞行模式() {
// 打开飞行模式
new Shell().exec("su -c 'settings put global airplane_mode_on 1; am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true'")
};
function 关闭飞行模式() {
//关闭飞行模式
new Shell().exec("su -c 'settings put global airplane_mode_on 0; am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false'")
};
```
## 点击指定区域
```js
while (true) {
click(500, 380);
}
//或者用
for (var i = 0; i < 7; i++) {
click(500, 380);
}
```
## 自动打开网址
```js
"Auto"
app.openUrl("http://chapai.act.qq.com/ph2");
```
## 微信轰炸机
```js
"auto";
//进入短信发送信息界面,自动进行轰炸
//自行更改需要发送的内容
//土豪专用轰炸机
launchApp("短信");
waitForPackage("com.android.mms");
toast("轰炸机已准备");
while(true){
setText("你好世界!");
id("send_button").click();
}
```
## 防检测按键脚本(范围选点)
random(X,Y)是数值区间,
调出手机指针位置后可以找出适合的区间
脚本例子:
```js
"auto";
launchApp("appname")
sleep(1000)
click(random(60, 1000), random(60, 1660))
sleep(500);
click(random(60, 1000), random(60, 1660))
sleep(500);
click(random(870, 1030), random(130, 400))
```
## 无限每隔10毫秒点击手机屏幕任意位置
```js
auto();
console.show();
console.info("按音量上键开始,按音量下键结束");
events.observeKey();
//按音量上键结束
events.onKeyDown("volume_down", function(event){
threads.shutDownAll();
console.info("已结束");
exit();
});
events.onKeyDown("volume_up", function(event){
threads.start(function(){
//无限每隔10ms点击屏幕任意位置一次
while(true){
var x = random(0, device.width);
var y = random(0, device.height);
click(x, y);
console.log("(%d, %d)", x, y);
sleep(1000);
}
});
});
```
## 屏幕解锁
```js
sleep(5000)//设定时间
//////////唤醒手机///////////
/*判断屏幕锁定,解锁屏幕(数字密码)*/
if (!device.isScreenOn()) {//息屏状态将屏幕唤醒
device.wakeUp();//唤醒设备
sleep(1000); // 等待屏幕亮起
//miui锁屏滑动不能唤出密码输入 通过下拉通知栏点击时间进入密码解锁
swipe(500, 30, 500, 1000, 300);
sleep(400);
//点击时间
click(100, 120);
//解锁 密码1234
desc(1).findOne().click();
desc(2).findOne().click();
desc(3).findOne().click();
desc(4).findOne().click();
//等待解锁完成,返回并退出
back();
exit()
}
```
## 抖音弹窗处理
```js
//监听弹窗事件(异常处理)
threads.start(function(){
while(true){
sleep(1200);
if(text('发现通讯录好友').exists()){
text('取消').click();
};
};
});
```
## 百度手机分辨率
```js
log("脚本有时测得分辨率不对 导致用户无法使用 可以用此方法");
var 正确的分辨率高=百度手机分辨率();
function 百度手机分辨率(){
var fblheight;
var mmm2="https://www.so.com/s?q="+device.device+"+分辨率";
thread1=threads.start(function(){
log("百度手机分辨率 开始");
try {
var res = http.get(mmm2);
if(res.statusCode == 200){
log("网页打开成功...");
var httpstr = res.body.string();
var sousuostr="x"+device.width;
var index = httpstr.indexOf(sousuostr);
if(index>0){
fblheight = parseInt(httpstr.substring(index-4,index));
log("百度成功 分辨率高为:"+fblheight);
}else{
fblheight="百度失败";
log("没有检索到分辨率信息");
}
}
} catch (error) {
log("百度手机分辨率 异常!!!");
fblheight="查找异常";
}
log("百度手机分辨率 结束");
});
thread1.join(2000);
thread1.interrupt();
return fblheight;
}
log("正确的分辨率高:"+正确的分辨率高);
log("脚本测得分辨率高:"+device.height);
```
## 禁止脚本多次运行
```js
/*
* Author:TimeOut
* Date: 2018.12.18
*/
//获取当前所运行的脚本
var list = engines.all();
//双循环比较
for (var i = 0; i < list.length; i++) {
for (var j = i + 1; j < list.length; j++) {
//比较是否只有一个运行
if (list[i].getSource().toString() == list[j].getSource().toString()) {
//停止二次运行的脚本
list[j].forceStop();
};
};
};
```
## [Http代理] 讯代理动态转发示例
```js
/**
* 使用时传入url和端口即可
* 例如: httpProxy("forward.xdaili.cn", 80);
* 此函数生效后,在此函数后的所有 Http 请求都会通过该代理去完成
* @param {string} url
* @param {int} prot
* */
function httpProxy(url, prot) {
var Proxy = java.net.Proxy;
var InetSocketAddress = java.net.InetSocketAddress;
var okhttp = new Packages.okhttp3.OkHttpClient.Builder().proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(url, prot)));
http.__okhttp__.muteClient(okhttp);
}
/**
* 以下是讯代理的 动态转发 请求示例
* 讯代理官方网站: http://www.xdaili.cn
* 20元 10万次 请求
* */
var orderNo = ""; //动态转发的订单号
var secret = ""; //讯代理的secret,个人中心查看
var getMd5 = http.get('https://script.iqqclub.com/md5.js');
eval(getMd5.body.string());
httpProxy("forward.xdaili.cn", 80);
var html = http.get("http://www.diaoyu.com", getHeaders());
log(html.body.string());
function getHeaders() {
var timestamp = Math.round(new Date() / 1000);
var planText = "orderno=" + orderNo + ",secret=" + secret + ",timestamp=" + timestamp;
var sign = hex_md5(planText).toLocaleUpperCase(); //将拼接的字符串MD5后,转换成大写
var header = {
headers: { 'Proxy-Authorization': 'sign=' + sign + '&orderno=' + orderNo + '×tamp=' + timestamp, }
};
return header;
}
```
## [Http代理]讯代理优质代理示例
```js
/** * 讯代理 优质代理 示例 *
* 不支持多线程获取 *
* 脚本中的订单 有效日期截止到: 2018-10-15 15:28 过期后将不可用 *
* 讯代理官方网站: http://www.xdaili.cn
* */
var spiderId = "7ab204de5b7e403caada6398f29c2831"; //spiderId
var orderNo = "YZ20188145457DGCJTP"; //订单号
var getIp_api = http.get('http://pv.sohu.com/cityjson?ie=utf-8');
var InetIP = getIp_api.body.string();
eval(InetIP);
log("使用代理前的外网IP:" + returnCitySN.cip);
var xdailiUrl = "http://api.xdaili.cn/xdaili-api//greatRecharge/getGreatIp?spiderId=" + spiderId + "&orderno=" + orderNo + "&returnType=2&count=1";
for (let i = 0; i < 3; i++) {
try {
var getProxy_json = http.get(xdailiUrl).body.json();
if (getProxy_json.ERRORCODE == "10036" || getProxy_json.ERRORCODE == "10038" || getProxy_json.ERRORCODE == "10055") {
throw {
"code": "-1",
"msg": "提取速度过快"
}
}
if (getProxy_json.ERRORCODE == "10036") {
throw {
"code": "-2",
"msg": "提取次数已达上限"
}
}
break;
} catch (e) {
if (e.code == "-1") {
log(e.msg);
sleep(5000);
}
if (e.code == "-2") {
log(e.msg);
exit();
}
if (i == 2) { //运行3次后,没有拿到IP和端口 程序结束 log("发生了未知错误,请检查网络...");
exit();
}
}
}
//log(getProxy_json);
var xdaili_proxyIP = getProxy_json.RESULT[0].ip;
var xdaili_proxyPort = parseInt(getProxy_json.RESULT[0].port); //log(xdaili_proxyIP+":"+xdaili_proxyPort);
httpProxy(xdaili_proxyIP, xdaili_proxyPort);
var getIp_api = http.get('http://pv.sohu.com/cityjson?ie=utf-8');
var InetIP = getIp_api.body.string();
eval(InetIP);
log("使用代理后的外网IP:" + returnCitySN.cip);
function httpProxy(url, prot) {
var Proxy = java.net.Proxy;
var InetSocketAddress = java.net.InetSocketAddress;
var okhttp = new Packages.okhttp3.OkHttpClient.Builder().proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(url, prot)));
http.__okhttp__.muteClient(okhttp);
}
```
## 获取指定应用的版本号
```js
/*
* 获取指定应用的版本号
* @param {string} packageName 应用包名
*/
function getPackageVersion(packageName) {
importPackage(android.content);
var pckMan = context.getPackageManager();
var packageInfo = pckMan.getPackageInfo(packageName, 0);
return packageInfo.versionName;
};
```
## 停止APP
```js
// 停止APP
function killApp(packageName) {
shell('am force-stop ' + packageName, true);
};
```
## 卸载APP
```js
// 卸载APP
function uninstallApp(packageName) {
shell("pm uninstall " + packageName, true)
};
```
## 清除App数据
```js
// 清除App数据
function clearApp(packageName) {
shell('pm clear ' + packageName, true);
};
```
## 卸载最新安装的app
```js
// 卸载最新安装的app
function uninstallAppLast() {
var pm = context.getPackageManager()
var appList = pm.getInstalledApplications(0)
var appInfoList = []
for (let i = 0; i < appList.size(); i++) {
var app = appList.get(i)
var appInfo = {
appName: app.loadLabel(pm),
packageName: app.packageName,
isSystemApp: app.isSystemApp(),
firstInstallTime: pm.getPackageInfo(app.packageName, 0).firstInstallTime
}
appInfoList.push(appInfo)
}
appInfoList.sort((a, b) => {
return b.firstInstallTime - a.firstInstallTime
})
log('最新安装的app是=%j', appInfoList[0])
var packageName = appInfoList[0].packageName
shell("pm uninstall " + packageName, true)
return appInfoList[0].appName
};
```
## 清除最新安装的APP数据
```js
// 清除最新安装的APP数据
function clearAppLast() {
var pm = context.getPackageManager()
var appList = pm.getInstalledApplications(0)
var appInfoList = []
for (let i = 0; i < appList.size(); i++) {
var app = appList.get(i)
var appInfo = {
appName: app.loadLabel(pm),
packageName: app.packageName,
isSystemApp: app.isSystemApp(),
firstInstallTime: pm.getPackageInfo(app.packageName, 0).firstInstallTime
}
appInfoList.push(appInfo)
}
appInfoList.sort((a, b) => {
return b.firstInstallTime - a.firstInstallTime
})
log('最新安装的app是=%j', appInfoList[0])
var packageName = appInfoList[0].packageName
shell('pm clear ' + packageName, true);
return appInfoList[0].appName
};
```
## 停止最新安装的APP
```js
// 停止最新安装的APP
function killAppLast {
var pm = context.getPackageManager()
var appList = pm.getInstalledApplications(0)
var appInfoList = []
for (let i = 0; i < appList.size(); i++) {
var app = appList.get(i)
var appInfo = {
appName: app.loadLabel(pm),
packageName: app.packageName,
isSystemApp: app.isSystemApp(),
firstInstallTime: pm.getPackageInfo(app.packageName, 0).firstInstallTime
}
appInfoList.push(appInfo)
}
appInfoList.sort((a, b) => {
return b.firstInstallTime - a.firstInstallTime
})
log('最新安装的app是=%j', appInfoList[0])
var packageName = appInfoList[0].packageName
shell('am force-stop ' + packageName, true);
return appInfoList[0].appName
};
```
## 启动最新安装的APP
```js
// 启动最新安装的APP
function launchAppLast() {
var pm = context.getPackageManager()
var appList = pm.getInstalledApplications(0)
var appInfoList = []
for (let i = 0; i < appList.size(); i++) {
var app = appList.get(i)
var appInfo = {
appName: app.loadLabel(pm),
packageName: app.packageName,
isSystemApp: app.isSystemApp(),
firstInstallTime: pm.getPackageInfo(app.packageName, 0).firstInstallTime
}
appInfoList.push(appInfo)
}
appInfoList.sort((a, b) => {
return b.firstInstallTime - a.firstInstallTime
})
log('最新安装的app是=%j', appInfoList[0])
var packageName = appInfoList[0].packageName
launch(packageName)
return appInfoList[0].appName
};
```
## 获取用户安装的app
```js
function getUserAppList() {
var pm = context.getPackageManager()
var appList = pm.getInstalledApplications(0)
var appInfoList = []
for (let i = 0; i < appList.size(); i++) {
var app = appList.get(i)
var appInfo = {
appName: app.loadLabel(pm),
packageName: app.packageName,
isSystemApp: app.isSystemApp(),
firstInstallTime: pm.getPackageInfo(app.packageName, 0).firstInstallTime
}
if (!app.isSystemApp()) {
appInfoList.push(appInfo)
}
log(appInfoList)
}
};
```
## 失去焦点
```js
// 失去焦点
window.disableFocus();
```
## 系统是否ROOT
```js
// 系统是否ROOT
function isRoot() {
var r = shell("ls /system/bin", true).result.toString()
if (r.length > 50) {
return true
} else {
return false
}
};
```
## 获取指定应用的版本号
```js
/*
* 获取指定应用的版本号
* @param {string} packageName 应用包名
*/
function getPackageVersion(packageName) {
importPackage(android.content);
var pckMan = context.getPackageManager();
var packageInfo = pckMan.getPackageInfo(packageName, 0);
return packageInfo.versionName;
};
```
## 打开QQ群名片
```js
// 打开QQ群名片
function (qqGroupNum) {
app.startActivity({
action: "android.intent.action.VIEW",
data: "mqqapi://card/show_pslcard?card_type=group&uin=" + qqGroupNum,
packageName: "com.tencent.mobileqq",
});
};
```
## QQ强制聊天
```js
// QQ强制聊天
function qqChat(qqNum) {
app.startActivity({
action: "android.intent.action.VIEW",
data: "mqq://im/chat?chat_type=wpa&version=1&src_type=web&uin=" + qqNum,
packageName: "com.tencent.mobileqq",
});
};
```
## 取md5
```js
// 取md5
function getMd5(string) {
return java.math.BigInteger(1, java.security.MessageDigest.getInstance("MD5").digest(java.lang.String(string).getBytes())).toString(16);
};
```
## 网络检测
```js
// 网络检测
function internetCheck() {
var intent = new Intent();
importClass(android.content.BroadcastReceiver);
importClass(android.content.ContextWrapper);
importClass(android.content.IntentFilter);
importClass(android.net.ConnectivityManager);
var filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
new ContextWrapper(context).registerReceiver(a = new BroadcastReceiver({
onReceive: function (context, intent) {
var action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
var mConnectivityManager = context.getSystemService(context.CONNECTIVITY_SERVICE);
netInfo = mConnectivityManager.getActiveNetworkInfo();
if (netInfo != null && netInfo.isAvailable()) {
/////////////网络连接
var name = netInfo.getTypeName();
if (netInfo.getType() == ConnectivityManager.TYPE_WIFI) {
/////WiFi网络
toastLog("WiFi网络");
return "WiFi网络"
} else if (netInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
/////有线网络
toastLog("有线网络");
return "有线网络"
} else if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
/////////3g网络
toastLog("3g网络");
return "3g网络"
}
} else {
////////网络断开
toastLog("网络断开");
return "网络断开"
}
}
}
}), filter);
};
```
```js
// 获取手机ip地理位置
function getAction() {
var ip地理位置 = false
var ip地理位置正则 = /本机IP: \\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}<\\/span>([\\s\\S]*?)<\\/td/
var ipUrl = "http://www.baidu.com/s?ie=UTF-8&wd=ip%E5%BD%92%E5%B1%9E%E5%9C%B0%E6%9F%A5%E8%AF%A2"
var r = http.get(ipUrl);
log("code = " + r.statusCode);
var htmlResult = r.body.string()
ip地理位置 = ip地理位置正则.exec(htmlResult)
if (ip地理位置) {
ip地理位置 = ip地理位置正则.exec(ip地理位置)
ip地理位置 = ip地理位置[1]
toastLog(ip地理位置)
return ip地理位置
} else {
log('没有查询到Ip地理位置,脚本停止')
return false
}
};
```
## 自定义位置提示块
```js
//自定义位置提示块
function toastEx(msg, x, y) {
importClass(android.widget.Toast);
importClass(android.view.Gravity);
var toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP | Gravity.LEFT, x, y);
toast.show();
};
```
## 比较日期大小
```js
let begintime = '2019-11-25'
let endtime = getNowFormatDate()
log(endtime)
log(compareDate(begintime, endtime))
// 比较日期大小
function compareDate(begintime, endtime) {
return ((new Date(begintime.replace(/-/g, "\\/"))) < (new Date(endtime.replace(/-/g, "\\/"))));
};
// 获取当前日期2019-11-26
function getNowFormatDate() {
var date = new Date();
var seperator1 = "-";
var year = date.getFullYear();
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = year + seperator1 + month + seperator1 + strDate;
return currentdate;
}
```
## 获取wifi状态和信息
```js
//与权限相关的类,可以找到谷歌帮助文档的Manifest.permission类。
importClass(android.net.wifi.WifiManager);
var wifiManager = context.getSystemService(context.WIFI_SERVICE);
log(wifiManager.getWifiState()); // 返回 1 网卡不可用 2 正在关闭 3 网卡可用 4 正在打开 5 未知状态
var wifiInfo = wifiManager.getConnectionInfo();
log(wifiInfo.getSSID());
log(wifiInfo.getBSSID());
```
## 安装apk
```js
function installApk(apkPath) {
importClass(android.net.Uri);
importClass(java.io.File);
var file = new File(apkPath);
var install = new Intent();
install.setAction(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
context.startActivity(install);
}
```