Air与java通信

来源:互联网 发布:md5算法java 编辑:程序博客网 时间:2024/06/10 01:18

在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应用为本地可执行文件,这样才具备与本地进程通讯的权限。

 

原创粉丝点击