zoukankan      html  css  js  c++  java
  • autojspro常用的代码和公共函数搜集整理,史上最全最完整

       1 /**
       2  * 整理者: 家
       3  * 日期:  20190224
       4  * 妈呀:  整理了一宿,现在是早上6:34
       5  * 功能: 把某些常用的函数集中起来,方便调用
       6  * 函数来源: 都是群里的大佬写的,稻草人,+攀登,Ai,破晓的星辰,灶猫,家,浩然,白酒煮饭,生僻字大佬,内个谁,Xero,无名小姐,壞蛋┭,锦瑟安年Ω,专业滥竽充数,膜拜以上几位大神,不管你们同意不同意,我都把你们的代码搬到一块了,O(∩_∩)O哈哈~
       7  * git:  https://github.com/snailuncle/autojsCommonFunctions/blob/master/autojsCommonFunctions.js
       8  */
       9  
      10 //此代码由飞云脚本圈整理提供(www.feiyunjs.com)
      11 
      12 //  //导入模块
      13 //  function 导入常用函数模块(){
      14 //   var url='https://raw.githubusercontent.com/snailuncle/autojsCommonFunctions/master/autojsCommonFunctions.js'
      15 //   var r = http.get(url)
      16 //   log("code = " + r.statusCode);
      17 //   var html=r.body.bytes()
      18 //   files.writeBytes('./autojsCommonFunctions.js',html)
      19 //   var common=require('./autojsCommonFunctions.js')
      20 //   return common
      21 // }
      22 // var common=导入常用函数模块()
      23 // log(common)
      24 // for(let i=0;i<33;i++){
      25 //   common.闪光弹('fire in the hole')
      26 // }
      27 
      28 
      29 
      30 
      31 [
      32   '点击控件',
      33   '铃声',
      34   '启动app',
      35   '停止app',
      36   '卸载app',
      37   '卸载app没root',
      38   '清除app数据',
      39   '启动最新安装的app',
      40   '停止最新安装的app',
      41   '卸载最新安装的app',
      42   '清除最新安装的app数据',
      43   '静默安装app',
      44   '获取app图标',
      45   '控制app联网',
      46   '获取手机上所有的app名字',
      47   '点击输入框弹出输入法',
      48   '使所有输入框点击时都能弹出输入法',
      49   '失去焦点',
      50   '是否root',
      51   '获取指定应用的版本号',
      52   '打开qq群名片',
      53   '打开qq名片',
      54   'qq强制聊天',
      55   '字节变为gbk中文',
      56   '最新安装的app',
      57   '文件修改时间',
      58   '文件大小',
      59   '字符串变字节',
      60   '日期加N天',
      61   'md5',
      62   '是横屏还是竖屏',
      63   '截图',
      64   '随机字符',
      65   '获取时间',
      66   '调整手机音量',
      67   '微信扫一扫',
      68   '公共字符串',
      69   '网络',
      70   '安卓intent源码',
      71   '获取手机ip地理位置',
      72   '替换系统文件',
      73   '编辑距离',
      74   '数组交集',
      75   '提取包含关键字的app',
      76   '获取页面所有文字',
      77   '悬浮控制',
      78   '闪光弹',
      79   '打开开发者选项',
      80   '气泡',
      81   '随机字符串',
      82   'wifi状态',
      83   '开关飞行模式',
      84   '上滑',
      85   '获取deflate网页内容',
      86   '获取gzip网页内容'
      87   ]
      88 
      89 
      90 
      91 
      92 
      93   var common = {}
      94   Array.prototype.intersect = function () {
      95     var result = new Array();
      96     var obj = {};
      97     for (var i = 0; i < arguments.length; i++) {
      98       for (var j = 0; j < arguments[i].length; j++) {
      99         var str = arguments[i][j];
     100         if (!obj[str]) {
     101           obj[str] = 1;
     102         } else {
     103           obj[str]++;
     104           if (obj[str] == arguments.length) {
     105             result.push(str);
     106           }
     107         } //end else
     108       } //end for j
     109     } //end for i
     110     return result;
     111   }
     112   //集合去掉重复
     113   Array.prototype.uniquelize = function () {
     114     var tmp = {},
     115       ret = [];
     116     for (var i = 0, j = this.length; i < j; i++) {
     117       if (!tmp[this[i]]) {
     118         tmp[this[i]] = 1;
     119         ret.push(this[i]);
     120       }
     121     }
     122     return ret;
     123   }
     124   //并集
     125   Array.prototype.union = function () {
     126     var arr = new Array();
     127     var obj = {};
     128     for (var i = 0; i < arguments.length; i++) {
     129       for (var j = 0; j < arguments[i].length; j++) {
     130         var str = arguments[i][j];
     131         if (!obj[str]) {
     132           obj[str] = 1;
     133           arr.push(str);
     134         }
     135       } //end for j
     136     } //end for i
     137     return arr;
     138   }
     139   //2个集合的差集 在arr不存在
     140   Array.prototype.minus = function (arr) {
     141     var result = new Array();
     142     var obj = {};
     143     for (var i = 0; i < arr.length; i++) {
     144       obj[arr[i]] = 1;
     145     }
     146     for (var j = 0; j < this.length; j++) {
     147       if (!obj[this[j]]) {
     148         obj[this[j]] = 1;
     149         result.push(this[j]);
     150       }
     151     }
     152     return result;
     153   };
     154   // console.log(Array.intersect(["1", "2", "3"], ["2", "3", "4", "5", "6"])); //[2,3]
     155   // console.log([1, 2, 3, 2, 3, 4, 5, 6].uniquelize()); //[1,2,3,4,5,6]
     156   // console.log(Array.union(["1", "2", "3"], ["2", "3", "4", "5", "6"], ["5", "6", "7", "8", "9"]))
     157   // console.log(["2", "3", "4", "5", "6"].minus(["1", "2", "3"]));
     158 
     159   common.点击控件 = function (view) {
     160     log(arguments.callee.name + '开始')
     161     log(view)
     162     if (view) {
     163       var x = view.bounds().centerX()
     164       var y = view.bounds().centerY()
     165       log('将要点击的坐标 %s,%s', x, y)
     166       press(x, y, 1)
     167     } else {
     168       throw '传入点击控件中的view异常'
     169     }
     170     log(arguments.callee.name + '结束')
     171   }
     172   common.铃声 = function (铃声类型, 是否循环播放, 播放时长) {
     173     var 铃声类型 = 铃声类型 || 0
     174     var 播放时长 = 播放时长 || 6000
     175     var 是否循环播放 = 是否循环播放 || false
     176     if (是否循环播放) {
     177       播放时长 = 666 * 1000
     178     }
     179     var 铃声选择结果 = android.media.RingtoneManager.TYPE_NOTIFICATION
     180     switch (铃声类型) {
     181       case 0:
     182         铃声选择结果 = android.media.RingtoneManager.TYPE_RINGTONE
     183         break;
     184       case 1:
     185         铃声选择结果 = android.media.RingtoneManager.TYPE_ALARM
     186         break;
     187       case 2:
     188         铃声选择结果 = android.media.RingtoneManager.TYPE_ALL
     189         break;
     190       default:
     191         break;
     192     }
     193     var mp = new android.media.MediaPlayer();
     194     mp.setDataSource(context, android.media.RingtoneManager.getDefaultUri(铃声选择结果));
     195     if (是否循环播放) mp.setLooping(true);
     196     mp.prepare();
     197     mp.start();
     198     threads.start(function () {
     199       sleep(播放时长)
     200       if (mp.isPlaying()) {
     201         mp.stop()
     202       }
     203     });
     204     return mp;
     205   }
     206 
     207   common.启动app = function (appName) {
     208     launchApp(appName)
     209   }
     210 
     211   common.停止app = function (appName) {
     212     var packageName=getPackageName(appName);
     213     shell('am force-stop ' + packageName,true);
     214 
     215   }
     216   common.卸载app = function (appName) {
     217     var packageName=getPackageName(appName);
     218     shell("pm uninstall "+packageName,true)
     219   }
     220 
     221   common.清除app数据 = function (appName) {
     222     var packageName=getPackageName(appName);
     223     shell('pm clear ' + packageName,true);
     224   }
     225 
     226 
     227   common.卸载最新安装的app=function (){
     228     var pm = context.getPackageManager()
     229     var appList=pm.getInstalledApplications(0)
     230     var appInfoList=[]
     231     for(let i=0;i<appList.size();i++){
     232       var app=appList.get(i)
     233       var appInfo={
     234         appName:app.loadLabel(pm),
     235         packageName:app.packageName,
     236         isSystemApp:app.isSystemApp(),
     237         firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
     238       }
     239       appInfoList.push(appInfo)
     240 
     241     }
     242     appInfoList.sort((a,b)=>{
     243       return b.firstInstallTime-a.firstInstallTime
     244     })
     245     log('最新安装的app是=%j',appInfoList[0])
     246 
     247     var packageName=appInfoList[0].packageName
     248     shell("pm uninstall "+packageName,true)
     249     return appInfoList[0].appName
     250   }
     251   common.清除最新安装的app数据=function (){
     252     var pm = context.getPackageManager()
     253     var appList=pm.getInstalledApplications(0)
     254     var appInfoList=[]
     255     for(let i=0;i<appList.size();i++){
     256       var app=appList.get(i)
     257       var appInfo={
     258         appName:app.loadLabel(pm),
     259         packageName:app.packageName,
     260         isSystemApp:app.isSystemApp(),
     261         firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
     262       }
     263       appInfoList.push(appInfo)
     264 
     265     }
     266     appInfoList.sort((a,b)=>{
     267       return b.firstInstallTime-a.firstInstallTime
     268     })
     269     log('最新安装的app是=%j',appInfoList[0])
     270 
     271     var packageName=appInfoList[0].packageName
     272     shell('pm clear ' + packageName,true);
     273     return appInfoList[0].appName
     274   }
     275   common.停止最新安装的app=function (){
     276     var pm = context.getPackageManager()
     277     var appList=pm.getInstalledApplications(0)
     278     var appInfoList=[]
     279     for(let i=0;i<appList.size();i++){
     280       var app=appList.get(i)
     281       var appInfo={
     282         appName:app.loadLabel(pm),
     283         packageName:app.packageName,
     284         isSystemApp:app.isSystemApp(),
     285         firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
     286       }
     287       appInfoList.push(appInfo)
     288 
     289     }
     290     appInfoList.sort((a,b)=>{
     291       return b.firstInstallTime-a.firstInstallTime
     292     })
     293     log('最新安装的app是=%j',appInfoList[0])
     294 
     295 
     296 
     297 
     298     var packageName=appInfoList[0].packageName
     299     shell('am force-stop ' + packageName,true);
     300     return appInfoList[0].appName
     301   }
     302 
     303   common.启动最新安装的app=function (){
     304     var pm = context.getPackageManager()
     305     var appList=pm.getInstalledApplications(0)
     306     var appInfoList=[]
     307     for(let i=0;i<appList.size();i++){
     308       var app=appList.get(i)
     309       var appInfo={
     310         appName:app.loadLabel(pm),
     311         packageName:app.packageName,
     312         isSystemApp:app.isSystemApp(),
     313         firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
     314       }
     315       appInfoList.push(appInfo)
     316 
     317     }
     318     appInfoList.sort((a,b)=>{
     319       return b.firstInstallTime-a.firstInstallTime
     320     })
     321     log('最新安装的app是=%j',appInfoList[0])
     322 
     323 
     324 
     325 
     326     var packageName=appInfoList[0].packageName
     327     launch(packageName)
     328     return appInfoList[0].appName
     329   }
     330 
     331   common.点击输入框弹出输入法=function (window,view){
     332     view.on(
     333       "touch_down", function () {
     334         window.requestFocus();
     335         view.requestFocus();
     336       }
     337     )
     338     view.on(
     339       "key", function (keyCode,event) {
     340         if(event.getAction()==event.ACTION_DOWN && keyCode == keys.back){
     341           window.disableFocus()
     342           event.consumed=true
     343         }
     344         window.requestFocus();
     345         view.requestFocus();
     346       }
     347     )
     348 
     349   }
     350 
     351 
     352   common.使所有输入框点击时都能弹出输入法=function (window,inputBoxViewArr){
     353     for(let i=0;i<inputBoxViewArr.length;i++){
     354       var view=inputBoxViewArr[i]
     355       common.点击输入框弹出输入法(window,view)
     356     }
     357   }
     358 
     359 
     360 
     361   common.失去焦点=function (window){
     362     window.disableFocus()
     363   }
     364 
     365 
     366 
     367 
     368 
     369   common.是否root=function(){
     370     var r=shell("ls /system/bin",true).result.toString()
     371     if(r.length>50){
     372       return true
     373     }else{
     374       return false
     375     }
     376   }
     377   common.获取指定应用的版本号 = function (appName) {
     378     /**
     379      * 获取指定应用的版本号
     380      * @param {string} packageName 应用包名
     381      */
     382     function getPackageVersion(packageName) {
     383       importPackage(android.content);
     384       var pckMan = context.getPackageManager();
     385       var packageInfo = pckMan.getPackageInfo(packageName, 0);
     386       return packageInfo.versionName;
     387     }
     388     var packageName = getPackageName(appName);
     389     return getPackageVersion(packageName)
     390   }
     391 
     392 
     393   common.打开qq群名片=function (qq群号){
     394     app.startActivity({
     395        action: "android.intent.action.VIEW",
     396        data:"mqqapi://card/show_pslcard?card_type=group&uin="+qq群号,
     397        packageName: "com.tencent.mobileqq",
     398     });//打开qq群名片
     399 
     400 
     401   }
     402 
     403 
     404 
     405   common.打开qq名片=function (qq号){
     406     app.startActivity({
     407        action: "android.intent.action.VIEW",
     408        data:"mqqapi://card/show_pslcard?uin="+qq号,
     409        packageName: "com.tencent.mobileqq",
     410     });//打开qq名片
     411 
     412 
     413   }
     414 
     415   common.qq强制聊天=function (qq号){
     416     app.startActivity({
     417        action: "android.intent.action.VIEW",
     418        data:"mqq://im/chat?chat_type=wpa&version=1&src_type=web&uin="+qq号,
     419        packageName: "com.tencent.mobileqq",
     420     });//qq强制聊天
     421 
     422   }
     423 
     424   common.字节变为gbk中文 = function (bytesContent) {
     425     var str = new java.lang.String(bytesContent, "gbk")
     426     return str
     427   }
     428   common.最新安装的app = function () {
     429 
     430     var pm = context.getPackageManager()
     431     var appList=pm.getInstalledApplications(0)
     432     var appInfoList=[]
     433     for(let i=0;i<appList.size();i++){
     434       var app=appList.get(i)
     435       var appInfo={
     436         appName:app.loadLabel(pm),
     437         packageName:app.packageName,
     438         isSystemApp:app.isSystemApp(),
     439         firstInstallTime:pm.getPackageInfo(app.packageName,0).firstInstallTime
     440       }
     441       appInfoList.push(appInfo)
     442     }
     443     appInfoList.sort((a,b)=>{
     444       return b.firstInstallTime-a.firstInstallTime
     445     })
     446     log('最新安装的app是=%j',appInfoList[0])
     447     return appInfoList[0]
     448 
     449 
     450   }
     451   common.文件修改时间 = function (path) {
     452     var time=new java.io.File(files.path(path)).lastModified();
     453     return  time
     454   }
     455   common.文件大小 = function (path) {
     456     var size = new java.io.File(path).length()
     457     return size
     458   }
     459   common.字符串变字节 = function (string) {
     460     return new java.lang.String(string).getBytes();
     461   }
     462   common.日期加N天 = function (n) {
     463     var now = new Date();
     464     now.setDate(now.getDate()+n);
     465     return (now);
     466   }
     467   common.md5 = function (string) {
     468     return java.math.BigInteger(1,java.security.MessageDigest.getInstance("MD5")
     469     .digest(java.lang.String(string).getBytes())).toString(16);
     470   }
     471   common.是横屏还是竖屏 = function () {
     472     var a = (context.resources.configuration.orientation);
     473     if (a === 1) {
     474       toastLog("这是竖屏!!");
     475       return '竖屏'
     476     }
     477 
     478     else {
     479       toastLog("这是横屏!!");}
     480       return '横屏'
     481 
     482   }
     483   common.截图 = function (path) {
     484     var path=path || '/sdcard/1temp.png'
     485 
     486     var dd = shell("screencap -p "+path,true)
     487     var img
     488     if(dd.code ==0){
     489         img = images.read(path)
     490     }else{
     491         log("错误信息:")
     492         log(dd.error)
     493     }
     494     return img
     495 
     496 
     497   }
     498   common.随机字符=function (n){
     499     var n= n || 8
     500     var str="";
     501     for(var i=0;i<n;i++){
     502     str+=String.fromCharCode(random(0,65535));
     503     }
     504     return str;
     505     }
     506 
     507   common.获取时间=function (time) {
     508     if (time) {
     509         return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time));
     510     } else {
     511         return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
     512     }
     513   }
     514 
     515   common.调整手机音量=function (){
     516 
     517     var am = context.getSystemService(context.AUDIO_SERVICE)
     518     // STREAM_MUSIC这个自己试试,是调整那种音量,范围0-6  自己试试,我也不知道
     519     var STREAM_MUSIC = 1
     520     // 1 增大音量   -1  降低音量  0 不变
     521     var ADJUST_RAISE = -1
     522     //  1 显示调整音量界面   0  不显示界面
     523     var FLAG_SHOW_UI = 1
     524     am.adjustStreamVolume(STREAM_MUSIC, ADJUST_RAISE, FLAG_SHOW_UI)
     525 
     526 
     527     //获取最大音量
     528     var max = am.getStreamMaxVolume(STREAM_MUSIC);
     529     log(max)
     530     //获取当前音量
     531     toastLog('最大音量'+max)
     532     sleep(2000)
     533     var current = am.getStreamVolume(STREAM_MUSIC);
     534     log(current)
     535     toastLog('当前音量'+current)
     536 
     537   }
     538 
     539   common.微信扫一扫=function (){
     540     context.startActivity(app.intent({
     541       action: "VIEW",
     542       className:"com.tencent.mm.ui.LauncherUI",
     543       packageName:"com.tencent.mm",
     544       extras: {
     545           "LauncherUI.From.Scaner.Shortcut": true
     546       }
     547     }).setFlags(335544320));
     548   }
     549   common.公共字符串=function (str1,str2){
     550     // var str1 = "aaabbba"
     551     // var str2 = " bbbcaaa"
     552 
     553     function find(str1, str2) {
     554         //创建存放重复内容的数组
     555         var all = new Array();
     556         //字符串转字符数组
     557         var str_1 = str1.split("");
     558         var str_2 = str2.split("");
     559         for (var i = 0; i < str_1.length; i++) {
     560             for (var l = 0; l < str_2.length; l++) {
     561                 //判断是否重复
     562                 var lo = all.length;
     563                 all[lo] = "";
     564                 //判断之后的字符串是否相同
     565                 for (var k = 0; str_1[i + k] == str_2[l + k]; k++) {
     566                     all[lo] = all[lo] + str_1[i + k];
     567                     //防止数组越界,提前停止循环
     568                     if (i + k == str_1.length-1||i+k==str_2.length-1) {
     569                         break;
     570                     }
     571                 }
     572             }
     573         }
     574 
     575         var most = 0;
     576         var fu = new Array();
     577         for (var j = 0; j < all.length; j++) {
     578             //去除空的内容
     579             if (all[j] != "") {
     580                 //按照大小排序(删除部分小的)
     581                 if (all[j].split("").length >= most) {
     582                     most = all[j].split("").length;
     583                     fu[fu.length] = all[j];
     584                 }
     585             }
     586         }
     587 
     588         //将不重复内容写到新数组
     589         var wu=new Array();
     590         for(var i=0;i<fu.length;i++){
     591             var c=false;
     592             for(var l=0;l<wu.length;l++){
     593                 if(fu[i]==wu[l]){
     594                     c=true;
     595                 }
     596             }
     597             if(!c){
     598                 wu[wu.length]=fu[i];
     599             }
     600         }
     601 
     602         //将最长的内容写到新数组
     603         var ml=new Array();
     604         //获得最后一个字符串的长度(最长)
     605         var longest=wu[wu.length-1].split("").length;
     606         //长度等于最长的内容放到新数组
     607         for(var i=wu.length-1;i>=0;i--){
     608             if(wu[i].split("").length==longest){
     609                 ml[ml.length]=wu[i];
     610             }else{
     611                 //提前结束循环
     612                 break;
     613             }
     614         }
     615 
     616         return ml
     617     }
     618     var result=find(str1, str2)
     619     log(result)
     620     return result
     621   }
     622 
     623   common.网络=function (){
     624     var intent = new Intent();
     625     importClass(android.content.BroadcastReceiver);
     626     importClass(android.content.ContextWrapper);
     627     importClass(android.content.IntentFilter);
     628     importClass(android.net.ConnectivityManager);
     629     var filter = new IntentFilter();
     630     filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
     631     new ContextWrapper(context).registerReceiver(a = new BroadcastReceiver({
     632         onReceive: function(context, intent) {
     633           var action = intent.getAction();
     634             if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
     635               var mConnectivityManager = context.getSystemService(context.CONNECTIVITY_SERVICE);
     636                 netInfo = mConnectivityManager.getActiveNetworkInfo();
     637                 if (netInfo != null && netInfo.isAvailable()) {
     638 
     639                     /////////////网络连接
     640                     var name = netInfo.getTypeName();
     641 
     642                     if (netInfo.getType() == ConnectivityManager.TYPE_WIFI) {
     643                         /////WiFi网络
     644                         toastLog("WiFi网络");
     645                         return "WiFi网络"
     646                     } else if (netInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
     647                         /////有线网络
     648                         toastLog("有线网络");
     649                         return "有线网络"
     650 
     651                     } else if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
     652                         /////////3g网络
     653                         toastLog("3g网络");
     654                         return "3g网络"
     655 
     656                     }
     657                 } else {
     658                     ////////网络断开
     659                     toastLog("网络断开");
     660                     return "网络断开"
     661 
     662                 }
     663             }
     664 
     665         }
     666     }), filter);
     667 
     668   }
     669 
     670   common.安卓intent源码=function (){
     671     var intent = new Intent();
     672     intent.setAction("android.settings.ACCESSIBILITY_SETTINGS");
     673     //辅助功能
     674     //intent.setAction("android.settings.ADD_ACCOUNT_SETTINGS");
     675     //添加账户
     676     //intent.setAction("android.settings.AIRPLANE_MODE_SETTINGS");
     677     //系统设置首页
     678     //intent.setAction("android.settings.APN_SETTINGS");
     679     //APN设置
     680     //intent.setAction("android.settings.APPLICATION_SETTINGS");
     681     //应用管理
     682     //intent.setAction("android.settings.BATTERY_SAVER_SETTINGS");
     683     //节电助手
     684     //intent.setAction("android.settings.BLUETOOTH_SETTINGS");
     685     //蓝牙
     686     //intent.setAction("android.settings.CAPTIONING_SETTINGS");
     687     //字幕
     688     //intent.setAction("android.settings.CAST_SETTINGS");
     689     //无线显示
     690     //intent.setAction("android.settings.DATA_ROAMING_SETTINGS");
     691     //移动网络
     692     //intent.setAction("android.settings.DATE_SETTINGS");
     693     //日期和时间设置
     694     //intent.setAction("android.settings.DEVICE_INFO_SETTINGS");
     695     //关于手机
     696     //intent.setAction("android.settings.DISPLAY_SETTINGS");
     697     //显示设置
     698     //intent.setAction("android.settings.DREAM_SETTINGS");
     699     //互动屏保设置
     700     //intent.setAction("android.settings.HARD_KEYBOARD_SETTINGS");
     701     //实体键盘
     702     //intent.setAction("android.settings.HOME_SETTINGS");
     703     //应用权限,默认应用设置,特殊权限
     704     //intent.setAction("android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS");
     705     //忽略电池优化设置
     706     //intent.setAction("android.settings.INPUT_METHOD_SETTINGS");
     707     //可用虚拟键盘设置
     708     //intent.setAction("android.settings.INPUT_METHOD_SUBTYPE_SETTINGS");
     709     //安卓键盘语言设置(AOSP)
     710     //intent.setAction("android.settings.INTERNAL_STORAGE_SETTINGS");
     711     //内存和存储
     712     //intent.setAction("android.settings.LOCALE_SETTINGS");
     713     //语言偏好设置
     714     //intent.setAction("android.settings.LOCATION_SOURCE_SETTINGS");
     715     //定位服务设置
     716     //intent.setAction("android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS");
     717     //所有应用
     718     //intent.setAction("android.settings.MANAGE_APPLICATIONS_SETTINGS");
     719     //应用管理
     720     //intent.setAction("android.settings.MANAGE_DEFAULT_APPS_SETTINGS");
     721     //与ACTION_HOME_SETTINGS相同
     722     //intent.setAction("android.settings.action.MANAGE_OVERLAY_PERMISSION");
     723     //在其他应用上层显示,悬浮窗
     724     //intent.setAction("android.settings.MANAGE_UNKNOWN_APP_SOURCES");
     725     //安装未知应用 安卓8.0
     726     //intent.setAction("android.settings.action.MANAGE_WRITE_SETTINGS");
     727     //可修改系统设置 权限
     728     //intent.setAction("android.settings.MEMORY_CARD_SETTINGS");
     729     //内存与存储
     730     //intent.setAction("android.settings.NETWORK_OPERATOR_SETTINGS");
     731     //可用网络选择
     732     //intent.setAction("android.settings.NFCSHARING_SETTINGS");
     733     //NFC设置
     734     //intent.setAction("android.settings.NFC_SETTINGS");
     735     //网络中的 更多设置
     736     //intent.setAction("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
     737     //通知权限设置
     738     //intent.setAction("android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS");
     739     //勿扰权限设置
     740     //intent.setAction("android.settings.ACTION_PRINT_SETTINGS");
     741     //打印服务设置
     742     //intent.setAction("android.settings.PRIVACY_SETTINGS");
     743     //备份和重置
     744     //intent.setAction("android.settings.SECURITY_SETTINGS");
     745     //安全设置
     746     //intent.setAction("android.settings.SHOW_REGULATORY_INFO");
     747     //监管信息
     748     //intent.setAction("android.settings.SOUND_SETTINGS");
     749     //声音设置
     750     //intent.setAction("android.settings.SYNC_SETTINGS");
     751     //添加账户设置
     752     //intent.setAction("android.settings.USAGE_ACCESS_SETTINGS");
     753     //有权查看使用情况的应用
     754     //intent.setAction("android.settings.USER_DICTIONARY_SETTINGS");
     755     //个人词典
     756     //intent.setAction("android.settings.VOICE_INPUT_SETTINGS");
     757     //辅助应用和语音输入
     758     //intent.setAction("android.settings.VPN_SETTINGS");
     759     //VPN设置
     760     //intent.setAction("android.settings.VR_LISTENER_SETTINGS");
     761     //VR助手
     762     //intent.setAction("android.settings.WEBVIEW_SETTINGS");
     763     //选择webview
     764     //intent.setAction("android.settings.WIFI_IP_SETTINGS");
     765     //高级WLAN设置
     766     //intent.setAction("android.settings.WIFI_SETTINGS");
     767     //选择WIFI,连接WIFI
     768     app.startActivity(intent);
     769 
     770   }
     771 
     772   common.获取手机ip地理位置=function (){
     773     var ip地理位置 = false
     774     var ip地理位置正则 = /本机IP:&nbsp;d{1,3}.d{1,3}.d{1,3}.d{1,3}</span>([sS]*?)</td/
     775     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"
     776     var r = http.get(ipUrl);
     777     log("code = " + r.statusCode);
     778     var htmlResult = r.body.string()
     779     ip地理位置 = ip地理位置正则.exec(htmlResult)
     780     if (ip地理位置) {
     781       ip地理位置 = ip地理位置正则.exec(ip地理位置)
     782       ip地理位置 = ip地理位置[1]
     783       toastLog(ip地理位置)
     784       return ip地理位置
     785     } else {
     786       log('没有查询到Ip地理位置,脚本停止')
     787       return false
     788     }
     789 
     790   }
     791 
     792   common.获取app图标=function (appName){
     793     importClass(java.io.File);
     794     importClass(java.io.FileOutputStream);
     795     importClass(android.graphics.Bitmap);
     796     var pm = context.getPackageManager();
     797     importClass(android.util.DisplayMetrics)
     798     var name = appName
     799     var packageName = app.getPackageName(name);
     800     var appInfo = pm.getApplicationInfo(packageName, 0);
     801     var bmp = appInfo.loadIcon(pm).getBitmap();
     802     files.create("/sdcard/"+name+".jpg");
     803     var f = new File("/sdcard/"+name+"qq.jpg");
     804     var fOut = new FileOutputStream(f);
     805     bmp.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
     806     fOut.flush();
     807     fOut.close();
     808 
     809     var img=images.read("sdcard/"+name+".jpg")
     810     return img
     811     // app.viewFile("sdcard/"+name+".jpg")
     812   }
     813 
     814   common.替换系统文件 = function (syspath,sdpath) {
     815     // // var path = "/data/data/com.aaa.bbb"
     816     // // var pathSD = "/sdcard/com.aaa.bbb"
     817     // //删除原来的文件
     818     // shell('chown root:root ' + path, true)
     819     // shell('rm ' + path + " -rf", true);
     820     // shell('rm ' + pathSD + " -rf", true);
     821     // sleep(2000)
     822 
     823     // // 解压备份的文件
     824     // var inkeSdacrdPath = "/sdcard/com.aaa.bbb.zip"
     825     // var 文件路径 = inkeSdacrdPath
     826     // var 文件夹路径 = "/sdcard"
     827     // com.stardust.io.Zip.unzip(new java.io.File(文件路径), new java.io.File(文件夹路径))
     828     // sleep(2000)
     829 
     830     // //移动解压后的文件
     831     // shell("mv -f /sdcard/com.aaa.bbb /data/data/com.aaa.bbb", true);
     832 
     833     // //修改权限
     834     // shell("chmod -R 777 /data/data/com.aaa.bbb", true);
     835 
     836     //------------------------------------------------
     837     //------------------------------------------------
     838     //------------------------------------------------
     839     // var path = "/data/data/com.aaa.bbb"
     840     // var pathSD = "/sdcard/com.aaa.bbb"
     841     //删除原来的文件
     842     shell('chown root:root ' + syspath, true)
     843     shell('rm ' + path + " -rf", true);
     844     sleep(2000)
     845 
     846     //移动解压后的文件
     847     shell("mv -f "+sdpath+" "+syspath, true);
     848 
     849     //修改权限
     850     shell("chmod -R 777 "+syspath, true);
     851 
     852 
     853 
     854   }
     855 
     856   common.编辑距离 = function (sm,sn){
     857     var m=sm.length+1
     858     var n=sn.length+1
     859     var matrix = new Array();
     860     for ( var i = 0; i < m; i++) {
     861         matrix[i] = new Array();
     862         for ( var j = 0; j < n; j++) {
     863             matrix[i][j] = 0;
     864         }
     865     }
     866     matrix[0][0]=0
     867     for(let i=1;i<m;i++){
     868         matrix[i][0] = matrix[i-1][0] + 1
     869     }
     870     for(let j=1;j<n;j++){
     871         matrix[0][j] = matrix[0][j-1]+1
     872     }
     873     cost = 0
     874     for(let i=1;i<m;i++){
     875         for(let j=1;j<n;j++){
     876             if(sm[i-1]==sn[j-1]){
     877                 cost = 0
     878             }
     879             else{
     880                 cost = 1
     881             }
     882             matrix[i][j]=Math.min(matrix[i-1][j]+1,matrix[i][j-1]+1,matrix[i-1][j-1]+cost)
     883         }
     884     }
     885     return matrix[m-1][n-1]
     886     // var mindist=minEditDist("126","456")
     887     // print(mindist)
     888   }
     889   common.静默安装app = function (apk路径) {
     890     shell("pm install -r " + apk路径 , true)
     891   }
     892 
     893 
     894 
     895   common.获取手机上所有的app名字 = function () {
     896     var 所有的app名字=[]
     897     var pm=context.getPackageManager()
     898     let list=pm.getInstalledApplications(0)
     899     for(let i=0;i<list.size();i++){
     900       let p=list.get(i)
     901       var app={
     902         appName:p.loadLabel(pm),
     903         packageName:p.packageName
     904       }
     905       所有的app名字.push(app.appName)
     906     }
     907     return 所有的app名字
     908   }
     909   common.数组交集=function(){
     910 
     911     var 交集 = Array.intersect(arr1, arr2)
     912     log(交集)
     913     return 交集
     914   }
     915   common.控制app联网 = function (appName, 是否允许联网联网) {
     916     var 是否允许联网联网 = 是否允许联网联网 || true
     917     //作者: 家  QQ203118908
     918 
     919 
     920     //本来打算用iptables-restore用文件形式更新防火墙规则,
     921     //可是iptables-restore出现了bug,2013年就有人提过这个bug
     922     //https://linux.debian.bugs.dist.narkive.com/J0hbJiR6/bug-710379-xtables-addons-common-quota2-module-iptables-save-creates-invalid-record
     923     //又得改,坑爹
     924 
     925     //马丹,iptables -D INPUT -lineNumber也有BUG,
     926     //提示 index of deletion too big
     927     //日了够了
     928     //又得改,坑爹
     929     // sudo iptables -D OUTPUT 1 -t nat
     930     //
     931     // uid=`cat /data/system/packages.list | grep com.sohu.inputmethod.sogou | busybox awk '{print $2}'`
     932     // iptables -t filter -A OUTPUT -m owner --uid-owner=$uid -j DROP
     933 
     934     // 以上是android iptables 屏蔽某个app网络访问的内容,
     935 
     936     function 联网控制(appName) {
     937       // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
     938       // -A OUTPUT -m owner --uid-owner 10105 -j DROP
     939       this.等待shell执行完毕的时间 = 0
     940       this.防火墙规则路径 = '/sdcard/iptables.txt'
     941       this.uid路径 = '/sdcard/' + appName + 'uidOwner.txt'
     942       this.appName = appName
     943       this.packageName = getPackageName(this.appName)
     944       this.执行shell = (cmd) => {
     945         var result = shell(cmd, true);
     946         console.show();
     947         log(result);
     948         if (result.code == 0) {
     949           toastLog("执行成功");
     950         } else {
     951           toastLog("执行失败!请到控制台查看错误信息");
     952         }
     953         sleep(this.等待shell执行完毕的时间)
     954       }
     955       this.uid = () => {
     956         var cmd = 'cat /data/system/packages.list | grep ' + this.packageName + ' > ' + this.uid路径
     957         log('cmd=', cmd)
     958         this.执行shell(cmd)
     959         // cat /data/system/packages.list | grep com.tencent.mobileqq > /sdcard/QQuidOwner.txt
     960         var 包含uid的文本 = files.read('/sdcard/' + appName + 'uidOwner.txt')
     961         log('包含uid的文本=', 包含uid的文本)
     962         var uidReg = new RegExp(this.packageName + '\s*(\d+)')
     963         log('uidReg=', uidReg)
     964         var uid = 包含uid的文本.match(uidReg)[1]
     965         log(uid)
     966         return uid
     967       }
     968       this.允许联网规则 = 'iptables -t filter -A OUTPUT -m owner --uid-owner ' + this.uid() + ' -j ACCEPT'
     969       this.禁止联网规则 = 'iptables -t filter -A OUTPUT -m owner --uid-owner ' + this.uid() + ' -j DROP'
     970       this.允许 = () => {
     971         this.清空该app的防火墙规则()
     972         this.将防火墙规则写入系统(this.允许联网规则)
     973       }
     974       this.禁止 = () => {
     975         this.清空该app的防火墙规则()
     976         this.将防火墙规则写入系统(this.禁止联网规则)
     977       }
     978 
     979       this.将防火墙规则写入系统 = (防火墙规则) => {
     980         var cmd = 防火墙规则
     981         this.执行shell(cmd)
     982       }
     983       this.导出防火墙规则 = () => {
     984         var cmd = 'iptables-save > ' + this.防火墙规则路径
     985         this.执行shell(cmd)
     986       }
     987       this.防火墙规则 = () => {
     988         this.导出防火墙规则()
     989         var 防火墙规则 = files.read(this.防火墙规则路径)
     990         log('防火墙规则=', 防火墙规则)
     991         return 防火墙规则
     992       }
     993       this.清空该app的防火墙规则 = () => {
     994         var 防火墙规则 = this.防火墙规则()
     995         // stringObject.replace(regexp/substr,replacement)
     996         // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
     997         // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
     998         // -A OUTPUT -m owner --uid-owner 10105 -j DROP
     999         // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
    1000         // -A OUTPUT -m owner --uid-owner 10105 -j ACCEPT
    1001         // 删除之前添加的规则(iptables -A INPUT -s 192.168.1.5 -j DROP):
    1002         // [root@test ~]# iptables -D INPUT -s 192.168.1.5 -j DROP
    1003         // iptables -t filter -A OUTPUT -m owner --uid-owner=$uid -j DROP
    1004         var 要删除的规则reg = new RegExp('-A (OUT|IN)PUT -m owner --uid-owner ' + this.uid() + ' -j (ACCEPT|DROP)', 'g')
    1005         // 要删除的规则reg= /-A OUTPUT -m owner --uid-owner 10105 -j (ACCEPT|DROP)/
    1006         // -A OUTPUT -m owner --uid-owner 10105 -j (ACCEPT|DROP)
    1007         // iptables -D OUTPUT -m owner --uid-owner 10105 -j ACCEPT
    1008         log('要删除的规则reg=', 要删除的规则reg)
    1009         var new防火墙规则 = 防火墙规则.match(要删除的规则reg, '')
    1010         log('new防火墙规则=', new防火墙规则)
    1011         // new防火墙规则= [
    1012         //   '-A OUTPUT -m owner --uid-owner 10105 -j ACCEPT',
    1013         //   '-A OUTPUT -m owner --uid-owner 10105 -j DROP'
    1014         //               ]
    1015         if (new防火墙规则) {
    1016           for (let i = 0; i < new防火墙规则.length; i++) {
    1017             var 规则 = new防火墙规则[i]
    1018             规则 = 规则.replace('-A', '-D')
    1019             var cmd = 'iptables ' + 规则
    1020             this.执行shell(cmd)
    1021           }
    1022         }
    1023         log('清空了指定app的防火墙规则')
    1024       }
    1025     }
    1026     // var appName = 'QQ'
    1027     // var appName = '哔哩哔哩'
    1028     var appName = '微信'
    1029     var app联网控制 = new 联网控制(appName)
    1030     if (是否允许联网联网) {
    1031       app联网控制.允许()
    1032     } else {
    1033       app联网控制.禁止()
    1034     }
    1035 
    1036 
    1037   }
    1038   common.提取包含关键字的app = function (app关键字) {
    1039     importClass(android.content.pm.PackageManager)
    1040     var uc应用 = []
    1041     var ucapp = {}
    1042     pm = context.getPackageManager();
    1043     var 有的 = pm.getInstalledPackages(PackageManager.GET_SHARED_LIBRARY_FILES)
    1044     有的 = pm.getInstalledPackages(PackageManager.GET_META_DATA)
    1045     有的 = 有的 + ""
    1046     有的 = 有的.replace(/PackageInfo[^ ]+ /g, "")
    1047     有的 = 有的.replace(/[}|[|]| ]/g, "")
    1048     有的 = 有的.split(",")
    1049     for (let i of 有的) {
    1050       var packageInfo = pm.getPackageInfo(i, 0);
    1051       var appName = packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString()
    1052       //appName = app.getAppName(i)
    1053       if (appName.match(app关键字)) {
    1054         // log(appName)
    1055         // log("包名:" + i)
    1056         ucapp = {
    1057           "包名": i,
    1058           "名称": appName
    1059         }
    1060         uc应用.push(ucapp) 
    1061       }
    1062     }
    1063     return uc应用
    1064   }
    1065   common.卸载app没root = function (appName) {
    1066     var packageName=getPackageName(appName);
    1067     app.uninstall(packageName);
    1068 
    1069 
    1070   }
    1071 
    1072   common.获取页面所有文字 = function (setting) {
    1073     var setting = setting || {}
    1074     var defaultSetting = {
    1075       getText: true,
    1076       getDesc: true,
    1077       getId: false,
    1078       removeRepetitiveElements: true
    1079     }
    1080     Object.assign(defaultSetting, setting);
    1081     log(defaultSetting)
    1082     var allStr = []
    1083     var getDescAndTextAndIdOfNode = function (node) {
    1084       if (node) {
    1085         if (defaultSetting.getText) {
    1086           var text = node.text()
    1087           if (!!text) {
    1088             allStr.push(text)
    1089           }
    1090         }
    1091         if (defaultSetting.getDesc) {
    1092           var desc = node.desc()
    1093           if (!!desc) {
    1094             allStr.push(desc)
    1095           }
    1096         }
    1097         if (defaultSetting.getId) {
    1098           var id = node.id()
    1099           if (!!id) {
    1100             allStr.push(id)
    1101           }
    1102         }
    1103       }
    1104       for (let i = 0; i < node.childCount(); i++) {
    1105         getDescAndTextAndIdOfNode(node.child(i));
    1106       }
    1107     }
    1108     var getFrameLayoutNode = function () {
    1109       return className('FrameLayout').findOne(2000)
    1110     }
    1111     getDescAndTextAndIdOfNode(getFrameLayoutNode())
    1112 
    1113     function removeRepetitiveElements(arr) {
    1114       var obj = {}
    1115       for (let i = 0; i < arr.length; i++) {
    1116         if (obj.hasOwnProperty(arr[i])) {} else {
    1117           obj[arr[i]] = true
    1118         }
    1119       }
    1120       return Object.keys(obj)
    1121     }
    1122     if (defaultSetting.removeRepetitiveElements) {
    1123       allStr = removeRepetitiveElements(allStr)
    1124     }
    1125     return allStr
    1126   }
    1127 
    1128   common.悬浮控制 = function (window, windowid, ar) {
    1129     this.Orientation = context.resources.configuration.orientation;
    1130     this.Width = this.Orientation == 1 ? device.width : device.height;
    1131     this.Height = this.Orientation == 2 ? device.width : device.height;
    1132     this.Click = function () {};
    1133     this.Move = function () {};
    1134     this.LongClick = function () {};
    1135     this.setClick = (fun) => {
    1136       fun = fun || function () {};
    1137       this.Click = fun;
    1138     };
    1139     this.setMove = (fun) => {
    1140       fun = fun || function () {};
    1141       this.Move = fun;
    1142     };
    1143     this.setLongClick = (fun, ji) => {
    1144       fun = fun || function () {};
    1145       this.LongClick = fun;
    1146       if (parseInt(ji)) {
    1147         this.Tjitime = parseInt(ji) / 50;
    1148       };
    1149     };
    1150     setInterval(() => {
    1151       if (context.resources.configuration.orientation != this.Orientation) {
    1152         this.Orientation = context.resources.configuration.orientation;
    1153         this.Width = this.Orientation == 1 ? device.width : device.height;
    1154         this.Height = this.Orientation == 2 ? device.width : device.height;
    1155         var xy = this.windowGXY(window.getX(), window.getY(), this.G(window));
    1156         this.windowyidong([
    1157           [window.getX(), window.getY()],
    1158           [xy.x, xy.y]
    1159         ]);
    1160       };
    1161     }, 100);
    1162     this.TX = 0;
    1163     this.TY = 0;
    1164     this.Tx = 0;
    1165     this.Ty = 0;
    1166     this.Tyidong = false;
    1167     this.Tkeep = false;
    1168     this.Tjitime = 12;
    1169     this.Ttime = 0;
    1170     setInterval(() => {
    1171       if (this.Tkeep) {
    1172         this.Ttime++;
    1173         if (!this.Tyidong && this.Ttime > this.Tjitime) {
    1174           //非移动且按下时长超过1秒判断为长按
    1175           this.Tkeep = false;
    1176           this.Ttime = 0;
    1177           this.LongClick();
    1178         };
    1179       };
    1180     }, 50);
    1181     if (windowid) {
    1182       windowid.setOnTouchListener(new android.view.View.OnTouchListener((view, event) => {
    1183         this.Move(view, event);
    1184         switch (event.getAction()) {
    1185           case event.ACTION_DOWN:
    1186             this.Tx = event.getRawX();
    1187             this.Ty = event.getRawY();
    1188             this.TX = window.getX();
    1189             this.TY = window.getY();
    1190             this.Tkeep = true; //按下,开启计时
    1191             break;
    1192           case event.ACTION_MOVE:
    1193             var sx = event.getRawX() - this.Tx;
    1194             var sy = event.getRawY() - this.Ty;
    1195             if (!this.Tyidong && this.Tkeep && this.weiyi(sx, sy) >= 10) {
    1196               this.Tyidong = true;
    1197             };
    1198             if (this.Tyidong && this.Tkeep) {
    1199               window.setPosition(this.TX + sx, this.TY + sy);
    1200             };
    1201             break;
    1202           case event.ACTION_UP:
    1203             if (!this.Tyidong && this.Tkeep && this.Ttime < 7) {
    1204               this.Click();
    1205             };
    1206             this.Tkeep = false;
    1207             this.Ttime = 0;
    1208             if (this.Tyidong) {
    1209               var A = this.windowGXY(window.getX(), window.getY(), this.G(window));
    1210               threads.start(new java.lang.Runnable(() => {
    1211                 this.windowyidong([
    1212                   [window.getX(), window.getY()],
    1213                   [A.x, A.y]
    1214                 ]);
    1215               }));
    1216               this.Tyidong = false;
    1217             };
    1218             break;
    1219         };
    1220         return true;
    1221       }));
    1222     };
    1223     this.G = (win) => {
    1224       var K = 35, //悬浮窗的隐形边矩
    1225         H = 66; //手机通知栏的高度
    1226       if (!ar) {
    1227         return [
    1228           [-K, -K],
    1229           [this.Width - win.getWidth() + K, this.Height - win.getHeight() - H + K]
    1230         ];
    1231       } else {
    1232         return [
    1233           [0, H],
    1234           [this.Width - win.getWidth(), this.Height - win.getHeight()]
    1235         ];
    1236       };
    1237     };
    1238     this.weiyi = function () { //平方和开方
    1239       var num = 0;
    1240       for (var i = 0; i < arguments.length; i++) {
    1241         num += arguments[i] * arguments[i];
    1242       };
    1243       return Math.round(Math.sqrt(num) * 1000) / 1000
    1244     };
    1245     this.windowGXY = function (x, y, k) {
    1246       x = (k[0][0] < x && x < k[1][0]) ? x : (k[0][0] < x ? k[1][0] : k[0][0]);
    1247       y = (k[0][1] < y && y < k[1][1]) ? y : (k[0][1] < y ? k[1][1] : k[0][1]);
    1248       return {
    1249         x: x,
    1250         y: y
    1251       };
    1252     };
    1253     this.windowyidong = (A, s, w) => {
    1254       w = w || window;
    1255       s = s || 10;
    1256       var sx = A[1][0] - A[0][0],
    1257         sy = A[1][1] - A[0][1];
    1258       var sd = this.weiyi(sx, sy) / s;
    1259       var X = sx / sd,
    1260         Y = sy / sd;
    1261       var x = 0,
    1262         y = 0;
    1263       for (var i = 0; i < sd; i++) {
    1264         x += X;
    1265         y += Y;
    1266         sleep(1);
    1267         w.setPosition(A[0][0] + x, A[0][1] + y);
    1268       };
    1269       w.setPosition(A[1][0], A[1][1]);
    1270     };
    1271     this.OutScreen = () => {
    1272       var F = this.G(window);
    1273       var x = window.getX(),
    1274         y = window.getY();
    1275       var sx = window.getX() + window.getWidth() / 2,
    1276         sy = window.getY() + window.getHeight() / 2 + 66;
    1277       var cx = Math.abs(sx < (this.Width - sx) ? sx : (this.Width - sx)) < Math.abs(sy < (this.Height - sy) ? sy : (this.Height - sy)) ? (sx < this.Width / 2 ? (F[0][0] - window.getWidth()) : (F[1][0] + window.getWidth())) : x,
    1278         cy = Math.abs(sx < (this.Width - sx) ? sx : (this.Width - sx)) < Math.abs(sy < (this.Height - sy) ? sy : (this.Height - sy)) ? y : (sy < this.Height / 2 ? (F[0][1] - window.getHeight()) : (F[1][1] + window.getHeight()));
    1279       return [
    1280         [x, y],
    1281         [cx, cy]
    1282       ];
    1283     };
    1284     this.toScreenEdge = (d) => {
    1285       d = d || 0;
    1286       var F = this.G(window);
    1287       var x = window.getX(),
    1288         y = window.getY();
    1289       var sw = window.getWidth() * d;
    1290       var sx = window.getX() + window.getWidth() / 2,
    1291         sy = window.getY() + window.getHeight() / 2 + 66;
    1292       var cx = sx < (this.Width - sx) ? -sw : (this.Width + sw - window.getWidth());
    1293       return [
    1294         [x, y],
    1295         [cx, y]
    1296       ];
    1297     };
    1298     this.centerXY = (F) => {
    1299       var w = window.getWidth();
    1300       var h = window.getHeight();
    1301       return [
    1302         [F[0] + w / 2, F[1] + h / 2],
    1303         [F[0] - w / 2, F[1] - h / 2]
    1304       ];
    1305     };
    1306     this.autoIntScreen = () => {
    1307       var A = this.windowGXY(window.getX(), window.getY(), this.G(window));
    1308       threads.start(new java.lang.Runnable(() => {
    1309         this.windowyidong([
    1310           [window.getX(), window.getY()],
    1311           [A.x, A.y]
    1312         ]);
    1313       }));
    1314     };
    1315     this.autoIntScreen();
    1316   };
    1317 
    1318 
    1319   common.闪光弹 = function (content, x, y, color, t) {
    1320 
    1321 
    1322 
    1323 
    1324     var single = (function () {
    1325       var unique;
    1326 
    1327       function getInstance() {
    1328         if (unique === undefined) {
    1329           unique = new Flash();
    1330         }
    1331         return unique;
    1332       }
    1333       return {
    1334         getInstance: getInstance
    1335       }
    1336     })();
    1337 
    1338     function Flash() {}
    1339     Flash.prototype.update = function (content, x, y, color, t) {
    1340       this.content = content || '未传入参数'
    1341       this.x = x || random(100, 300)
    1342       this.y = y || random(100, 900)
    1343       this.color = color || -2278181
    1344       this.t = t || 2000
    1345     }
    1346     Flash.prototype.show = function () {
    1347       var window = floaty.rawWindow( <card cardBackgroundColor = "#aa00FF00"
    1348         cardCornerRadius = "18dp" >
    1349         <text id = "text"
    1350         size = "30dp"
    1351         layout_width = "wrap_content"
    1352         layout_height = "wrap_content"
    1353         layout_gravity = "center"
    1354         gravity = "center"
    1355         paddingLeft = "10"
    1356         paddingRight = "10"
    1357         paddingTop = "10"
    1358         paddingBottom = "10" > 123 </text> </card>
    1359       );
    1360       window.text.setText(this.content);
    1361       window.text.setBackgroundColor(this.color);
    1362       window.setPosition(this.x, this.y);
    1363       setTimeout(() => {
    1364         window.close();
    1365       }, this.t);
    1366     }
    1367 
    1368     function flash(content, x, y, color, t) {
    1369       var content = content.toString()
    1370       var f = single.getInstance()
    1371       f.update(content, x, y, color, t)
    1372       f.show()
    1373     }
    1374     var color = color || colors.rgb(random(0, 255), random(0, 255), random(0, 255))
    1375     flash(content, x, y, color, t);
    1376     // flash('hello world')
    1377     // flash('Are you ok?')
    1378     // flash('我很好')
    1379     // flash('you are beautiful')
    1380 
    1381 
    1382 
    1383 
    1384   }
    1385   common.打开开发者选项 = function () {
    1386     app.startActivity({
    1387       action: "android.intent.action.VIEW", //此处可为其他值
    1388       packageName: "com.android.settings",
    1389       className: "com.android.settings.Settings$DevelopmentSettingsActivity"
    1390       //此处可以加入其他内容,如data、extras
    1391     });
    1392   }
    1393 
    1394 
    1395   common.气泡 = function (msg, x, y) {
    1396     function toastAt0(msg, x, y) {
    1397       importClass(android.widget.Toast);
    1398       importClass(android.view.Gravity);
    1399       var toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
    1400       toast.setGravity(Gravity.TOP | Gravity.LEFT, x, y);
    1401       toast.show();
    1402     }
    1403     var x = x || device.width / 3
    1404     var y = y || device.height / 5 * 4
    1405     var msg = msg.toString()
    1406     ui.run(() => toastAt0(msg, x, y));
    1407     sleep(2000)
    1408 
    1409     // toastAt('sdfsfdsdfs',300,300)
    1410 
    1411 
    1412 
    1413 
    1414   }
    1415 
    1416 
    1417 
    1418 
    1419 
    1420 
    1421 
    1422 
    1423 
    1424 
    1425 
    1426 
    1427   common.随机字符串 = function (PassLength) {
    1428     var PassLength = PassLength || 8
    1429     var str = 'abcdefghijklmnopqrstuvwxyz';
    1430     var STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    1431     var num = '0123456789';
    1432     var sym = '+=-@#~,.[]()!%^*$';
    1433     var text = str.split('').concat(STR.split(''))
    1434     var pw = '';
    1435     for (i = 0; i < PassLength; i++) {
    1436       var strpos = random(0, text.length - 1);
    1437       pw += text[strpos].charAt(random(0, text[strpos].length - 1));
    1438     }
    1439     return pw;
    1440   }
    1441 
    1442   common.wifi状态 = function () {
    1443 
    1444     importPackage(android.content);
    1445     let wifiManager = context.getSystemService(Context.WIFI_SERVICE);
    1446     if (wifiManager.isWifiEnabled()) {
    1447       log('wifi is opend')
    1448       return 'open'
    1449     } else {
    1450       log('wifi is closed')
    1451       return 'close'
    1452     }
    1453 
    1454 
    1455   }
    1456 
    1457 
    1458   common.开关飞行模式 = function (开关) {
    1459     // 0 关闭 1开启  默认开启飞行模式
    1460     var 开关 = 开关 || 1
    1461 
    1462     function 打开飞行模式() {
    1463       // 打开飞行模式
    1464       new Shell().exec("su -c 'settings put global airplane_mode_on 1; am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true'")
    1465     }
    1466 
    1467     function 关闭飞行模式() {
    1468       //关闭飞行模式
    1469       new Shell().exec("su -c 'settings put global airplane_mode_on 0; am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false'")
    1470     }
    1471     if (开关 == 1) {
    1472       打开飞行模式()
    1473     } else {
    1474       关闭飞行模式()
    1475     }
    1476 
    1477   }
    1478 
    1479   common.上滑 = function () {
    1480     var randomP = random(500, 600);
    1481     var points = [randomP];
    1482     var interval = 0.1;
    1483     var x0 = random(780, 900);
    1484     var y0 = random(1500, 1600);
    1485     var a = 240;
    1486     for (var t = 0; t < Math.PI / 2; t += interval) {
    1487       var x = x0 - a * (1.8 * Math.cos(t * 0.9) - Math.cos(2 * t * 0.9));
    1488       var y = y0 - a * (5 * Math.sin(t * 0.9) - Math.sin(2 * t * 0.9));
    1489       points.push([parseInt(x), parseInt(y)]);
    1490     }
    1491     gesture.apply(null, points);
    1492     sleep(1500);
    1493   }
    1494 
    1495   common.获取deflate网页内容 = function (url) {
    1496     importClass('java.io.BufferedReader');
    1497     importClass('java.io.InputStreamReader');
    1498     importClass("java.util.zip.InflaterInputStream")
    1499     importClass('java.io.ByteArrayInputStream');
    1500     importClass("java.util.zip.Inflater")
    1501 
    1502     var res = http.get(url)
    1503     log("statusCode = " + res.statusCode);
    1504     var deflateFileContent = res.body.bytes()
    1505     var 网页内容 = null;
    1506     if (deflateFileContent) {
    1507       var br = new BufferedReader(new InputStreamReader(new InflaterInputStream(new ByteArrayInputStream(deflateFileContent), new Inflater(true))));
    1508       var lns = [],
    1509         cl;
    1510       while (cl = br.readLine()) lns.push(cl);
    1511       网页内容 = lns.join("
    ")
    1512       // log('网页内容')
    1513       // log(网页内容)
    1514       return 网页内容
    1515     } else {
    1516       console.error('下载失败')
    1517       exit()
    1518     }
    1519     return false
    1520   }
    1521 
    1522   common.获取gzip网页内容 = function (url) {
    1523     function 保存zip文件(zipFile) {
    1524       var path = files.join(files.cwd(), "1下载bilibili弹幕专用/webPage.gzip.js")
    1525       files.createWithDirs(path)
    1526       log("path=", path)
    1527       // path= /storage/emulated/0/脚本/zip文件专用/test.zip
    1528       files.writeBytes(path, zipFile)
    1529       var r = 解压zip文件(path)
    1530       log(r)
    1531       return r
    1532     }
    1533 
    1534     function 解压zip文件(文件路径) {
    1535       //同一目录下的同一文件名
    1536       // unzipGzipFile(sourceGzipFilePath, targetPath)
    1537       var fileName = files.getName(文件路径)
    1538       var 解压后的文件路径 = 文件路径.replace(fileName, 'webPage.js')
    1539       log('解压的解压后的文件路径=', 解压后的文件路径)
    1540       files.createWithDirs(解压后的文件路径)
    1541       // com.stardust.io.Zip.unzip(new java.io.File(文件路径), new java.io.File(解压后的文件路径))
    1542       var sourceGzipFilePath = 文件路径
    1543       var targetPath = 解压后的文件路径
    1544       unzipGzipFile(sourceGzipFilePath, targetPath)
    1545       return targetPath
    1546     }
    1547 
    1548     function unzipGzipFile(sourceGzipFilePath, targetPath) {
    1549       importClass(java.io.FileInputStream);
    1550       importClass(java.util.zip.GZIPInputStream);
    1551       importClass('java.io.FileOutputStream');
    1552 
    1553       var sourceGzipFilePath = sourceGzipFilePath || '/sdcard/tempSourceGzipFilePath.js'
    1554       var targetPath = targetPath || '/sdcard/tempTargetPath.js'
    1555       log('sourceGzipFilePath')
    1556       log(sourceGzipFilePath)
    1557       log('targetPath')
    1558       log(targetPath)
    1559       var sChunk = 8192;
    1560       var gzipFileInputStream = new FileInputStream(sourceGzipFilePath);
    1561       var zipin = new GZIPInputStream(gzipFileInputStream);
    1562       var buffer = util.java.array('byte', sChunk)
    1563       var out = new FileOutputStream(targetPath);
    1564       var length;
    1565       while ((length = zipin.read(buffer, 0, sChunk)) != -1)
    1566         out.write(buffer, 0, length);
    1567       out.close();
    1568       zipin.close();
    1569     }
    1570     var res = http.get(url)
    1571     log("statusCode = " + res.statusCode);
    1572     var gzipFileContent = res.body.bytes()
    1573     var 网页内容 = null;
    1574     if (gzipFileContent) {
    1575       var 网页保存路径 = 保存zip文件(gzipFileContent)
    1576       网页内容 = files.read(网页保存路径)
    1577       // log('网页内容')
    1578       // log(网页内容)
    1579       return 网页内容
    1580     } else {
    1581       console.error('下载失败')
    1582       exit()
    1583     }
    1584     return false
    1585   }
    1586 
    1587 
    1588   // var r=common
    1589   // log(r)
    1590   // var arr=[]
    1591   // for(var k in common){
    1592   //   arr.push(k)
    1593   // }
    1594   // log(arr)
    1595 
    1596 
    1597   module.exports = common

    说明

    本文转自https://blog.csdn.net/feiyunjs/article/details/94722766

    本文提供的代码仅供参考。
    可能有些地方在最新版本的Auto.js上面需要做修改,才能运行。

    Auto.js简介

    Auto.js是利用安卓系统的“辅助功能”实现类似于按键精灵一样,可以通过代码模拟一系列界面动作的辅助工作。
    与“按键精灵”不同的是,它的模拟动作并不是简单的使用在界面定坐标点来实现,而是类似与win一般,找窗口句柄来实现的。

    Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。

    开发文档

    Auto.js Pro开发文档优化版
    文档尚在完善中,可能有文档描述和代码实际行为有出入的情况。
    模板、样式、generator来自Node.js。

    吸引我使用Auto.js Pro的原因有很多。最主要的几个原因是:

    • Auto.js Pro能开发免ROOT的安卓脚本
    • Auto.js Pro基于节点操作,能开发全分辨率的脚本,自动适配各种安卓机型
    • Auto.js Pro丰富的UI组件,能自定义各种样式的安卓界面
    • Auto.js Pro使用的javascript的语法比较优雅,代码可读性强
    • Auto.js Pro的命令库非常的丰富,接口比较多
    • Auto.js Pro脚本文件体积比较小。1000行的代码,打包后的apk文件只有3-5M,还没有广告
    • 相关教程
    • Auto.js Pro安卓全分辨率免ROOT引流脚本开发教程

  • 相关阅读:
    spring security 获取当前用户
    spring data jpa deleteInBatch 导致异常 java.lang.StackOverflowError
    大数据 分布式文件系统 HDFS概念
    angular9 ng start正常,build部署后无法正常加载页面
    springboot使用rocketmq RocketMQMessageListener参数
    spring boot使用rocketmq
    Teamcenter RAC 调用查询
    Teamcenter RAC 查找数据集并获取数据集中文件
    带有编译时和运行时的简记
    前台线程和后台线程、线程安全
  • 原文地址:https://www.cnblogs.com/Dumb-dog/p/11872365.html
Copyright © 2011-2022 走看看