android蓝牙控制PC端代码分享

引言

在安卓端通过蓝牙发送指令到PC端,java程序接收指令,并执行相应的动作。其中指令格式有所规范,PC端的java程序通过robot库进行操作

代码

控制类remotePC.java

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.IOException;
public class remotePC {
//保存当前鼠标指针的坐标(px,py)
private static int px;
private static int py;
//最大延迟时间:1秒
public static final int MAX_DELAY = 1000;
//最小间隔时间:1毫秒
public static final int SAMPLE_TIME_DIV = 1;
//魔法数字,用于设置默认的事件delay时间间隔
private final double magicX = 1.0;
//视觉延迟:默认100ms
private final int VISIBAL_MOVEMENT = 100;
//PC屏幕尺寸
private int screenWidth;
private int screenHeight;
//手机屏幕尺寸
private int mobileWidth;
private int mobileHeight;
//手机电脑尺寸转换的比例
private double widScale;
private double heiScale;
//用于控制的robot类
private Robot robot;
//默认构造函数
public remotePC() throws AWTException{
this(1366, 768);
}
//构造函数,指定手机屏幕尺寸
public remotePC(int mobileWidth, int mobileHeight) throws AWTException{
robot = new Robot();
robot.setAutoDelay((int)magicX);
setScreenSize();
this.mobileHeight = mobileHeight;
this.mobileWidth = mobileWidth;
setScale();
}
public void moveToCenter(){
this.move(screenWidth/2, screenHeight/2, 1);
}
//[鼠标光标移动]
//dt:间隔时间,时间长短对应速度
//dx,dy:手机上移动的相对横纵位移,自动转换为pc上应该移动的尺寸
public void move(int dx, int dy, int dt){
double deltaX = (1.0*dx/widScale);
double deltaY = (1.0*dy/heiScale);
int dxpms = (int)deltaX/dt;
int dypms = (int)deltaY/dt;
for(int i=0; i<dt; i++){
px += dxpms;
py += dypms;
if(px <= 0){
px = 0;
}else if(px  = screenWidth){
px = screenWidth;
}
if(py <= 0){
py = 0;
}else if(py  = screenHeight){
py = screenHeight;
}
robot.mouseMove((int)px, (int)py);
}
}
//[按下鼠标左键]
public void pressMouseL(){
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
}
//[释放鼠标左键]
public void releaseMouseL(){
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
}
//[点击一下鼠标左键]
public void clickMouseL(){
this.pressMouseL();
this.releaseMouseL();
}
//[按下鼠标右键]
public void pressMouseR(){
robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
}
//[释放鼠标右键]
public void releaseMouseR(){
robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
}
//[点击鼠标右键]
public void clickMouseR(){
this.pressMouseR();
this.releaseMouseR();
}
//[按下滚轮]
public void pressWheel(){
robot.mousePress(InputEvent.BUTTON2_DOWN_MASK);
}
//[释放滚轮]
public void releaseWheel(){
robot.mouseRelease(InputEvent.BUTTON2_DOWN_MASK);
}
//[滚轮往下移动]:step是移动步数,相对于滚轮的一格
public void wheelDown(int step){
for(int i=0; i<step; i++){
robot.mouseWheel(1);
}
}
//[滚轮往上移动]:step是移动步数,相对于滚轮的一格
public void wheelUp(int step){
for(int i=0; i<step; i++){
robot.mouseWheel(-1);
}
}
//[敲一格字符:A-Z]:c为字母的char类型字符,必须是大写的
public void printChar(char c){
if(c <= 'Z' && c  = 'A'){
robot.keyPress((int)c);
robot.keyRelease((int)c);
}
}
//[敲一个空格]
public void printSpace(){
robot.keyPress(KeyEvent.VK_SPACE);
robot.keyRelease(KeyEvent.VK_SPACE);
}
//[放大]相当于ctrl+滚轮上移
public void zoomIn(int step){
robot.keyPress(KeyEvent.VK_CONTROL);
for(int i=0; i<step; i++)
robot.mouseWheel(-1);
robot.keyRelease(KeyEvent.VK_CONTROL);
}
//[缩小]相当于ctrl+滚轮下移
public void zoomOut(int step){
robot.keyPress(KeyEvent.VK_CONTROL);
for(int i=0; i<step; i++)
robot.mouseWheel(1);
robot.keyRelease(KeyEvent.VK_CONTROL);
}
//[显示app切换栏]相当于alt+tab,并且alt不放开,一旦调用该函数后,需要手动调用closeSwitchApps()来释放alt按键
public void showSwitchApps(){
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
//robot.keyRelease(KeyEvent.VK_ALT);
}
//[app向右切换]相当于在按了alt+tab的情况下再按一次tab
public void tabRight(){
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
}
//[app向左切换]相当于在按了alt+tab的情况下再按一次shift+tab
public void tabLeft(){
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_SHIFT);
}
//[关闭app切换栏]在使用showSwitchApps()后必须调用该函数来释放alt
public void closeSwitchApps(){
robot.keyRelease(KeyEvent.VK_ALT);
}
//[app回切/左切一次]:按下shift+alt+tab,并释放
public void simpleLeftSwitchApp(){
this.showSwitchApps();
this.delay(VISIBAL_MOVEMENT);
this.tabLeft();
this.tabLeft();
this.delay(VISIBAL_MOVEMENT);
this.closeSwitchApps();
}
//[app切换/右切一次]:按下alt+tab,并释放
public void simpleRightSwitchApp(){
this.showSwitchApps();
this.delay(VISIBAL_MOVEMENT);
this.closeSwitchApps();
}
//[显示当前window下所有app]:相当于window+tab
public void listAppsWindow(){
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_WINDOWS);
}
//[显示桌面/隐藏app]:相当于window+M
public void showDesktop(){
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_M);
robot.keyRelease(KeyEvent.VK_M);
robot.keyRelease(KeyEvent.VK_WINDOWS);
}
//[当前窗口最大化]:相当于window+UP
public void windowUp(){
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_UP);
robot.keyRelease(KeyEvent.VK_UP);
robot.keyRelease(KeyEvent.VK_WINDOWS);
}
//[取消当前窗口最大化]:相当于window+DOWN
public void windowDown(){
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyRelease(KeyEvent.VK_DOWN);
robot.keyRelease(KeyEvent.VK_WINDOWS);
}
//[窗口置于左侧/多窗口并排]:相当于window+LEFT
public void windowLeft(){
//TODO: window + Left
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_WINDOWS);
}
//[窗口置于右侧/多窗口并排]:相当于window+RIGHT
public void windowRight(){
//TODO: window + Right
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_WINDOWS);
}
//[切换桌面:左切]:window+control+left
public void leftSwitchWindow(){
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_WINDOWS);
}
//[切换桌面:右切]:window+control+right
public void rightSwitchWindow(){
robot.keyPress(KeyEvent.VK_WINDOWS);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_WINDOWS);
}
//[快速打开记事本]
public void openNotepad(){
try {
Runtime.getRuntime().exec("notepad");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//[快速打开画图板]
public void openPaint(){
try {
Runtime.getRuntime().exec("mspaint");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//[ppt笔]
public void setDraw(){
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_P);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_P);
}
//[ppt激光笔]
public void setLaser(){
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_L);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_L);
}
//[ppt荧光笔]
public void setMark(){
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_I);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_I);
}
//[ppt隐藏鼠标]
public void hideMouse(){
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_H);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_H);
}
//[ppt 上一张]
public void prevSlide(){
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
}
//[ppt 下一张]
public void nextSlide(){
robot.keyPress(KeyEvent.VK_RIGHT);
robot.keyRelease(KeyEvent.VK_RIGHT);
}
//延迟函数,延迟ms个毫秒
public void delay(int ms){
robot.delay(ms);
}
//获得当前PC屏幕的尺寸
public void setScreenSize(){
Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
screenWidth = (int)screensize.getWidth();
screenHeight = (int)screensize.getHeight();
}  
//打印当前PC屏幕的尺寸
public String getScreenInfo(){
return "screenSize:"+screenWidth+"*"+screenHeight;
}
//设置手机和PC屏幕尺寸的转换比
private void setScale(){
heiScale = -1.0 / 1.5;
widScale = 1.0 / 3.0;
}
}

PC端通过蓝牙和安卓app交互:BluetoothServer.java

/**
* Created by luyudi on 2016/11/9.
* Modified by Lannooo on 2016/12/4.
*/
// server
import java.awt.*;
import java.io.InputStream;
import java.io.IOException;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
public class BlueToothServer implements Runnable {
private remotePC Controller;
// 下面的UUID必须和手机客户端的UUID相一致
private static UUID ECHO_SERVER_UUID= new UUID("aeb9f938a1a34947ace29ebd0c67adf1", false);
// 流连接通知 用于创建流连接
private StreamConnectionNotifier myPCConnNotifier = null;
// 流连接
private StreamConnection streamConn = null;
// 接受数据字节流
// 接收x y 坐标
private byte[] acceptedByteArray = new byte[1024];
// 读取(输入)流
private InputStream inputStream = null;
// 主线程
public static void main(String[] args) {
new BlueToothServer();
}
public BlueToothServer() {
try {
String url = "btspp://localhost:" + ECHO_SERVER_UUID.toString();
// 得到流连接通知
myPCConnNotifier = (StreamConnectionNotifier) Connector.open(url);
Controller = new remotePC();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 打开连接通道并读取流线程
new Thread(this).start();
}
public static int getInt(byte[] bytes){
return (0xff & bytes[3])       |
(0xff00 & (bytes[2] << 8))  |
(0xff0000 & (bytes[1] << 16)) |
(0xff000000 & (bytes[0] << 24));
}
public static float getFloat(byte[] b){
return Float.intBitsToFloat(getInt(b));
}
@Override
public void run() {
try {
boolean isMouseLPressed = false;
boolean isWheelPressed = false;
boolean end = false;
while (true) {
// 持续保持着监听客户端的连接请求
// 获取流连接
streamConn = myPCConnNotifier.acceptAndOpen();
// 获取流通道
inputStream = streamConn.openInputStream();
// 循环读取字节流,判断code类型和x,y坐标
while (inputStream.read(acceptedByteArray) != -1) {
String acceptString = new String(acceptedByteArray);
int index;
if((index = acceptString.indexOf("RemoteTouch")) != -1) {
byte[] codeBytes = new byte[4];
byte[] dxBytes = new byte[6];
byte[] dyBytes = new byte[6];
System.arraycopy(acceptedByteArray, index + 11, codeBytes, 0, 4);
System.arraycopy(acceptedByteArray, index + 15, dyBytes, 0, 6);
System.arraycopy(acceptedByteArray, index + 21, dxBytes, 0, 6);
int dy = Integer.parseInt(new String(dyBytes));
int dx = Integer.parseInt(new String(dxBytes));
int code = getInt(codeBytes);
if (end) {
inputStream.close();
if (streamConn != null) {
streamConn.close();
System.out.println("Disconnected...");
}
break;
}
switch (code) {
case 1://按下鼠标左键
isMouseLPressed = true;
Controller.pressMouseL();
System.out.println("Pressing mouse L");
break;
case 2://释放鼠标左键
if (isMouseLPressed) {
Controller.releaseMouseL();
System.out.println("Released mouse L");
isMouseLPressed=false;
}
break;
case 3://点击鼠标左键
Controller.clickMouseL();
System.out.println("Clicked mouse L");
break;
case 4://点击鼠标右键
Controller.clickMouseR();
System.out.println("Clicked mouse R");
break;
case 5://按下滚轮
//           isWheelPressed = true;
//           Controller.pressWheel();
//           System.out.println("Pressing wheel");
break;
case 6://释放滚轮
//           if(isWheelPressed){
//             Controller.releaseWheel();
//             System.out.println("Released wheel");
//           }
break;
case 7://滚轮滚动
int step = Math.abs(dy) / 40;
System.out.println("wheel");
if (dy   0) {
Controller.wheelDown(step);
System.out.printf("Wheel Down:%d steps. dy=%d\n", step, dy);
} else {
Controller.wheelUp(step);
System.out.printf("Wheel Up:%d steps. dy=%d\n", step, dy);
}
break;
case 8://放大、缩小
double s = Math.sqrt((double) (dx * dx + dy * dy));
if (dx < 0) {
Controller.zoomOut((int) s / 20);
System.out.printf("Zoom out %d steps. dx=%d,dy=%d\n", (int) s / 20, dx, dy);
} else {
Controller.zoomIn((int) s / 20);
System.out.printf("Zoom in %d steps. dx=%d,dy=%d\n", (int) s / 20, dx, dy);
}
break;
case 9://显示可切换apps
Controller.listAppsWindow();
System.out.println("show Switch apps");
break;
case 10://显示桌面
Controller.showDesktop();
System.out.println("show desktop");
break;
case 11://app 右切
Controller.simpleRightSwitchApp();
System.out.println("switch app: right");
break;
case 12://app 左切
Controller.simpleLeftSwitchApp();
System.out.println("switch app: left");
break;
case 13://window 右切
Controller.rightSwitchWindow();
System.out.println("switch window right");
break;
case 14://window 左切
Controller.leftSwitchWindow();
System.out.println("switch window left");
break;
case 15://鼠标左键双击
Controller.clickMouseL();
Controller.delay(1);
Controller.clickMouseL();
System.out.println("clicked double mouse L");
break;
case 16://鼠标移动
Controller.move(dx, dy, 1);
//System.out.printf("Move mouse:dx=%d,dy=%d\n", dx, dy);
break;
case 17://左分屏
Controller.windowLeft();
System.out.println("Window divide: left");
break;
case 18://右分屏
Controller.windowRight();
System.out.println("Window divide: right");
break;
case 19: //上一张ppt
Controller.prevSlide();
System.out.println("previous slide");
break;
case 20:
Controller.nextSlide();
System.out.println("Next Slide");
break;
case 32: // PPT设置为隐藏鼠标
Controller.hideMouse();
System.out.println("Hide");
break;
case 33: // ppt激光笔
Controller.setLaser();
System.out.println("Laser");
break;
case 34: // ppt笔
Controller.setDraw();
System.out.println("Draw");
break;
case 35: // ppt 荧光笔
Controller.setMark();
System.out.println("Mark");
break;
case 100://退出
end = true;
System.out.println("Quit.");
break;
default://未识别
System.out.println("Unknown code");
break;
}
}
// clear data
acceptedByteArray = new byte[1024];
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2023最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio中实现蓝牙通信的代码包括以下核心功能: 1. 蓝牙设备的开启和关闭 通过使用BluetoothAdapter类的enable()方法和disable()方法,可以在应用中开启或关闭蓝牙功能。 2. 搜索周围的蓝牙设备 使用BluetoothAdapter类的startDiscovery()方法开始搜索周围的蓝牙设备,并使用BroadcastReceiver来接收搜索结果。 3. 连接蓝牙设备 通过BluetoothDevice类的createBond()方法可以与指定的蓝牙设备进行配对和连接。 4. 发送和接收数据 使用BluetoothSocket类可以与已连接的蓝牙设备进行数据传输。通过InputStream和OutputStream可以实现数据的读取和写入。 下面是一个简单的示例代码,展示了如何在Android Studio中实现蓝牙通信: ```java // 1. 开启蓝牙 BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); bluetoothAdapter.enable(); // 2. 搜索周围的蓝牙设备 BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); bluetoothAdapter.startDiscovery(); // 在BroadcastReceiver中接收搜索结果 private final BroadcastReceiver receiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // 处理搜索到的蓝牙设备 } } }; // 注册BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(receiver, filter); // 3. 连接蓝牙设备 BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address); BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid); socket.connect(); // 4. 发送和接收数据 InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); // 发送数据 String message = "Hello, Bluetooth"; outputStream.write(message.getBytes()); // 接收数据 byte[] buffer = new byte<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Android Studio 简要实现蓝牙(Bluetooth)通信(附加作业)](https://blog.csdn.net/LYCURRY/article/details/121904906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值