当前位置: 首页 > news >正文

经典蓝牙双机控制 APP-完整版1

经典蓝牙双机控制 APP-完整版1


🎯第一步:创建总开关(最重要)

文件:app/src/main/java/com/bt/BuildConfig.java

packagecom.bt;/** * 条件编译开关 * true = 服务端(被控端 · 被控制的手机) * false = 客户端(控制端 · 主控手机) */publicclassBuildConfig{// 🔥 只改这里 🔥publicstaticfinalbooleanSERVER_MODE=false;}

📂第二步:完整工程所有文件(全部复制粘贴)

1. 项目根文件

settings.gradle

pluginManagement { repositories { google() mavenCentral() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "BtRemoteControl" include ':app'

build.gradle(项目级)

plugins { id 'com.android.application' version '8.2.2' apply false }

gradle.properties

android.useAndroidX=true android.nonTransitiveRClass=true org.gradle.jvmargs=-Xmx2048m

2. app 模块文件

app/build.gradle

plugins { id 'com.android.application' } android { namespace 'com.bt' compileSdk 34 defaultConfig { applicationId "com.bt.remote" minSdk 26 targetSdk 34 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.11.0' }

app/proguard-rules.pro

-keep class com.bt.** {*;}

3. 清单文件(自动识别服务/客户端)

app/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"><uses-permissionandroid:name="android.permission.BLUETOOTH"/><uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/><uses-permissionandroid:name="android.permission.BLUETOOTH_SCAN"/><uses-permissionandroid:name="android.permission.BLUETOOTH_CONNECT"/><uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/><uses-permissionandroid:name="android.permission.FOREGROUND_SERVICE"/><uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/><uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/><uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/><applicationandroid:allowBackup="true"android:label="蓝牙远程控制"android:persistent="true"android:theme="@style/Theme.AppCompat"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><!-- 客户端 --><activityandroid:name=".client.BluetoothScanActivity"/><activityandroid:name=".client.ControlActivity"/><!-- 服务端 --><activityandroid:name=".server.TargetActivity"/><serviceandroid:name=".server.AccessibilityControlService"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><actionandroid:name="android.accessibilityservice.AccessibilityService"/></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibility_config"/></service><serviceandroid:name=".server.ScreenCaptureService"/><serviceandroid:name=".server.KeepAliveService"/><receiverandroid:name=".server.BootReceiver"android:exported="true"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver></application></manifest>

🚀第三步:完整 Java 代码(全部齐全)

我把共用、客户端、服务端一次性全部给你!

【共用】Protocol.java

packagecom.bt;publicclassProtocol{publicstaticfinalbyteTOUCH=0x01;publicstaticfinalbyteSYSTEM_CMD=0x02;publicstaticfinalbyteSCREEN_DATA=0x03;publicstaticfinalbyteHEARTBEAT=0x04;publicstaticfinalbyteSYS_VOL_UP=1;publicstaticfinalbyteSYS_VOL_DOWN=2;publicstaticfinalbyteSYS_BRIGHT_UP=3;publicstaticfinalbyteSYS_BRIGHT_DOWN=4;publicstaticfinalbyteSYS_WIFI_TOGGLE=5;publicstaticfinalbyteSYS_BT_TOGGLE=6;publicstaticbyte[]encodeTouch(intaction,intx,inty){returnnewbyte[]{TOUCH,(byte)action,(byte)(x>>8),(byte)(x&0xFF),(byte)(y>>8),(byte)(y&0xFF)};}publicstaticbyte[]encodeSystemCmd(bytecmd){returnnewbyte[]{SYSTEM_CMD,cmd};}}

【共用】BluetoothManager.java

packagecom.bt;importandroid.bluetooth.*;importjava.io.*;importjava.util.UUID;publicclassBluetoothManager{publicstaticfinalUUIDSPP_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");privatestaticBluetoothSocketsocket;privatestaticInputStreamin;privatestaticOutputStreamout;privatestaticStringtargetMac;// 服务端publicstaticvoidstartServer(){newThread(()->{try{BluetoothServerSocketss=BluetoothAdapter.getDefaultAdapter().listenUsingRfcommWithServiceRecord("SPP",SPP_UUID);socket=ss.accept();in=socket.getInputStream();out=socket.getOutputStream();startHeartBeat();}catch(Exceptione){}}).start();}// 客户端publicstaticvoidconnect(Stringmac){targetMac=mac;newThread(()->{try{BluetoothDeviced=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mac);socket=d.createRfcommSocketToServiceRecord(SPP_UUID);socket.connect();in=socket.getInputStream();out=socket.getOutputStream();startHeartBeat();}catch(Exceptione){}}).start();}privatestaticvoidstartHeartBeat(){newThread(()->{while(true){try{send(newbyte[]{Protocol.HEARTBEAT});Thread.sleep(3000);}catch(Exceptione){reconnect();}}}).start();}publicstaticvoidreconnect(){try{Thread.sleep(1000);if(targetMac!=null)connect(targetMac);}catch(Exceptionignored){}}publicstaticvoidsend(byte[]data){newThread(()->{try{if(out!=null)out.write(data);}catch(Exceptionignored){}}).start();}publicstaticInputStreamgetInputStream(){returnin;}}

【主入口】MainActivity.java

packagecom.bt;importandroid.content.Intent;importandroid.os.Bundle;importandroid.widget.TextView;importandroidx.appcompat.app.AppCompatActivity;publicclassMainActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextViewtv=findViewById(R.id.tv_mode);if(BuildConfig.SERVER_MODE){tv.setText("模式:被控端(服务端)");startActivity(newIntent(this,com.bt.server.TargetActivity.class));}else{tv.setText("模式:控制端(客户端)");startActivity(newIntent(this,com.bt.client.BluetoothScanActivity.class));}finish();}}

http://www.jsqmd.com/news/535320/

相关文章:

  • 制造业生产管理闭环解决方案 - 智慧园区
  • QWEN-AUDIO快速部署:一键搭建语音合成平台,省心省力
  • Linux实用功能代码集(3) —— 线程间消息队列(1)
  • 北京回收宣纸|藏家急售无门路?丰宝斋上门回收,省心又靠谱 - 品牌排行榜单
  • Mermaid图表工具终极指南:三步学会专业图表零代码绘制
  • FPGA DSP48E2实战避坑:为什么你的32x32定点乘法性能上不去?从原理到优化全解析
  • 从N元文法到BERT:用Python代码串讲NLP核心模型演进(附实战代码)
  • 炫2张Nature主刊相关性热图
  • RadixAttention 技术详解:从原理到 SGLang 实践及 vLLM APC 对比
  • 2026年AI营销公司TOP5深度评估:从技术壁垒到实战效果的多维选型指南 - 小白条111
  • 惊艳效果展示:实时手机检测-通用镜像识别复杂场景手机案例
  • 接口频繁变化时,Flutter 项目如何保证稳定性?
  • NanoMsg vs ZeroMQ:轻量级通信库选型指南(性能对比+迁移成本分析)
  • 新手编程初体验:在快马用ai生成win11右键菜单还原win10的详细教程代码
  • 在职考公考编党必看!27公考备考APP性价比测评
  • 计算机毕业设计springboot社区物业管理系统 基于SpringBoot的智慧社区综合服务平台 基于SpringBoot的小区数字化运营管理系统
  • Windows Defender禁用技术深度解析:通过WSC API实现安全控制
  • ROS2 MoveIt配置实战:解决机械臂在RViz中‘只规划不执行’和模型不显示的常见问题
  • 嘉立创SMT加工避坑指南:如何用下单助手高效完成PCB焊接(附最新优惠信息)
  • LuaScript:Godot引擎Lua集成方案的轻量级脚本开发解决方案
  • DeepSeek-OCR镜像免配置方案:开箱即用的智能文档解析终端
  • Django Admin 后台让邮箱、科目必填 + 下拉选择
  • 如何让Flash内容重获新生?FlashPatch拯救过期浏览器插件的实战指南
  • 免费开源神器draw.io vs Processon:哪个更适合你的流程图需求?
  • 老旧设备焕新:OpenClaw在GTX1080上优化运行Qwen3-32B的技巧
  • ComfyUI-WanVideoWrapper终极指南:5步解锁高效AI视频生成
  • C语言弱符号与弱引用技术解析
  • P2469 [SDOI2010] 星际竞速 - Link
  • Hi3516CV610搭配PQStream图像采集全流程:Windows与Linux板端详细配置指南
  • 避坑指南:uniapp中使用echarts常见6大报错解决方案(2023最新版)