手机上的aotujs代码,主要利用截图手机屏幕转换byte[]数据用tcpip传输到电脑配合java框架jframe显示手机实时界面等


importClass(java.net.InetAddress);
importClass(java.net.Socket);
importClass(java.net.ServerSocket);
importClass(java.io.OutputStream);
importClass(java.io.InputStream);
importClass(java.io.IOException);
importClass(java.io.OutputStreamWriter);
importClass(java.io.InputStreamReader);
importClass(android.content.Context);
importClass(android.net.wifi.WifiInfo);
importClass(android.net.wifi.WifiManager);
importClass(java.io.ByteArrayOutputStream);/*** 自动获取截屏权限*/
auto.waitFor();
threads.start(function(){let bu = text("立即开始").findOne(1000);if(bu != null){bu.click();}else if(bu = text("允许").findOne(1000)){bu.click();}});
if(!requestScreenCapture()){//截屏权限exit();
}
sleep(2000);
//一直保持屏幕常亮
// device.keepScreenOn();var ser1 = null;
var soc1 = null;
var output = null;
var input = null;
var boo = false;let dimg = (new Canvas(device.width, device.height)).toImage();//对比图,意思上一张图片
let bx = 0;
let by = 0;
let bw = device.width/4;
let bh = device.height/8;
let bi = 0;let ds = 0;
let setw = device.width;
let seth = device.height;let bunisboo = 0;//是否按下
let bunxyarr = new Array(1000);while(true){let tk = new Date().getTime();if(!boo){linknet();threads.start(function(){while(boo){try {var str4 = input.read();var yg = String.fromCharCode(str4);if(yg=="\n"){getcaozuo(input);} } catch (error) {log(error);output.close();input.close();soc1.close();ser1.close();log("操作线程错误");}}});}if(ds==0){let th = threads.start(function(){let timg = captureScreen();try {ds = 1;timg = images.resize(timg, [setw, seth]);//480,960} catch (error) {}sendimg(timg, 0, 0);ds = 0;timg.recycle();});let ttime = new Date().getTime();th.join(20);let tb = new Date().getTime() - ttime;if(tb<20){sleep(20-tb);}}
}//发送图片
function sendimg(simg, mx,my){try {let imgt = images.toBytes(simg, "jpg", 90);output.write(xm(imgt.length+","+ mx +","+ my +"\r\n\r\n"));//图像大小,位置output.write(imgt);imgt = [0];} catch (error) {log("发送失败");boo = false;}
}//链接网络wifi
function linknet(){var ip = getIP();log("服务已准备,等待链接端口 3587 ip="+ip);log("屏幕大小:" + device.width + "*" + device.height);try {if(ser1 != null){try {(new Socket(InetAddress.getByName(ip),3587)).close();log("尝试断开,释放");} catch (error) {log(error);log("尝试断开,释放");}ser1.close();log("关闭服务器");}ser1 = new ServerSocket(3587, 1,InetAddress.getByName(ip));//端口被占用没有释放 "192.168.107.227"} catch (error) {log(error);sleep(3000);toastLog("服务器创建失败,3秒后重试")return 0 ;}toastLog("服务器重建成功,等待链接");try {if(soc1 != null){soc1.close();}soc1 = ser1.accept();//等待客户接入服务器} catch (error) {log(error);toastLog( "ser1.accept(),异常");sleep(10*1000);return 0 ;}output = soc1.getOutputStream();input = new InputStreamReader(soc1.getInputStream(),"utf-8");boo = true;toastLog("链接成功");
}//接收操作指令数据
function getcaozuo(inr){log("操作指令运行,等待链接");try {var stt ="";var bl = 0 ;while(bl!=-1){bl = inr.read();if(bl!=-1){var yg = String.fromCharCode(bl);// log("接收字符:"+yg);if(yg=="\n"){log("接收指令:"+stt);var tb = stt.split(",");if(tb[0]==101){press(tb[1], tb[2], tb[5]);}if(tb[0]==102){swipe(tb[1],tb[2],tb[3],tb[4],tb[5]);}if(tb[0]==103 ){// threads.start(function(){//     let a = parseInt(tb[3]) , b = parseInt(tb[4]);//     swipe(tb[1],tb[2],tb[3],tb[4],tb[5]);// });}if(tb[0]==105){setw = tb[1];seth = tb[2];}if(tb[0]==107){log("按下");bunisboo=1;}if(tb[0]==108){log("释放");bunisboo=0;}if(tb[0]==110){window.setPosition(tb[1],parseInt(tb[2])-110);}// log("接收指令:"+stt);return ;}stt += yg;}}} catch (error) {log(error);log("操作错误");}
}//字符串转字节数组
function xm(str) {  var ch, st, re = []; for (var i = 0; i < str.length; i++ ) { ch = str.charCodeAt(i);  // get char  st = [];                 // set up "stack"  do {  st.push( ch & 0xFF );  // push byte to stack  ch = ch >> 8;          // shift value down by 1 byte  } while ( ch ); re = re.concat( st.reverse() ); }  // return an array of bytes  return re;
} //获取本机ip
function getIP(){var ip = "";// 获取WiFi服务var wifiManager = context.getSystemService(Context.WIFI_SERVICE);// 判断WiFi是否开启if (wifiManager.isWifiEnabled()) {// 已经开启了WiFivar wifiInfo = wifiManager.getConnectionInfo();var ipAddress = wifiInfo.getIpAddress();ip = (ipAddress & 0xFF) + "." +((ipAddress >> 8) & 0xFF) + "." +((ipAddress >> 16) & 0xFF) + "." +(ipAddress >> 24 & 0xFF);;return ip;}return null ;
}

电脑
代码实现接受图片进行显示,监听鼠标操作发送手机执行点击,滑动操作

package frame;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;public class AFrame extends JFrame implements MouseListener,MouseMotionListener,WindowListener{/**手机上创建服务器*电脑去链接手机的这个服务器套接字,进行接收图片,端口3587*手机上创建服务器接收电脑发送过去的点击操作指令,端口3587*端口套接字在电脑操作手机有数据时进行短暂链接* */String ip = "192.168.1.95";//本机ip,无用int port = 3587;/String deviceip ="";Socket socket =null;InputStream input = null;PaintImg pi;//绘制图片long time1 = new Date().getTime();//鼠标按下时间long time2 = new Date().getTime();//鼠标按下时间int ex = 0, ey =0;//鼠标按下坐标int eb = 0 ; //鼠标按下的建double w = 1080 , h = 2340;//设备尺寸double rx = w/(AFrame.this.getContentPane().getWidth());double ry = h/(AFrame.this.getContentPane().getHeight());boolean boo = true;OutputStreamWriter out = null;int tu = 0;long ttm = new Date().getTime();boolean bok;//正在转码显示中int ti=0;//记录掉帧String tb = "";//显示掉帧String str = "";String[] stra;long tl1 = 0;boolean bgk;//横竖ByteArrayOutputStream bn = new ByteArrayOutputStream(1024*500);byte[] bk  = new byte[1024*500];Image age = null;ImageIcon iicon = null;BufferedImage bimg = new BufferedImage(480, 960, BufferedImage.TYPE_INT_ARGB);Graphics2D g2img = bimg.createGraphics();//鼠标按下标志boolean boo_mousepress = false;double tcm = 0;boolean tuotuo;public AFrame(String deviceip , String w, String h, boolean bgk) {this.deviceip = deviceip;this.w = Integer.parseInt(w);this.h = Integer.parseInt(h);this.bgk = bgk;setIconImage(new ImageIcon("src/frame/999.jpg").getImage());setTitle("设备:"+deviceip);if(bgk) {setSize(360, 720);}else {setSize(900, 480);}setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);getContentPane().add(pi=new PaintImg());pi.addMouseListener(this);pi.addMouseMotionListener(this);addWindowListener(this);new Thread(new Runnable() {public void run() {while(boo) {try {System.out.println("正在链接"+deviceip);socket = new Socket(InetAddress.getByName(deviceip), port);System.out.println("链接成功");input = socket.getInputStream();out = new OutputStreamWriter(socket.getOutputStream(), "utf-8");} catch (UnknownHostException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}soc();}}}).start();}//链接服务器,接收图像public void soc() {try {while(boo) {tl1 = new Date().getTime();byte[] b = new byte[1024];int a = 0;while(a<b.length) {//a += input.read(b, a, b.length-a);}str = new String(b);
//              System.out.println("接受的数据头: "+str);//\r\n\r\n,区分图片大小,头文件数据str = str.substring(0,str.indexOf("\r\n\r\n"));stra = str.split(",");
//              System.out.println("大小"+stra[0] + "\n");
//              System.out.println("位置" + stra[1] + "," + stra[2]);int nx = Integer.parseInt(stra[1]), ny = Integer.parseInt(stra[2]);int l = Integer.parseInt(stra[0]);//设备发送过来的图片大小
//              System.out.println("图像大小:"+l);
//              ByteArrayOutputStream bn = new ByteArrayOutputStream();int u = str.getBytes().length+4;//图片大小占用大小int lw = b.length-u;//剪掉图片大小信息占用的剩余图文信息bn = new ByteArrayOutputStream();bn.write(b,u,b.length-u);//写入剩余图文信息while(lw<l && a!=-1) {b = new byte[l-lw];a = input.read(b,0 , b.length);if(a!=-1) {bn.write(b,0,a);lw += a;
//                      System.out.println("大小"+l +"\t写入"+lw);}b = null;}
//              System.out.println("实际写入" + lw);lw = 0;a = 0;bk = bn.toByteArray();iicon = new ImageIcon(bk);age = iicon.getImage();
//              System.out.println(bimg.getWidth()+","+age.getHeight(null));if(bimg.getWidth() != age.getWidth(null) && bimg.getWidth()!= age.getHeight(null)) {bimg = new BufferedImage(age.getWidth(null), age.getHeight(null), Image.SCALE_DEFAULT);g2img = bimg.createGraphics();}g2img.drawImage(age, nx, ny, null);//绘制图片pi.setImg();//绘制图片ageage = null;iicon = null;str = null;stra = null;bk = null;bn = null;}} catch (NumberFormatException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//绘制图片class PaintImg extends JPanel{//      Image img = null;long tm = 0;long tm1 = 0;int tm2 = 0;int tm3 = 0;String zs = "";//显示帧数public void setImg() {//Image imglong j = new Date().getTime()-tm;tm = new Date().getTime();zs = "间隔"+j+"/ms";j = 0;this.repaint();}@Overridepublic void paint(Graphics g) {super.paint(g);if(bgk) {//竖屏ageg.drawImage(bimg, 0, 0, AFrame.this.getContentPane().getWidth(), AFrame.this.getContentPane().getHeight(),  this);g.setColor(Color.yellow);g.setFont(new Font("黑体", Font.BOLD, 20));g.drawString(zs+tb, 10, 20);}else {//横屏g.setColor(Color.yellow);g.setFont(new Font("黑体", Font.BOLD, 20));Graphics2D g2= (Graphics2D)g;int centerx = 0;int centery = AFrame.this.getContentPane().getHeight();g.drawString(zs+tb, centerx, centery);g2.rotate((-Math.PI/2)*1,centerx, centery);//坐标原点旋转90度
//              g.drawString(zs+tb, centerx, centery);g2.drawImage(bimg, centerx,centery, AFrame.this.getContentPane().getHeight(),  AFrame.this.getContentPane().getWidth(),  AFrame.this);
//              System.out.println(AFrame.this.getContentPane().getHeight() + "," + AFrame.this.getContentPane().getWidth());g2.rotate((Math.PI/2)*1,centerx, centery);//坐标原点旋转90度g.drawString(zs+tb, 10, 20);
//              g.drawString(zs+tb, centerx, centery);}}}@Overridepublic void mouseClicked(MouseEvent e) {}@Overridepublic void mousePressed(MouseEvent e) {if(e.getButton()==1) {//          sendtxt("107,"+getWidth() + "," + getHeight() + "\n");time1 = new Date().getTime();//鼠标按下时间time2 = new Date().getTime();//鼠标按下时间if(bgk) {rx = this.w/(AFrame.this.getContentPane().getWidth());ry = this.h/(AFrame.this.getContentPane().getHeight());ex = (int)((e.getX())*rx);ey = (int)((e.getY())*ry);}else {rx = this.h/(AFrame.this.getContentPane().getWidth());ry = this.w/(AFrame.this.getContentPane().getHeight());ex = (int)((e.getX())*rx);ey = (int)w - (int)((e.getY())*ry);}boo_mousepress = true;tcm = 0;if(bimg.getWidth() != getWidth()) {sendtxt("105,"+getWidth() + "," + getHeight() + "\n");}}}@Overridepublic void mouseReleased(MouseEvent e) {int x = (int)((e.getX())*rx);int y = (int)((e.getY())*ry);if(bgk) {rx = this.w/(AFrame.this.getContentPane().getWidth());ry = this.h/(AFrame.this.getContentPane().getHeight());x = (int)((e.getX())*rx);y = (int)((e.getY())*ry);}else {rx = this.h/(AFrame.this.getContentPane().getWidth());ry = this.w/(AFrame.this.getContentPane().getHeight());x = (int)((e.getX())*rx);y = (int)w - (int)((e.getY())*ry);}if(e.getButton()==1) {//          sendtxt("108,"+getWidth() + "," + getHeight() + "\n");if(x==ex && y==ey) {tcm = new Date().getTime()-time1;if(bgk) {String tr = "101,"+ x+","+y+","+x+","+y+","+(tcm)+",\n";sendtxt(tr);}else {String tr = "101,"+ y+","+x+","+y+","+x+","+(tcm)+",\n";sendtxt(tr);}}else {tcm = new Date().getTime()-time1;if(bgk) {String tr = "102,"+ ex+","+ey+","+x+","+y+","+(tcm)+",\n";sendtxt(tr);}else {String tr = "102,"+ ey+","+ex+","+y+","+x+","+(tcm)+",\n";sendtxt(tr);}}boo_mousepress = false;tuotuo = false;}}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}@Overridepublic void windowOpened(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void windowClosing(WindowEvent e) {System.out.println("关闭该通道");boo = false;System.gc();}@Overridepublic void windowClosed(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void windowIconified(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void windowDeiconified(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void windowActivated(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void windowDeactivated(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void mouseDragged(MouseEvent e) {}@Overridepublic void mouseMoved(MouseEvent e) {int x = (int)((e.getX())*rx);int y = (int)((e.getY())*ry);//横屏竖屏切换if(bgk) {rx = this.w/(AFrame.this.getContentPane().getWidth());ry = this.h/(AFrame.this.getContentPane().getHeight());}else {rx = this.h/(AFrame.this.getContentPane().getHeight());ry = this.w/(AFrame.this.getContentPane().getWidth());x = (int)((e.getY())*rx);y = (int)((e.getX())*ry);}
//      }//从套接字中获取输出流,写入操作数据public void sendtxt(String datstr) {try {out.write("\n"+datstr);out.flush();System.out.println("发送操作数据;\n"+datstr);} catch (IOException e) {e.printStackTrace();}}}

主窗体类

package frame;import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;public class MFrame extends JFrame {JTextField jt1 = new JTextField("192.168.248.153x1080x2400");//手机ipJButton jb = new JButton("竖屏链接");JButton jb1 = new JButton("横屏链接");public MFrame() {setTitle("输入设备ip");setIconImage(new ImageIcon("src/frame/999.jpg").getImage());setSize(650, 120);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Container c = getContentPane();c.setLayout(null);jt1.setBounds(10, 10, 400, 50);jt1.setFont(new Font("黑体", Font.BOLD, 25));c.add(jt1);jb.setBounds(420, 10, 100, 50);c.add(jb);jb.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {new Thread(new Runnable() {public void run() {String[] tr = jt1.getText().split("x");new AFrame(tr[0], tr[1], tr[2], true).setVisible(true);;}}).start();}});jb1.setBounds(530, 10, 100, 50);c.add(jb1);jb1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {new Thread(new Runnable() {public void run() {String[] tr = jt1.getText().split("x");new AFrame(tr[0], tr[1], tr[2], false).setVisible(true);;}}).start();}});}public static void main(String[] args) {new MFrame().setVisible(true);}}

autojs与java开发的手机投屏,可在电脑操作手机相关推荐

  1. 手机上如何学会使用计算机,手机如何投屏到win7电脑上_手机投屏到win7电脑的详细方法...

    手机作为现在生活已经离不开的移动设备,给我们的生活带来了许多便利.但有使用win7电脑用户觉得手机屏幕太小影响观看,所以想要投屏到电脑上,那手机如何投屏到win7电脑上呢?对此今天本文就来为大家分享关 ...

  2. 手机投屏电视html,oppor17手机投屏电视的详细操作步骤

    再也不担心在手机中看电视不过瘾了,oppor17手机可以投屏电视了,以下教程就分享了oppor17手机投屏电视的详细操作步骤. 1.如果电视机是非智能的普通电视机,则无法支持无线传屏; 2.如果电视机 ...

  3. 手机上怎么学习计算机,手机投屏到Win10电脑上怎么操作呢?-电脑自学网

    大家在玩手机的时候有没有一个苦恼:手机屏幕太小了,看久了眼睛又累又花,好想把手机屏幕投屏到电脑上,这样就可以解决问题了.下面小编就给大家讲讲手机投屏到Win10电脑上的操作方法. 方法:通过Win10 ...

  4. android手机投屏电视用什么,华为手机哪一款最好用 华为手机投屏到电视的5种方法...

    华为手机哪一款最好用 华为手机投屏到电视的5种方法 2021-02-23 16:26:12 0点赞 0收藏 0评论 [ 一.华为手机哪一款最好用 1.华为P20Pro 配置:CPU麒麟970.内存6G ...

  5. 安卓手机投屏软件_辅助多手机同时直播控场 TotalControl手机投屏软件

    双十一就快到了,很多卖家开始在多个直播平台开启直播带货,当直播的设备比较多的时候,控场小伙伴往往忙不过来,不能即时回复买家的问题,显然会影响商品的出售数量. 为了备战双十一购物节,小编尝试了多款直播辅 ...

  6. 安卓手机投屏软件_苹果安卓手机投屏之(一)——视频和桌面

    上次发布了一篇电脑投屏视频文件到电视的文章,有朋友看了以后私信我说手机如何投屏到电视,不止要投视频,还要投音频和手机桌面. 今天我们就来说说如何手机投屏那些功能. ​由于内容比较多,所以分成几个部分来 ...

  7. tc溜溜865手机投屏卡_这台手机智商为零,却要挑战小米华为!

    这年头手机很常见,IQOO却让人浮想联翩,你看到的第一反应是什么?是不是一脸蒙圈呢?小黑IQ顿时为0,IQOO为何物?不知道的话,是不是感觉被侮辱了?看看网友们的第一感觉,也许小黑心里会平衡一点,这名 ...

  8. 使用互传APP实现Android手机投屏到windows电脑

    目前自己实现的条件: 1.自用VIVO品牌的手机(每个,手机品牌的自带互传或者投屏APP不一样,VIVO叫做"互传APP".) 2.PC(自用win11,应该XP.win7/10都 ...

  9. 安卓手机投屏到Mac电脑方法

    只需3步 打开terminal, 输入如下命令 brew install scrcpy ⚠️这一步安装所花的时间有点久 装成功后,继续输入下面命令 brew install android-platf ...

  10. android手机投影电视软件,Type-C手机投屏电视/投影仪超简单,快看你的可以吗?...

    原标题:Type-C手机投屏电视/投影仪超简单,快看你的可以吗? 在智能手机普及之前,大家的娱乐主要还是看电视,或者用电脑上网.玩游戏,而现在大家最离不开的就是手机.但是教授也发现一个现象,很多机友对 ...

最新文章

  1. SpringBoot培训教程--史前文明之Spring简介
  2. 7个使用PyTorch的技巧,含在线代码示例!网友:我连第一个都不知道?!
  3. Fiddler抓包使用教程-断点调试
  4. python基础---闭包、装饰器
  5. python内置模块re_常用内置模块(11):正则表达式、re模块
  6. python 定义变量x格式_如何从CSV文件中提取数据列并将它们定义为x和y变量,然后使用pylab在python中绘制它们?...
  7. LeetCode 两数之和
  8. Ibatis动态(dynamic)查询
  9. Codeforces Beta Round #75 (Div. 1 Only) B. Queue 线段树。单点更新
  10. js函数引用、函数调用与回调函数
  11. php软件开发--nodejs
  12. 软考知识点梳理--鱼骨图
  13. 昼猫笔记 JavaScript -- 闭包
  14. Matlab45度边缘连接,为什么Matlab的delaunayn()的delaunay边缘与非相邻的Voronoi区域连接点?...
  15. matlab二阶系统的单位阶跃响应为,2 二阶系统阶跃响应
  16. smtp协议支持身份认证与不认证两种状态。
  17. 对话现实版“谢耳朵”:多重宇宙和引力、超弦理论、暗能量
  18. 计算机工程师考证要求
  19. 2023 诚通网盘在线解析无广告高速下载网站源码
  20. Ubuntu 如何安装yum命令

热门文章

  1. 苹果电容笔和普通电容笔区别有哪些?平板值得入手的电容笔推荐
  2. 最新最全目标检测论文
  3. MySQL數據查詢語言-DQL(語法實例講解)-语法实例详细解读
  4. 对抗内卷,搞测绘地信的你需要这些插件和小工具来躺平
  5. MISC 宽带信息泄露
  6. DEA实用插件之Key Permoter X——辅助记忆快捷键
  7. IT比较有用的证书收集
  8. 水泵橡胶软连接的相关知识
  9. elementUi——组件函数钩子自带参数,不能添加参数问题
  10. vme嵌入式软件linux,基于VME总线嵌入式Linux应用研究.pdf