在AIR2.0中,我们可以使用NativeProcessNativeProcessInfo这两个类,来启动一个可执行文件。当进程启动后,你就可以使用标准输入和标准输入来与进程通讯。

结合Java

首先,你可以下载

http://corlan.org/downloads/MagnifyingGlass.fxp

这个项目包含了两个部分:

  1. AIR部分:是一个基于Flex4 Framework的AIR项目,实现了用户界面(UI)部分的工作,界面包含两个窗口,如下图所示,右边的窗口是主窗口,你可以看到当前的帧频,然后你还可以控制左侧的滚动条来放大和缩小右侧的图像。左边的窗口则用来显示遮盖区域的图像。
  2. Java部分:控制定位到屏幕的特定区域,然后捕获截图,这个部分被AIR部分所控制。

示例截图:


 

你可以使用Flash Builder4,将下载的示例项目导入,编译运行看一下结果,注意这个项目使用了Flex4的Framework,而且有可能需要你修改SDK的配置

在AIR部分的代码中,我们需要创建一个NativeProcess的实例来注册侦听标准输出事件。首先我们需要调用Java命令,启动我们的.jar文件,然后输入“take”命令来获取屏幕截图

  1. private var nativeProcess:NativeProcess;
  2. private var npInfo:NativeProcessStartupInfo;
  3. //启动进程,并输入参数
  4. var arg:Vector.<String> = new Vector.<String>;
  5. arg.push("-jar");
  6. arg.push(File.applicationDirectory.resolvePath("screenshot.jar").nativePath);
  7. arg.push("130");
  8. arg.push("100");
  9. npInfo = new NativeProcessStartupInfo();
  10. //设置Java的路径
  11. npInfo.executable = new File("/Library/Java/Home/bin/java");
  12. npInfo.arguments = arg;
  13. nativeProcess = new NativeProcess();
  14. nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onStandardOutputData);
  15. //start the process
  16. nativeProcess.start(npInfo);
  17. /**
  18. * 从标准输出流中读取数据
  19. * 在读取PNG之前,首先需要读取图片的尺寸
  20. */
  21. private function onStandardOutputData(e:ProgressEvent):void {
  22. //reading the available bytes from the standard output buffer of the process
  23. nativeProcess.standardOutput.readBytes(_processBuffer, _processBuffer.length, nativeProcess.standardOutput.bytesAvailable);
  24. ...
  25. } //向Java进程发送take命令
  26. nativeProcess.standardInput.writeMultiByte("take ", "utf-8");

下面的部分是Java代码,你可以看到,它执行截取屏幕的工作,然后输出字节数组,AIR部分将会把字节数组还原为图片并显示出来:

  1. package org.corlan;
  2. import java.awt.AWTException;
  3. import java.awt.Rectangle;
  4. import java.awt.Robot;
  5. import java.awt.image.BufferedImage;
  6. import java.io.BufferedReader;
  7. import java.io.ByteArrayOutputStream;
  8. import java.io.DataOutputStream;
  9. import java.io.IOException;
  10. import java.io.InputStreamReader;
  11. import javax.imageio.ImageIO;
  12. public class ScreenShot {
  13. private static int width = 130;
  14. private static int height = 110;
  15. private static int x = 50;
  16. private static int y = 50;
  17. private Robot robot;
  18. //要创建的图片的类型,可以是PNG,GIF或其它
  19. private String imageType = "png";
  20. /**
  21. * @param 捕捉屏幕宽度
  22. * @param 捕捉屏幕高度
  23. * @param args   */
  24. public static void main(String[] args) {
  25. if (args.length == 2) {
  26. width = Integer.parseInt(args[0]);
  27. height = Integer.parseInt(args[1]);
  28. }
  29. ScreenShot s = new ScreenShot();
  30. BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  31. String text = "";
  32. String[] tokens;
  33. while (true) {
  34. try {
  35. text = in.readLine();
  36. if (text.equals("take")) {
  37. s.capturePortion(x, y, width, height);
  38. } else if (text.equals("terminate")) {
  39. return;
  40. } else if (text.length() > 0) {
  41. tokens = text.split("//|");
  42. if (tokens.length < 4)
  43. continue;
  44. x = Integer.parseInt(tokens[0]);
  45. y = Integer.parseInt(tokens[1]);
  46. width = Integer.parseInt(tokens[2]);
  47. height = Integer.parseInt(tokens[3]);
  48. }
  49. } catch (IOException e) {
  50. System.err.println("Exception while reading the input. " + e);
  51. }
  52. }
  53. }
  54. /**
  55. * 获取屏幕某个区域的截图     */
  56. public void capturePortion(int x, int y, int w, int h) {
  57. try {
  58. if (robot == null)
  59. robot = new Robot();
  60. BufferedImage img = robot.createScreenCapture(new Rectangle(x, y, w, h));
  61. ByteArrayOutputStream output = new ByteArrayOutputStream();
  62. ImageIO.write(img, imageType, output);
  63. DataOutputStream dataOutputStream = new DataOutputStream(System.out);
  64. //输出流的长度
  65. dataOutputStream.writeInt(output.size());
  66. //输出流
  67. dataOutputStream.write(output.toByteArray());
  68. dataOutputStream.flush();
  69. output.close();
  70. } catch (AWTException e) {
  71. System.err.println("Exception while capturing screen. " + e);
  72. } catch (IOException e) {
  73. System.err.println("Exception while writting the image bytes. " + e);
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }

通过上面的代码,你已经了解了如何将Java进程与AIR应用相结合,接下来就是打包你的AIR应用为本地可执行文件,这样才具备与本地进程通讯的权限。

Air与java通信相关推荐

  1. flash java 通信_FLASH与服务器通讯 (JAVA)

    1.FLASH 通过URL地址获得服务器数据. 这种方式最为简单,就像在浏览器的地址栏里面敲一样. 先建立一个URLRequest,然后用URLLoader载入就行了. 下面这个是载入一个图片,htm ...

  2. java与flex通信_Flex与Java通信教程

    Flex与Java通信教程 Flex与Java通信框架搭建的步骤: 1. 新建web项目,并启动tomcat运行,检查一切是否正常(必须): 2. 导入所需的jar包(我已给出),将需要用的四个XML ...

  3. java qq通信_结对博客(Java通信项目QQ)

    项目名称:JAVA通信项目--QQ 成员:邢正,郑振兰 项目需求:QQ每个人都用过,它的意义就不再讲了.之所以选择做QQ事因为它有挑战性,涉及到通信.传输.swing等各种知识.(好吧我不装逼了,说的 ...

  4. Flex与Java通信之HttpService方式

    2019独角兽企业重金招聘Python工程师标准>>> Flex用RemoteObject方式与Java通信是最常用的方式,这是一种最直观的方式.当然Flex也可以用HttpServ ...

  5. Java通信之服务器生猛上手

    Java通信之服务器生猛上手 一.生猛上手前的准备 Java其实是一门网络编程语言,这是和C语言和C++语言的一大区别,同时也是Java语言的一大特性:通过简单的Java语言代码就可以让多台计算机之间 ...

  6. JAVA通信(二)——实现客户机和服务器通信

    前面一篇博客我们简单地理清了JAVA创建服务器,以及客户机连接服务器的流程,今天我们继续往下学习,实现客户机和服务器的通信.由于基本概念我们已经在前一篇博客说清楚了,这里我们就不再进行赘述.(不清楚的 ...

  7. java qq通信,Java通信-仿QQ聊天项目

    前后历时一个多月的Java实现聊天通信项目-仿QQ聊天室基本告一段落,期间面对了很多问题,也有不同的解决方案,重写了几次核心代码,等等问题.现在在项目的结束之时,给自己做一个总结,算是一个回顾,算是一 ...

  8. air调用java,AIR2.0入门教程:与Java应用交互

    在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...

  9. java 通信 教程_Java实现简单的socket通信教程

    今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了. 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有pa ...

最新文章

  1. Grafana中整个Dashboard报错问题解决
  2. 最短路径:Dijkstra算法和Floyd算法
  3. HA集群实现原理 切换 JAVA_HA(一)高可用集群原理
  4. 电脑开机显示服务器启动失败是什么原因,请问我的电脑在启动时显示NTDETECT失败是什么意思? 爱问知识人...
  5. python将数据变成float32,Python:将numpy默认为float32
  6. ZooKeeper的安装及部署
  7. xampp 中mysql中文乱码
  8. plus.webview.create( url, id, styles, extras )参数及说明
  9. android:layout_weight属性详解 (转)
  10. CSDN出品,必是精品:CSDN浏览器助手!
  11. Unity 复制内容到剪贴板
  12. 高中数学三角函数公式大全及其易错题型总结
  13. Spring Cloud【Finchley】实战-05配置中心的搭建(配合使用Eureka)和Config Server高可用
  14. 斯蒂夫·乔布斯《你必须要找到你所爱的东西》
  15. Win10修改用户名及用户文件夹名
  16. 360无线wifi路由器连接到服务器,360无线路由器怎么有线桥接设置
  17. gta5结局杀老崔我哭了_GTA5:玩家眼中的重情义,剧情中变定时炸弹,崔佛为何是个疯子?...
  18. 大国重器“兵器谱”,了解一下
  19. 一文彻底读懂物联网关键技术之——ZigBee!
  20. db2 删除索引_你想要拥有自己的搜索引擎吗?

热门文章

  1. SQL Server执行计划面试问题
  2. 在Azure Data StudioSQL笔记本中使用Python脚本加密密码
  3. vue+ 下拉框有选择项 点击选项也拿到值就是页面不显示选中项
  4. Linux实战教学笔记50:Zabbix监控平台3.2.4(二)深入理解zabbix
  5. SurfaceView的经典写法
  6. 键盘按钮keyCode大全
  7. 编程:请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”...
  8. 博弈论重要算法:Sprague-Grundy 定理 (SRM 561 Div1 550)
  9. 1: 认识WPF和一个小Demon
  10. LeetCode_database刷题记录(620. 有趣的电影)