Java event capture and playback

利用Java事件处理机制实现录制、回放功能

http://www.ibm.com/developerworks/cn/java/j-java-test/

 

(1) Put event in system event queue:

 

import java.awt.EventQueue;
import java.awt.*;
import java.util.*;
public class MyQueueEvent extends EventQueue {//??EventQueue???
  public MyQueueEvent() {
  }
  public static void main(String[] args) {
    //impleExample.main(new String[]{null}) ;
    MyQueueEvent myQueueEvent1 = new MyQueueEvent();
    Toolkit.getDefaultToolkit().getSystemEventQueue().push(myQueueEvent1) ;

  }

  public void dispatchEvent(AWTEvent ae){
    
    if(ae.getSource() instanceof javax.swing.JButton)
    System.out.println("My apture:"+((javax.swing.JButton)ae.getSource()).getText()) ;
    super.dispatchEvent(ae);
  }
}

 

(2) play back: using Robot

 

mport java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class TestReplay extends Thread {
 public static void main(String[] args) {
  try {

   Frame1.main(new String[] { null });

   Thread.currentThread().sleep(3000);
   Robot robottest = new Robot();
   robottest.waitForIdle();

   Frame jframe = getFrame("test");
   ;

   JButton jbtn = getButton(jframe, "jButton1");

   robottest.mouseMove(jbtn.getLocationOnScreen().x + jbtn.getWidth()
     / 2, jbtn.getLocationOnScreen().y + jbtn.getHeight() / 2);

   robottest.mousePress(InputEvent.BUTTON1_MASK);
   robottest.mouseRelease(InputEvent.BUTTON1_MASK);
   

   jbtn.setText("aaa");
   // jbtn.getActionListeners()

  } catch (Exception ee) {
   ee.printStackTrace();
  }
 }

 
 private static Frame getFrame(String title) {
  Frame[] jframes = (Frame[]) JFrame.getFrames();
  for (int i = 0; i < jframes.length; i++) {
   if (jframes[i].getTitle().equalsIgnoreCase(title))
    return jframes[i];
  }
  return null;

 }

 private static JButton getButton(Frame jf, String text) {

  Component[] coms = ((JFrame) jf).getContentPane().getComponents();
  for (int i = 0; i < coms.length; i++) {
   if (!(coms[i] instanceof JButton))
    continue;
   if (((JButton) coms[i]).getText().equalsIgnoreCase(text))
    return (JButton) coms[i];
  }
  return null;
 }

 public void run() {

 }
}

要允许从HDMI输入播放捕获到AudioTrack,您需要使用AudioPolicyService来配置音频策略。以下是一些步骤: 1. 创建一个名为audio_policy.conf的文本文件,并将其放在/system/etc/目录中。 2. 在audio_policy.conf文件中,为HDMI输入定义一个AudioProfile,例如: ``` profile "hdmi_in_playback" { formats AUDIO_FORMAT_PCM_16_BIT rates 44100 channel_masks AUDIO_CHANNEL_OUT_STEREO devices AUDIO_DEVICE_IN_HDMI } ``` 此配置文件定义了一个名为“hdmi_in_playback”的音频配置文件,它支持16位PCM格式,采样率为44100Hz,双声道输出,并使用HDMI输入设备。 3. 更新AudioPolicyService的配置,使其支持新的音频配置文件。在设备上运行以下命令: ``` adb shell service call audio 3 i32 0 i32 1 s16 "your_package_name" s16 "your_audio_policy.conf_file_path" ``` 这将更新AudioPolicyService的配置,并使其支持新的音频配置文件。 4. 在您的代码中使用AudioTrack对象,并使用“hdmi_in_playback”配置文件进行初始化: ``` AudioTrack track = new AudioTrack.Builder() .setAudioAttributes(new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build()) .setAudioFormat(new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(44100) .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO) .build()) .setBufferSizeInBytes(bufferSize) .setTransferMode(AudioTrack.MODE_STREAM) .setPerformanceMode(AudioTrack.PERFORMANCE_MODE_LOW_LATENCY) .setSessionId(AudioSystem.newAudioSessionId()) .setOffloadedPlayback(true) .setOffloadDelayFrames(0) .setOffloadPositionUpdateListener(null, null) .setPreferredDevice(AudioDeviceInfo.TYPE_HDMI) .build(); ``` 这将使用“hdmi_in_playback”配置文件初始化AudioTrack对象,并将首选设备设置为HDMI输入设备。 请注意,这些步骤可能因设备和Android版本而异。在实施此解决方案之前,请确保您已经了解了相关文档和API,并且已经进行了适当的测试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值