常用例子

[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 + '&timestamp=' + 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:&nbsp;\\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); } ```