Air与java通信
来源:互联网 发布:md5算法java 编辑:程序博客网 时间:2024/06/10 01:18
在AIR2.0中,我们可以使用NativeProcess和NativeProcessInfo这两个类,来启动一个可执行文件。当进程启动后,你就可以使用标准输入和标准输入来与进程通讯。
结合Java
首先,你可以下载
http://corlan.org/downloads/MagnifyingGlass.fxp这个项目包含了两个部分:- AIR部分:是一个基于Flex4 Framework的AIR项目,实现了用户界面(UI)部分的工作,界面包含两个窗口,如下图所示,右边的窗口是主窗口,你可以看到当前的帧频,然后你还可以控制左侧的滚动条来放大和缩小右侧的图像。左边的窗口则用来显示遮盖区域的图像。
- Java部分:控制定位到屏幕的特定区域,然后捕获截图,这个部分被AIR部分所控制。
示例截图:
你可以使用Flash Builder4,将下载的示例项目导入,编译运行看一下结果,注意这个项目使用了Flex4的Framework,而且有可能需要你修改SDK的配置
在AIR部分的代码中,我们需要创建一个NativeProcess的实例来注册侦听标准输出事件。首先我们需要调用Java命令,启动我们的.jar文件,然后输入“take”命令来获取屏幕截图
- private var nativeProcess:NativeProcess;
- private var npInfo:NativeProcessStartupInfo;
- //启动进程,并输入参数
- var arg:Vector.<String> = new Vector.<String>;
- arg.push("-jar");
- arg.push(File.applicationDirectory.resolvePath("screenshot.jar").nativePath);
- arg.push("130");
- arg.push("100");
- npInfo = new NativeProcessStartupInfo();
- //设置Java的路径
- npInfo.executable = new File("/Library/Java/Home/bin/java");
- npInfo.arguments = arg;
- nativeProcess = new NativeProcess();
- nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onStandardOutputData);
- //start the process
- nativeProcess.start(npInfo);
- /**
- * 从标准输出流中读取数据
- * 在读取PNG之前,首先需要读取图片的尺寸
- */
- private function onStandardOutputData(e:ProgressEvent):void {
- //reading the available bytes from the standard output buffer of the process
- nativeProcess.standardOutput.readBytes(_processBuffer, _processBuffer.length, nativeProcess.standardOutput.bytesAvailable);
- ...
- } //向Java进程发送take命令
- nativeProcess.standardInput.writeMultiByte("take ", "utf-8");
下面的部分是Java代码,你可以看到,它执行截取屏幕的工作,然后输出字节数组,AIR部分将会把字节数组还原为图片并显示出来:
- package org.corlan;
- import java.awt.AWTException;
- import java.awt.Rectangle;
- import java.awt.Robot;
- import java.awt.image.BufferedImage;
- import java.io.BufferedReader;
- import java.io.ByteArrayOutputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import javax.imageio.ImageIO;
- public class ScreenShot {
- private static int width = 130;
- private static int height = 110;
- private static int x = 50;
- private static int y = 50;
- private Robot robot;
- //要创建的图片的类型,可以是PNG,GIF或其它
- private String imageType = "png";
- /**
- * @param 捕捉屏幕宽度
- * @param 捕捉屏幕高度
- * @param args */
- public static void main(String[] args) {
- if (args.length == 2) {
- width = Integer.parseInt(args[0]);
- height = Integer.parseInt(args[1]);
- }
- ScreenShot s = new ScreenShot();
- BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- String text = "";
- String[] tokens;
- while (true) {
- try {
- text = in.readLine();
- if (text.equals("take")) {
- s.capturePortion(x, y, width, height);
- } else if (text.equals("terminate")) {
- return;
- } else if (text.length() > 0) {
- tokens = text.split("//|");
- if (tokens.length < 4)
- continue;
- x = Integer.parseInt(tokens[0]);
- y = Integer.parseInt(tokens[1]);
- width = Integer.parseInt(tokens[2]);
- height = Integer.parseInt(tokens[3]);
- }
- } catch (IOException e) {
- System.err.println("Exception while reading the input. " + e);
- }
- }
- }
- /**
- * 获取屏幕某个区域的截图 */
- public void capturePortion(int x, int y, int w, int h) {
- try {
- if (robot == null)
- robot = new Robot();
- BufferedImage img = robot.createScreenCapture(new Rectangle(x, y, w, h));
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- ImageIO.write(img, imageType, output);
- DataOutputStream dataOutputStream = new DataOutputStream(System.out);
- //输出流的长度
- dataOutputStream.writeInt(output.size());
- //输出流
- dataOutputStream.write(output.toByteArray());
- dataOutputStream.flush();
- output.close();
- } catch (AWTException e) {
- System.err.println("Exception while capturing screen. " + e);
- } catch (IOException e) {
- System.err.println("Exception while writting the image bytes. " + e);
- }
- }
- }
- }
- }
- }
通过上面的代码,你已经了解了如何将Java进程与AIR应用相结合,接下来就是打包你的AIR应用为本地可执行文件,这样才具备与本地进程通讯的权限。
- Air与java通信
- 关于Air端与android端的通信实现
- 关于Air端与android端的通信实现
- java与flex通信
- php与java通信
- Flex与java通信
- Flex与java通信
- #java与c#通信
- HessionPHP与JAVA通信
- java与js通信
- JavaScript与Java通信
- Python与java通信
- PHP与JAVA通信
- Unity与Java通信
- Flex + Blazeds + Java [AIR]
- Flex4与java通信(一、与普通java类通信)
- Java与JavaScript的通信
- VB/JAVA与单片机通信
- 第一次面试----华为实习生招聘
- swing图形界面(一)基本组件实例
- 什么是6800总线,8080总线?
- CPU、MCU、MPU、DSP的区别?
- Android Trick 4: Activity的android:launchMode (startard、singleTop、singleTask、singleInstance)
- Air与java通信
- 特别推荐:Web开发常用速查手册大全(100+)
- Eclipse中好用的Porperties文件编辑器
- 天心天字辈ERP全部PDK源代码到了我手上的后果 - 超越天心之WEB天云
- 解决AS3 Socket编程中最令人头疼的问题
- 简单递归
- swing图形界面(二)QQ框架界面(GridBagLayout设计实例)
- Windows 7下安装配置PHP(5.2.17)+Mysql(5.1)+apache2.2
- 手机防盗软件的实现日志