Android设备通过蓝牙HID技术模拟键盘实现

news2024/11/20 3:17:54

目录

一,背景介绍

二,技术方案

2.1 获取BluetoothHidDevice实例

2.2 注册/解除注册HID实例

2.3 Hid report description描述符生成工具

2.4 键盘映射表

2.5 通过HID发送键盘事件

 三,实例


一,背景介绍

        日常生活中,各种物理遥控器和鼠标等设备,需要摆放和携带,便捷性有待考验。根据蓝牙HID特性,可以用蓝牙协议模仿键盘,来实现空中键盘等功能。


二,技术方案

        自Android 9开放BluetoothHidDevice功能后,Android平台可以很简单的通过BluetoothHidDevice模拟键盘鼠标等蓝牙hid device角色。


2.1 获取BluetoothHidDevice实例

 BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
 
bluetoothAdapter.setName("KEYBOARD BT");
      bluetoothAdapter.getProfileProxy(context,mProfileServiceListener,BluetoothProfile.HID_DEVICE);

2.2 注册/解除注册HID实例

    public static BluetoothProfile.ServiceListener mProfileServiceListener = new BluetoothProfile.ServiceListener() {
        @Override
        public void onServiceDisconnected(int profile) {
            Log.e(TAG, "hid onServiceDisconnected");
            if (profile == BluetoothProfile.HID_DEVICE) {
                mHidDevice.unregisterApp();
            }
        }

        @SuppressLint("NewApi")
        @Override
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            Log.e(TAG, "hid onServiceConnected");
            bluetoothProfile = proxy;
            if (profile == BluetoothProfile.HID_DEVICE) {
                mHidDevice = (BluetoothHidDevice) proxy;
                HidConsts.HidDevice = mHidDevice;
                BluetoothHidDeviceAppSdpSettings sdp = new BluetoothHidDeviceAppSdpSettings(HidConsts.NAME, HidConsts.DESCRIPTION, HidConsts.PROVIDER, BluetoothHidDevice.SUBCLASS1_COMBO, HidConsts.Descriptor);
                mHidDevice.registerApp(sdp, null, null, Executors.newCachedThreadPool(), mCallback);
            }
        }
    };

 

        在获取到BluetoothHidDevice实例后通过registerApp注册hid device,此时hid host角色会被禁用,因此在不需要hid device功能时要及时解除hid device的注册。

        registerApp函数中最重要的一个参数BluetoothHidDeviceAppSdpSettings,主要是给对端host提供hid device角色的名称,描述信息,供应商信息,以及Hid device的Reports Descriptor。


2.3 Hid report description描述符生成工具

参考文章《官网HID描述符工具》

 

   val Descriptor = byteArrayOf(
        0x05.toByte(),
        0x01.toByte(),
        0x09.toByte(),
        0x02.toByte(),
        0xa1.toByte(),
        0x01.toByte(),
        0x09.toByte(),
        0x01.toByte(),
        0xa1.toByte(),
        0x00.toByte(),
        0x85.toByte(),
        0x01.toByte(),
        0x05.toByte(),
        0x09.toByte(),
        0x19.toByte(),
        0x01.toByte(),
        0x29.toByte(),
        0x03.toByte(),
        0x15.toByte(),
        0x00.toByte(),
        0x25.toByte(),
        0x01.toByte(),
        0x95.toByte(),
        0x03.toByte(),
        0x75.toByte(),
        0x01.toByte(),
        0x81.toByte(),
        0x02.toByte(),
        0x95.toByte(),
        0x01.toByte(),
        0x75.toByte(),
        0x05.toByte(),
        0x81.toByte(),
        0x03.toByte(),
        0x05.toByte(),
        0x01.toByte(),
        0x09.toByte(),
        0x30.toByte(),
        0x09.toByte(),
        0x31.toByte(),
        0x09.toByte(),
        0x38.toByte(),
        0x15.toByte(),
        0x81.toByte(),
        0x25.toByte(),
        0x7f.toByte(),
        0x75.toByte(),
        0x08.toByte(),
        0x95.toByte(),
        0x03.toByte(),
        0x81.toByte(),
        0x06.toByte(),
        0xc0.toByte(),
        0xc0.toByte(),
        0x05.toByte(),
        0x01.toByte(),
        0x09.toByte(),
        0x06.toByte(),
        0xa1.toByte(),
        0x01.toByte(),
        0x85.toByte(),
        0x02.toByte(),
        0x05.toByte(),
        0x07.toByte(),
        0x19.toByte(),
        0xE0.toByte(),
        0x29.toByte(),
        0xE7.toByte(),
        0x15.toByte(),
        0x00.toByte(),
        0x25.toByte(),
        0x01.toByte(),
        0x75.toByte(),
        0x01.toByte(),
        0x95.toByte(),
        0x08.toByte(),
        0x81.toByte(),
        0x02.toByte(),
        0x95.toByte(),
        0x01.toByte(),
        0x75.toByte(),
        0x08.toByte(),
        0x15.toByte(),
        0x00.toByte(),
        0x25.toByte(),
        0x65.toByte(),
        0x19.toByte(),
        0x00.toByte(),
        0x29.toByte(),
        0x65.toByte(),
        0x81.toByte(),
        0x00.toByte(),
        0x05.toByte(),
        0x08.toByte(),
        0x95.toByte(),
        0x05.toByte(),
        0x75.toByte(),
        0x01.toByte(),
        0x19.toByte(),
        0x01.toByte(),
        0x29.toByte(),
        0x05.toByte(),
        0x91.toByte(),
        0x02.toByte(),
        0x95.toByte(),
        0x01.toByte(),
        0x75.toByte(),
        0x03.toByte(),
        0x91.toByte(),
        0x03.toByte(),
        0xc0.toByte()
    )


2.4 键盘映射表

    <string name="KeyText1" translatable="false">Esc</string>
    <string name="KeyCode1" translatable="false">29</string> <!-- Keyboard ESCAPE -->
    <string name="KeyText2" translatable="false">F1</string>
    <string name="KeyCode2" translatable="false">3a</string> <!-- Keyboard F1 -->
    <string name="KeyText3" translatable="false">F2</string>
    <string name="KeyCode3" translatable="false">3b</string> <!-- Keyboard F2 -->
    <string name="KeyText4" translatable="false">F3</string>
    <string name="KeyCode4" translatable="false">3c</string> <!-- Keyboard F3 -->
    <string name="KeyText5" translatable="false">F4</string>
    <string name="KeyCode5" translatable="false">3d</string> <!-- Keyboard F4 -->
    <string name="KeyText6" translatable="false">F5</string>
    <string name="KeyCode6" translatable="false">3e</string> <!-- Keyboard F5 -->
    <string name="KeyText7" translatable="false">F6</string>
    <string name="KeyCode7" translatable="false">3f</string> <!-- Keyboard F6 -->
    <string name="KeyText8" translatable="false">F7</string>
    <string name="KeyCode8" translatable="false">40</string> <!-- Keyboard F7 -->
    <string name="KeyText9" translatable="false">F8</string>
    <string name="KeyCode9" translatable="false">41</string> <!-- Keyboard F8 -->
    <string name="KeyText10" translatable="false">F9</string>
    <string name="KeyCode10" translatable="false">42</string> <!-- Keyboard F9 -->
    <string name="KeyText11" translatable="false">F10</string>
    <string name="KeyCode11" translatable="false">43</string> <!-- Keyboard F10 -->
    <string name="KeyText12" translatable="false">F11</string>
    <string name="KeyCode12" translatable="false">44</string> <!-- Keyboard F11 -->
    <string name="KeyText13" translatable="false">F12</string>
    <string name="KeyCode13" translatable="false">45</string> <!-- Keyboard F12 -->
    <string name="KeyText14" translatable="false">`&#160;&#160;~</string>
    <string name="KeyCode14" translatable="false">35</string> <!-- Keyboard ` and ~ -->
    <string name="KeyText15" translatable="false">1&#160;&#160;!</string>
    <string name="KeyCode15" translatable="false">1e</string> <!-- Keyboard 1 and ! -->
    <string name="KeyText16" translatable="false">2&#160;&#160;@</string>
    <string name="KeyCode16" translatable="false">1f</string> <!-- Keyboard 2 and @ -->
    <string name="KeyText17" translatable="false">3&#160;&#160;#</string>
    <string name="KeyCode17" translatable="false">20</string> <!-- Keyboard 3 and # -->
    <string name="KeyText18" translatable="false">4&#160;&#160;$</string>
    <string name="KeyCode18" translatable="false">21</string> <!-- Keyboard 4 and $ -->
    <string name="KeyText19" translatable="false">5&#160;&#160;%</string>
    <string name="KeyCode19" translatable="false">22</string> <!-- Keyboard 5 and % -->
    <string name="KeyText20" translatable="false">6&#160;&#160;^</string>
    <string name="KeyCode20" translatable="false">23</string> <!-- Keyboard 6 and ^ -->
    <string name="KeyText21" translatable="false">7&#160;&#160;&amp;</string>
    <string name="KeyCode21" translatable="false">24</string> <!-- Keyboard 7 and & -->
    <string name="KeyText22" translatable="false">8&#160;&#160;*</string>
    <string name="KeyCode22" translatable="false">25</string> <!-- Keyboard 8 and * -->
    <string name="KeyText23" translatable="false">9&#160;&#160;(</string>
    <string name="KeyCode23" translatable="false">26</string> <!-- Keyboard 9 and ( -->
    <string name="KeyText24" translatable="false">0&#160;&#160;)</string>
    <string name="KeyCode24" translatable="false">27</string> <!-- Keyboard 0 and ) -->
    <string name="KeyText25" translatable="false">-&#160;&#160;_</string>
    <string name="KeyCode25" translatable="false">2d</string> <!-- Keyboard - and _ -->
    <string name="KeyText26" translatable="false">=&#160;&#160;+</string>
    <string name="KeyCode26" translatable="false">2e</string> <!-- Keyboard = and + -->
    <string name="KeyText27" translatable="false">Backspace</string>
    <string name="KeyCode27" translatable="false">2a</string> <!-- Keyboard DELETE (Backspace) -->
    <string name="KeyText28" translatable="false">Tab</string>
    <string name="KeyCode28" translatable="false">2b</string> <!-- Keyboard Tab -->
    <string name="KeyText29" translatable="false">Q</string>
    <string name="KeyCode29" translatable="false">14</string> <!-- Keyboard q and Q -->
    <string name="KeyText30" translatable="false">W</string>
    <string name="KeyCode30" translatable="false">1a</string> <!-- Keyboard w and W -->
    <string name="KeyText31" translatable="false">E</string>
    <string name="KeyCode31" translatable="false">08</string> <!-- Keyboard e and E -->
    <string name="KeyText32" translatable="false">R</string>
    <string name="KeyCode32" translatable="false">15</string> <!-- Keyboard r and R -->
    <string name="KeyText33" translatable="false">T</string>
    <string name="KeyCode33" translatable="false">17</string> <!-- Keyboard t and T -->
    <string name="KeyText34" translatable="false">Y</string>
    <string name="KeyCode34" translatable="false">1c</string> <!-- Keyboard y and Y -->
    <string name="KeyText35" translatable="false">U</string>
    <string name="KeyCode35" translatable="false">18</string> <!-- Keyboard u and U -->
    <string name="KeyText36" translatable="false">I</string>
    <string name="KeyCode36" translatable="false">0c</string> <!-- Keyboard i and I -->
    <string name="KeyText37" translatable="false">O</string>
    <string name="KeyCode37" translatable="false">12</string> <!-- Keyboard o and O -->
    <string name="KeyText38" translatable="false">P</string>
    <string name="KeyCode38" translatable="false">13</string> <!-- Keyboard p and P -->
    <string name="KeyText39" translatable="false">[&#160;&#160;{</string>
    <string name="KeyCode39" translatable="false">2f</string> <!-- Keyboard [ and { -->
    <string name="KeyText40" translatable="false">]&#160;&#160;}</string>
    <string name="KeyCode40" translatable="false">30</string> <!-- Keyboard ] and } -->
    <string name="KeyText41" translatable="false">\\&#160;&#160;|</string>
    <string name="KeyCode41" translatable="false">31</string> <!-- Keyboard \ and | -->
    <string name="KeyText42" translatable="false">CapsLock</string>
    <string name="KeyCode42" translatable="false">39</string> <!-- Keyboard Caps Lock -->
    <string name="KeyText43" translatable="false">A</string>
    <string name="KeyCode43" translatable="false">04</string> <!-- Keyboard a and A -->
    <string name="KeyText44" translatable="false">S</string>
    <string name="KeyCode44" translatable="false">16</string> <!-- Keyboard s and S -->
    <string name="KeyText45" translatable="false">D</string>
    <string name="KeyCode45" translatable="false">07</string> <!-- Keyboard d and D -->
    <string name="KeyText46" translatable="false">F</string>
    <string name="KeyCode46" translatable="false">09</string> <!-- Keyboard f and F -->
    <string name="KeyText47" translatable="false">G</string>
    <string name="KeyCode47" translatable="false">0a</string> <!-- Keyboard g and G -->
    <string name="KeyText48" translatable="false">H</string>
    <string name="KeyCode48" translatable="false">0b</string> <!-- Keyboard h and H -->
    <string name="KeyText49" translatable="false">J</string>
    <string name="KeyCode49" translatable="false">0d</string> <!-- Keyboard j and J -->
    <string name="KeyText50" translatable="false">K</string>
    <string name="KeyCode50" translatable="false">0e</string> <!-- Keyboard k and K -->
    <string name="KeyText51" translatable="false">L</string>
    <string name="KeyCode51" translatable="false">0f</string> <!-- Keyboard l and L -->
    <string name="KeyText52" translatable="false">;&#160;&#160;:</string>
    <string name="KeyCode52" translatable="false">33</string> <!-- Keyboard ; and : -->
    <string name="KeyText53" translatable="false">\'&#160;&#160;\"</string>
    <string name="KeyCode53" translatable="false">34</string> <!-- Keyboard ' and " -->
    <string name="KeyText54" translatable="false">Enter</string>
    <string name="KeyCode54" translatable="false">28</string> <!-- Keyboard Return (ENTER) -->
    <string name="KeyText55" translatable="false">Shift</string>
    <string name="KeyCode55" translatable="false">02</string> <!-- Keyboard Left Shift -->
    <string name="KeyText56" translatable="false">Z</string>
    <string name="KeyCode56" translatable="false">1d</string> <!-- Keyboard z and Z -->
    <string name="KeyText57" translatable="false">X</string>
    <string name="KeyCode57" translatable="false">1b</string> <!-- Keyboard x and X -->
    <string name="KeyText58" translatable="false">C</string>
    <string name="KeyCode58" translatable="false">06</string> <!-- Keyboard c and C -->
    <string name="KeyText59" translatable="false">V</string>
    <string name="KeyCode59" translatable="false">19</string> <!-- Keyboard v and V -->
    <string name="KeyText60" translatable="false">B</string>
    <string name="KeyCode60" translatable="false">05</string> <!-- Keyboard b and B -->
    <string name="KeyText61" translatable="false">N</string>
    <string name="KeyCode61" translatable="false">11</string> <!-- Keyboard n and N -->
    <string name="KeyText62" translatable="false">M</string>
    <string name="KeyCode62" translatable="false">10</string> <!-- Keyboard m and M -->
    <string name="KeyText63" translatable="false">,&#160;&#160;&lt;</string>
    <string name="KeyCode63" translatable="false">36</string> <!-- Keyboard , and < -->
    <string name="KeyText64" translatable="false">.&#160;&#160;&gt;</string>
    <string name="KeyCode64" translatable="false">37</string> <!-- Keyboard . and > -->
    <string name="KeyText65" translatable="false">/&#160;&#160;?</string>
    <string name="KeyCode65" translatable="false">38</string> <!-- Keyboard / and ? -->
    <string name="KeyText66" translatable="false">Shift</string>
    <string name="KeyCode66" translatable="false">20</string> <!-- Keyboard Right Shift -->
    <string name="KeyText67" translatable="false">Ctrl</string>
    <string name="KeyCode67" translatable="false">01</string> <!-- Keyboard Left Ctrl -->
    <string name="KeyText68" translatable="false">⊞</string>
    <string name="KeyCode68" translatable="false">08</string> <!-- Keyboard Left Win -->
    <string name="KeyText69" translatable="false">Alt</string>
    <string name="KeyCode69" translatable="false">04</string> <!-- Keyboard Left Alt -->
    <string name="KeyText70" translatable="false">SPACE</string>
    <string name="KeyCode70" translatable="false">2c</string> <!-- Keyboard Space -->
    <string name="KeyText71" translatable="false">Alt</string>
    <string name="KeyCode71" translatable="false">40</string> <!-- Keyboard Right Alt -->
    <string name="KeyText72" translatable="false">Win</string>
    <string name="KeyCode72" translatable="false">80</string> <!-- Keyboard Right Win -->
    <string name="KeyText73" translatable="false">☰</string>
    <string name="KeyCode73" translatable="false">65</string> <!-- Keyboard Application -->
    <string name="KeyText74" translatable="false">Ctrl</string>
    <string name="KeyCode74" translatable="false">10</string> <!-- Keyboard Right Ctrl -->
    <string name="KeyText75" translatable="false">Print Screen</string>
    <string name="KeyCode75" translatable="false">46</string> <!-- Keyboard Print Screen -->
    <string name="KeyText76" translatable="false">Scroll Lock</string>
    <string name="KeyCode76" translatable="false">47</string> <!-- Keyboard Scroll Lock -->
    <string name="KeyText77" translatable="false">PAUSE</string>
    <string name="KeyCode77" translatable="false">48</string> <!-- Keyboard Pause -->
    <string name="KeyText78" translatable="false">Insert</string>
    <string name="KeyCode78" translatable="false">49</string> <!-- Keyboard Insert -->
    <string name="KeyText79" translatable="false">Home</string>
    <string name="KeyCode79" translatable="false">4a</string> <!-- Keyboard Home -->
    <string name="KeyText80" translatable="false">PgUp</string>
    <string name="KeyCode80" translatable="false">4b</string> <!-- Keyboard Page Up -->
    <string name="KeyText81" translatable="false">Delete</string>
    <string name="KeyCode81" translatable="false">4c</string> <!-- Keyboard Delete Forward -->
    <string name="KeyText82" translatable="false">End</string>
    <string name="KeyCode82" translatable="false">4d</string> <!-- Keyboard End -->
    <string name="KeyText83" translatable="false">PgDn</string>
    <string name="KeyCode83" translatable="false">4e</string> <!-- Keyboard Page Down -->
    <string name="KeyText84" translatable="false">▲</string>
    <string name="KeyCode84" translatable="false">52</string> <!-- Keyboard Up Arrow -->
    <string name="KeyText85" translatable="false">◀</string>
    <string name="KeyCode85" translatable="false">50</string> <!-- Keyboard Left Arrow -->
    <string name="KeyText86" translatable="false">▼</string>
    <string name="KeyCode86" translatable="false">51</string> <!-- Keyboard Down Arrow -->
    <string name="KeyText87" translatable="false">▶</string>
    <string name="KeyCode87" translatable="false">4f</string> <!-- Keyboard Right Arrow -->

2.5 通过HID发送键盘事件

        通过HID设备,发送report,

HidDevice!!.sendReport(HidUtils.mDevice, report.ReportId.toInt(), report.ReportData)


 三,实例

 

       需要源码,请私信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第15集丨Vue 江湖 —— 组件

目录 一、为什么需要组件1.1 传统方式编写应用1.2 使用组件方式编写应用1.3 Vue的组件管理 二、Vue中的组件1.1 基本概念1.1.1 组件分类1.1.2 Vue中使用组件的三大步骤:1.1.3 如何定义一个组件1.1.4 如何注册组件1.1.5 如何使用组件 1.2 注意点1.2.1 关于组件名1.2.2 关于组件标…

14.Linkedin在中国市场的主要竞争对手

自Linkedin敲响了中国的大门之后,在国内市场也拥有了大量的用户。经过不断地发展了改革创新,更是成为了国内影响力比较大的职业社交平台之一。为了能够在国内市场中取得成功,在进入国内之前,Linkedin就采取了全新的模式,不仅仅是销售机构,也具备了产品技术、市场、公关等完整的…

达芬奇无法播放视频,黑屏,不能预览画面

说一下其中一个原因&#xff0c;是因为用了像是xdisplay&#xff0c;super display这类软件&#xff0c;他们会安装一个显卡驱动而这个驱动就会导致这个问题。 方法很简单&#xff0c;在设备管理器里面&#xff0c;显示卡一览&#xff0c;卸载掉除了你的电脑显卡以外的虚拟显卡…

webpack 从入门到放弃!

webpack webpack于2012年3月10号诞生&#xff0c;作者是Tobias(德国)。参考GWT(Google Web Toolkit)的code splitting功能在webpack中进行实现。然后在2014年Instagram团队分享性能优化时&#xff0c;提出使用webpack的code splitting特性从而大火。 现在webpack的出现模糊了任…

计算机视觉目标检测性能指标

目录 精确率&#xff08;Precision&#xff09;和召回率&#xff08;Recall&#xff09; F1分数&#xff08;F1 Score&#xff09; IoU&#xff08;Intersection over Union&#xff09; P-R曲线&#xff08;Precision-Recall Curve&#xff09;和 AP mAP&#xff08;mean…

Redis中使用lua脚本

微信公众号访问地址&#xff1a;Redis中使用lua脚本 推荐文章&#xff1a; 1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表; 2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据; 3、为什么引入Redisson分布式锁&#xff1f; 4、Redisso…

60页数字政府智慧政务大数据资源平台项目可研方案PPT

导读&#xff1a;原文《60页数字政府智慧政务大数据资源平台项目可研方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 项目需求分析 项目建设原则和基本策略…

C++之类之间访问函数指针(一百八十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

一、window配置微软商店中的Ubuntu,及错误解决方法

&#xff08;1&#xff09;首先&#xff0c;在微软商店中搜索“Ubuntu”&#xff0c;下载你喜欢的版本(此处) &#xff08;2&#xff09;设置适用于window的Linux子系统&#xff0c;跟着红色方框走 点击“确定”之后&#xff0c;会提示你重启电脑&#xff0c;按要求重启电脑即可…

无涯教程-Perl - sub函数

描述 此函数定义一个新的子例程。上面显示的参数遵循以下规则- NAME是子例程的名称。可以在有或没有原型规范的情况下预先声明命名的子例程(没有关联的代码块)。 匿名子例程必须具有定义。 PROTO定义了函数的原型,调用该函数以验证提供的参数时将使用该原型。 ATTRS为解析…

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——假言—公式化转换—等价+矛盾

文章目录 第一节 假言—公式化转换—等价矛盾真题&#xff08;2012—38&#xff09;—假言—A→B的公式化转换—A→B的等价命题&#xff1a;①逆否命题&#xff1a;非B→非A。真题&#xff08;2015—47&#xff09; —假言A→B的公式化转换—A→B的等价命题&#xff1a;①逆否…

重新定义物化视图,你必须拥有的极速湖仓神器!

当今企业在进行数据分析时&#xff0c;面临着多重问题和挑战&#xff0c;而数据加工作为其中不可或缺的一环显得尤为重要。 首要的挑战在于数据加工的复杂性。从数据的产生到最终产生价值的整个链路仍然十分复杂&#xff0c;涉及多个环节和技术方案&#xff0c;这导致了技术复…

Java培训机构出来的好找工作吗?有的人还是没有工资!

Java培训机构出来的好找工作吗?为什么有的人找不到呢?事实上&#xff0c;参加Java培训机构并不是直接保证找到工作&#xff0c;而是提供了一定的学习和就业支持。以下是关于Java培训机构和就业的一些要点&#xff1a; 1.学习质量和教学内容 好的Java培训机构通常提供系统化、…

设计模式 : 单例模式笔记

文章目录 一.单例模式二.单例模式的两种实现方式饿汉模式懒汉模式 一.单例模式 一个类只能创建一个对象,这样的类的设计模式就称为单例模式,该模式保证系统中该类只能有一个实例(并且父子进程共享),一个很典型的单例类就是CSTL的内存池C单例模式的基本设计思路: 私有化构造函数…

海外应用ASO优化的小技巧2

应用程序的名称可以表达很多内容&#xff0c;是应用程序元数据的重要组成部分&#xff0c;一个强大的标题可以识别应用中的潜在消费者&#xff0c;使得用户看名字就可以知道这个程序是做什么的&#xff0c;从而有助于转化率的提高。 1、详细的标题可以更好地帮助我们的软件。 …

windows权限维持—黄金白银票据隐藏用户远控RustDeskGotoHttp

windows权限维持—黄金白银票据&隐藏用户&远控&RustDesk&GotoHttp 1. 前置1.1. 初始问题1.1.1. 解决办法 2. 隐藏用户2.1. 工具原理2.2. 案例操作2.2.1. 单机添加用户2.2.1.1. 工具添加用户2.2.1.2. 工具查看隐藏用户2.2.1.3. 本地查看隐藏用户 2.2.2. 域内添加…

机器学习丨1. 机器学习概述

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…

IT团队如何引领企业走向创造价值的新途径?

随着疫情结束带来的经济回暖&#xff0c;我们无疑已做好了更充分的准备。信息技术使许多企业能够在关门歇业的情况下继续运营&#xff0c;以防止大规模集会并强制执行社会隔离。得益于信息技术支持团队&#xff0c;许多企业能够动员其员工进行远程工作&#xff0c;有些甚至只需…

C++ template 循环

在元编程循环中&#xff0c;我们不需要用while&#xff0c;for来循环&#xff0c;一般情况下都要用递归&#xff0c;例如&#xff1a; #include <iostream> using namespace std; template <int Head, int...Data> constexpr static int num Head num<Data..…

企业类型的软件著作权证书申请,一次通过十几张

大家好&#xff0c;我是小悟 关于软件著作权证书申请的内容&#xff0c;已经聊过很多次了&#xff0c;之前申请的都是个人类型&#xff0c;尝试了一下申请企业类型的&#xff0c;一口气提交了多张&#xff0c;也都顺利通过了。 其实个人和企业类型所需要的资料并没有什么差别&…