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

RK3576 Android14 状态栏和导航栏增加显示控制功能

  问题背景:

     因为RK3576 Android14用户需要手动控制状态栏和导航栏显示隐藏控制,包括对锁屏后下拉状态栏的屏蔽,在设置功能里增加此功能的控制,故参考一些博客完成此功能,以下是具体代码路径的修改内容。

解决方案:

1、 修改系统默认配置

代码位置:device/rockchip/rk3576/device.mk

PRODUCT_PROPERTY_OVERRIDES += \
+    persist.sys.statusbar.enable=true \
+    persist.sys.navigationbar.enable=true

2、修改SystemUI

android/frameworks/base/packages/SystemUI/AndroidManifest.xml

    <protected-broadcast android:name="com.android.systemui.action.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG" />+    <!-- For statusbar show or not -->
+    <protected-broadcast android:name="com.systemui.statusbar.show" />
+    <protected-broadcast android:name="com.systemui.statusbar.hide" />
+    <!-- For NavigationBar show or not -->
+    <protected-broadcast android:name="com.systemui.navigationbar.show" />
+    <protected-broadcast android:name="com.systemui.navigationbar.hide" /><applicationandroid:name=".SystemUIApplication"android:persistent="true"

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java

    import android.content.res.Resources;public static final int FADE_KEYGUARD_DURATION = 300;public static final int FADE_KEYGUARD_DURATION_PULSING = 96;+    private static final String ACTION_HIDE_STATUS_BAR = "com.systemui.statusbar.hide";
+    private static final String ACTION_SHOW_STATUS_BAR = "com.systemui.statusbar.show";
+    private static final String ACTION_HIDE_NAVIGATION_BAR = "com.systemui.navigationbar.hide";
+   private static final String ACTION_SHOW_NAVIGATION_BAR = "com.systemui.navigationbar.show";+    public static final String SYS_PROPERTY_STATUS_BAR = "persist.sys.statusbar.enable";
+    public static final String SYS_PROPERTY_NAVIGATION_BAR = "persist.sys.navigationbar.enable";@Overridepublic void start() {mScreenLifecycle.addObserver(mScreenObserver);..........................mConfigurationController.addCallback(mConfigurationListener);mBatteryController.observe(mLifecycle, mBatteryStateChangeCallback);mLifecycle.setCurrentState(RESUMED);+        //根据系统设置参数控制状态栏显示隐藏
+        boolean statusBarDisplay=SystemProperties.getBoolean(SYS_PROPERTY_STATUS_BAR, false);
+       Log.d(TAG, "----------default---------statusBarDisplay:"+statusBarDisplay);
+       if (!statusBarDisplay) {
+                mStatusBarWindowController.setBarVisibility(View.GONE);
+        }        }mAccessibilityFloatingMenuController.init();...........................// ================================================================================protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {.......................mStatusBarInitializer.initializeStatusBar(mCentralSurfacesComponent::createCollapsedStatusBarFragment);mStatusBarTouchableRegionManager.setup(this, getNotificationShadeWindowView());+        //createNavigationBar(result);
+        //根据系统设置参数控制导航栏显示隐藏
+        boolean navigationBarDisplay=SystemProperties.getBoolean(SYS_PROPERTY_NAVIGATION_BAR, false);
+        Log.d(TAG, "----------default---------navigationBarDisplay:"+navigationBarDisplay);
+        if (navigationBarDisplay) {
+            createNavigationBar(result);
+        }//==============================================================================@VisibleForTestingprotected void registerBroadcastReceiver() {IntentFilter filter = new IntentFilter();..................
+        filter.addAction(ACTION_HIDE_NAVIGATION_BAR);
+        filter.addAction(ACTION_SHOW_NAVIGATION_BAR);
+        filter.addAction(ACTION_HIDE_STATUS_BAR);
+        filter.addAction(ACTION_SHOW_STATUS_BAR);filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG);context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);//========================================================================private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {..............}else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {mQSPanel.showDeviceMonitoringDialog();}//状态栏和导航栏显示隐藏控制
+             else if (ACTION_HIDE_NAVIGATION_BAR.equals(action)) {
+                Log.d(TAG, "---ACTION_HIDE_NAVIGATION_BAR---");
+                SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, "false");
+                mNavigationBarController.onDisplayRemoved(mDisplayId);
+            } else if (ACTION_SHOW_NAVIGATION_BAR.equals(action)) {
+                 Log.d(TAG, "---ACTION_SHOW_NAVIGATION_BAR---");
+                SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, "true");
+                mNavigationBarController.onDisplayReady(mDisplayId);
+            } else if (ACTION_HIDE_STATUS_BAR.equals(action)) {
+                Log.d(TAG, "---ACTION_HIDE_STATUS_BAR---");
+                SystemProperties.set(SYS_PROPERTY_STATUS_BAR, "false");
+                mStatusBarWindowController.setBarVisibility(View.GONE);
+            } else if (ACTION_SHOW_STATUS_BAR.equals(action)) {
+                Log.d(TAG, "---ACTION_SHOW_STATUS_BAR---");
+                SystemProperties.set(SYS_PROPERTY_STATUS_BAR, "true");
+                mStatusBarWindowController.setBarVisibility(View.VISIBLE);}}};

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java

+    /**
+     * Sets the visibility of the status bar window.
+     * 设置状态栏的可见性
+     */
+    public void setBarVisibility(int visibility) {
+        mStatusBarWindowView.setVisibility(visibility);
+    }

frameworks/base/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java   修改三个方法此类主要是锁屏后状态栏处理

import android.os.SystemProperties;
import com.android.systemui.statusbar.phone.CentralSurfacesImpl;//===========================================private void setExpandedHeightInternal(float h) {..................................if (mExpandedHeight < 1f && mExpandedHeight != 0f && mClosing) {mExpandedHeight = 0f;if (mHeightAnimator != null) {mHeightAnimator.end();}}mExpandedFraction = Math.min(1f,maxPanelHeight == 0 ? 0 : mExpandedHeight / maxPanelHeight);
+             int barState = getBarState();
+             //根据系统设置参数控制锁平后面板是否显示 ,禁止对状态栏布局设置
+             boolean statusBarDisplay=SystemProperties.getBoolean(CentralSurfacesImpl.SYS_PROPERTY_STATUS_BAR, false);
+             //非锁屏的状态栏状态栏下拉面板隐藏处理
+              if (!statusBarDisplay && barState!=KEYGUARD) {
+                 mExpandedFraction=0;
+             }mQsController.setShadeExpansion(mExpandedHeight, mExpandedFraction);mExpansionDragDownAmountPx = h;mAmbientState.setExpansionFraction(mExpandedFraction);//====================================================public final class TouchHandler implements View.OnTouchListener, Gefingerpoken {private long mLastTouchDownTime = -1L;/** @see ViewGroup#onInterceptTouchEvent(MotionEvent) */@Overridepublic boolean onInterceptTouchEvent(MotionEvent event) {..............................if (!mQsController.shouldQuickSettingsIntercept(mDownX, mDownY, 0)&& mPulseExpansionHandler.onInterceptTouchEvent(event)) {mShadeLog.v("NotificationPanelViewController MotionEvent intercepted: "+ "PulseExpansionHandler");return true;}
+            //根据系统设置参数控制锁平后面板是否显示 ,拦截触摸事件分发boolean statusBarDisplay=SystemProperties.getBoolean(CentralSurfacesImpl.SYS_PROPERTY_STATUS_BAR, false);
+            if (!statusBarDisplay && !isFullyCollapsed() && mQsController.onIntercept(event)) {debugLog("onQsIntercept true");mShadeLog.v("NotificationPanelViewController MotionEvent intercepted: "+ "QsIntercept");
//=============================================@Overridepublic boolean onTouchEvent(MotionEvent event) {....................................if (mListenForHeadsUp && !mHeadsUpTouchHelper.isTrackingHeadsUp()&& !mNotificationStackScrollLayoutController.isLongPressInProgress()&& mHeadsUpTouchHelper.onInterceptTouchEvent(event)) {mMetricsLogger.count(COUNTER_PANEL_OPEN_PEEK, 1);}boolean handled = mHeadsUpTouchHelper.onTouchEvent(event);+            //根据系统设置参数控制状态栏下拉面板显示隐藏,屏蔽状态了下滑事件boolean statusBarDisplay=SystemProperties.getBoolean(CentralSurfacesImpl.SYS_PROPERTY_STATUS_BAR, false);
+            if (statusBarDisplay && !mHeadsUpTouchHelper.isTrackingHeadsUp() && mQsController.handleTouch(event, isFullyCollapsed(), isShadeOrQsHeightAnimationRunning())) {if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {mShadeLog.logMotionEvent(event, "onTouch: handleQsTouch handled event");.......................................

3、修改Settings  APP

android/packages/apps/Settings/res/values-zh-rCN/strings.xml

+    <!--状态栏和导航栏开关设置 -->
+    <string name="ctrl_statusbar">状态栏</string>
+    <string name="ctrl_navigationbar">导航栏</string></resources>

android/packages/apps/Settings/res/values/strings.xml

+   <!--状态栏和导航栏开关设置 -->
+    <string name="ctrl_statusbar">StatusBar</string>
+    <string name="ctrl_navigationbar">NavigationBar</string>
</resources>

android/packages/apps/Settings/res/xml/display_settings.xml

        settings:userRestriction="no_config_brightness"><intent android:action="com.android.intent.action.SHOW_BRIGHTNESS_DIALOG" /></com.android.settingslib.RestrictedPreference>+    <SwitchPreference
+                android:key="ctrl_statusbar"
+                android:title="@string/ctrl_statusbar"/>+    <SwitchPreference
+                android:key="ctrl_navigationbar"
+                android:title="@string/ctrl_navigationbar"/><com.android.settings.display.NightDisplayPreferenceandroid:key="night_display"

android/packages/apps/Settings/src/com/android/settings/DisplaySettings.java

import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.SearchIndexable;+import com.android.settings.display.StatusBarPreferenceController;
+import com.android.settings.display.NavigationBarPreferenceController;
import java.util.ArrayList;
import java.util.List;controllers.add(new AwEnhanceModePreferenceController(context));controllers.add(new AwSmartBacklightPreferenceController(context));controllers.add(new AwColorTemperaturePreferenceController(context));
+        controllers.add(new StatusBarPreferenceController(context));
+        controllers.add(new NavigationBarPreferenceController(context));return controllers;}

android/packages/apps/Settings/src/com/android/settings/display/NavigationBarPreferenceController.java (新增)

package com.android.settings.display;import android.content.Context;
import android.provider.Settings;
import androidx.preference.SwitchPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import android.content.Intent;
import android.util.Log;
import android.os.SystemProperties;
/*** 根据系统设置参数控制导航栏显示隐藏*  */ 
public class NavigationBarPreferenceController extends AbstractPreferenceControllerimplements PreferenceControllerMixin, Preference.OnPreferenceChangeListener {private static final String TAG = "NavigationBarPreferenceController";private static final String KEY_NAVIGATION_BAR = "ctrl_navigationbar";public static final String ACTION_HIDE_NAVIGATION_BAR = "com.systemui.navigationbar.hide";public static final String ACTION_SHOW_NAVIGATION_BAR = "com.systemui.navigationbar.show";public NavigationBarPreferenceController(Context context) {super(context);}@Overridepublic String getPreferenceKey() {return KEY_NAVIGATION_BAR;}@Overridepublic boolean isAvailable() {return true;}@Overridepublic void displayPreference(PreferenceScreen screen) {if (!isAvailable()) {setVisible(screen, KEY_NAVIGATION_BAR, true);return;}final SwitchPreference mNavigationBarPreference = screen.findPreference(KEY_NAVIGATION_BAR);if (mNavigationBarPreference != null) {String value = SystemProperties.get("persist.sys.navigationbar.enable", "true");mNavigationBarPreference.setChecked(value.equals("true"));mNavigationBarPreference.setOnPreferenceChangeListener(this);}}@Overridepublic void updateState(Preference preference) {String value = SystemProperties.get("persist.sys.navigationbar.enable", "true");Log.d(TAG, "---updateState--- value: " + value);((SwitchPreference) preference).setChecked(value.equals("true"));}@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {boolean value = (Boolean) newValue;Log.d(TAG, "---onPreferenceChange--- value: " + value);Intent intent = new Intent();if (value) {intent.setAction(ACTION_SHOW_NAVIGATION_BAR);} else {intent.setAction(ACTION_HIDE_NAVIGATION_BAR);}mContext.sendBroadcast(intent);return true;}
}

android/packages/apps/Settings/src/com/android/settings/display/StatusBarPreferenceController.java(新增)

package com.android.settings.display;import android.content.Context;
import android.provider.Settings;
import androidx.preference.SwitchPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import android.content.Intent;
import android.util.Log;
import android.os.SystemProperties;
/*** 根据系统设置参数控制状态栏显示隐藏*  */ 
public class StatusBarPreferenceController extends AbstractPreferenceController implementsPreferenceControllerMixin, Preference.OnPreferenceChangeListener {private static final String TAG = "StatusBarPreferenceController";private static final String KEY_STATUS_BAR = "ctrl_statusbar";public static final String ACTION_HIDE_STATUS_BAR = "com.systemui.statusbar.hide";public static final String ACTION_SHOW_STATUS_BAR = "com.systemui.statusbar.show";public StatusBarPreferenceController(Context context) {super(context);}@Overridepublic String getPreferenceKey() {return KEY_STATUS_BAR;}@Overridepublic boolean isAvailable() {return true;}@Overridepublic void displayPreference(PreferenceScreen screen) {if (!isAvailable()) {setVisible(screen, KEY_STATUS_BAR, true);return;}final SwitchPreference mStatusBarPreference = screen.findPreference(KEY_STATUS_BAR);if (mStatusBarPreference != null) {String value = SystemProperties.get("persist.sys.statusbar.enable", "true");mStatusBarPreference.setChecked(value.equals("true"));mStatusBarPreference.setOnPreferenceChangeListener(this);}}@Overridepublic void updateState(Preference preference) {String value = SystemProperties.get("persist.sys.statusbar.enable", "true");Log.d(TAG, "---updateState--- value: " + value);((SwitchPreference) preference).setChecked(value.equals("true"));}@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {boolean value = (Boolean) newValue;Log.d(TAG, "---onPreferenceChange--- value: " + value);Intent intent = new Intent();if (value) {intent.setAction(ACTION_SHOW_STATUS_BAR);} else {intent.setAction(ACTION_HIDE_STATUS_BAR);}mContext.sendBroadcast(intent); // 发送广播return true;}
}

4、设置-->显示菜单里的效果如下图

相关文章:

RK3576 Android14 状态栏和导航栏增加显示控制功能

问题背景&#xff1a; 因为RK3576 Android14用户需要手动控制状态栏和导航栏显示隐藏控制&#xff0c;包括对锁屏后下拉状态栏的屏蔽&#xff0c;在设置功能里增加此功能的控制&#xff0c;故参考一些博客完成此功能&#xff0c;以下是具体代码路径的修改内容。 解决方案&…...

SDL2:arm64下编译使用 -- SDL2多媒体库使用音频实例

更多内容&#xff1a;XiaoJ的知识星球 SDL2&#xff1a;Android-arm64端编译使用 2. SDL2&#xff1a;Android-arm64端编译使用2.1 安装和配置NDK2.2 下载编译SDL22.3 SDL2使用示例&#xff1a;Audio2.4 Android设备运行 2. SDL2&#xff1a;Android-arm64端编译使用 在Linux系…...

Syncthing在ubuntu下的安装使用

以前安装这个软件的时候&#xff0c; 是在windows和mac上&#xff0c;都是图形化的安装方式&#xff0c;但是ubuntu不太一样&#xff0c;需要增加源&#xff0c;然后执行命令。安装的系统版本是2004。 参考链接1&#xff0c;主要命令包含下面几个部分&#xff1a; 第一步&…...

使用 Helm 安装 Redis 集群

在 Kubernetes 集群中使用 Helm 安装 Redis 集群可以极大地简化部署和管理 Redis 的过程。本文将详细介绍如何使用 Helm 安装 Redis 集群&#xff0c;并提供一些常见问题的解决方案。 前提条件 Kubernetes 集群。&#xff08;略&#xff09;已安装 Helm 工具。搭建了存储类nf…...

基于32QAM的载波同步和定时同步性能仿真,包括Costas环的gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…...

【ArcGIS微课1000例】0140:总览(鹰眼)、放大镜、查看器的用法

文章目录 一、总览工具二、放大镜工具三、查看器工具ArcGIS中提供了三种局部查看的工具: 总览(鹰眼)、放大镜、查看器,如下图所示,本文讲述这三种工具的使用方法。 一、总览工具 为了便于效果查看与比对,本实验采用全球影像数据(位于配套实验数据包中的0140.rar中),加…...

使用QQ登录(头条项目-09)

一 QQ登录开发文档 QQ登录&#xff1a;即我们所说的 第三⽅登录&#xff0c;是指⽤户可以不在本项⽬中输⼊密码&#xff0c;⽽直接 通过第三⽅的验证&#xff0c;成功登录本项⽬。 1.1 QQ互联开发者申请步骤 若想实现QQ登录&#xff0c;需要成为 QQ互联的开发者&#xff0c;…...

iOS页面设计:UIScrollView布局问题与应对策略

在iOS开发中&#xff0c;UIScrollView是一个极其重要且常用的控件&#xff0c;它允许用户通过手势滑动查看大量内容。然而&#xff0c;在利用UIScrollView进行页面布局时&#xff0c;开发者往往会遇到一些挑战。本文将深入探讨UIScrollView布局中常见的问题&#xff0c;并提供相…...

Linux提权-02 sudo提权

文章目录 1. sudo 提权原理1.1 原理1.2 sudo文件配置 2. 提权利用方式2.1 sudo权限分配不当2.2 sudo脚本篡改2.3 sudo脚本参数利用2.4 sudo绕过路径执行2.5 sudo LD_PRELOAD环境变量2.6 sudo caching2.7 sudo令牌进程注入 3. 参考 1. sudo 提权原理 1.1 原理 sudo是一个用于在…...

vscode 设置

一、如何在vscode中设置放大缩小代码 1.1.文件—首选项——设置 1.2.在搜索框里输入“Font Ligatures”&#xff0c;然后点击"在settings.json中编辑" 1.3.在setting中&#xff08;"editor.fontLigatures":前&#xff09;添加如下代码 "editor.mous…...

学习threejs,使用FlyControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.FlyControls 相机控制…...

在 C++ 中实现调试日志输出

在 C 编程中&#xff0c;调试日志对于定位问题和优化代码至关重要。有效的调试日志不仅能帮助我们快速定位错误&#xff0c;还能提供有关程序运行状态的有价值的信息。本文将介绍几种常用的调试日志输出方法&#xff0c;并教你如何在日志中添加时间戳。 1. 使用 #ifdef _DEBUG…...

从零搭建一套远程手机的桌面操控和文件传输的小工具

从零搭建一套远程手机的桌面操控和文件传输的小工具 --ADB连接专题 一、前言 前面的篇章中&#xff0c;我们确定了通过基于TCP连接的ADB控制远程手机的操作思路。本篇中我们将进行实际的ADB桥接的具体链路搭建工作&#xff0c;从原理和实际部署和操作层面上&#xff0c;从零…...

Python中的静态方法

目录 什么是静态方法&#xff1f;静态方法的特点 定义和调用静态方法示例&#xff1a;定义一个简单的静态方法 静态方法 vs 类方法 vs 实例方法示例对比 静态方法的应用场景1. &#x1f527; 工具函数2. &#x1f3ed; 工厂方法3. ✅ 数据验证 静态方法的限制总结 静态方法是 P…...

【C++】面试题整理(未完待续)

【C】面试题整理 文章目录 一、概述二、C基础2.1 - 指针在 32 位和 64 位系统中的长度2.2 - 数组和指针2.3 - 结构体对齐补齐2.4 - 头文件包含2.5 - 堆和栈的区别2.6 - 宏函数比较两个数值的大小2.7 - 冒泡排序2.8 - 菱形继承的内存布局2.9 - 继承重写2.10 - 如何禁止类在栈上分…...

每日一题 403. 青蛙过河

403. 青蛙过河 动态规划&#xff0c;状态转移 和 上一步步长 和 当前位置点 有关系 class Solution { public:bool canCross(vector<int>& stones) {int n stones.size();unordered_map<int,unordered_set<int>> dp;unordered_map<int,int> mp;…...

Spring Boot 集成 MongoDB:启动即注入的便捷实践

引言 在现代后端开发中&#xff0c;Spring Boot 凭借其快速开发、自动配置等特性深受开发者喜爱&#xff0c;而 MongoDB 以其灵活的文档存储结构和出色的扩展性&#xff0c;成为处理非结构化数据的首选数据库之一。将两者结合&#xff0c;利用 Spring Boot 的自动配置功能&…...

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…...

R语言的文件操作

R语言的文件操作 引言 在数据科学和分析的过程中&#xff0c;文件操作是不可或缺的一部分。R语言作为一种强大的统计计算和图形作图的编程语言&#xff0c;提供了丰富的文件操作函数&#xff0c;使得用户能够方便地读取和保存数据。本文将详细介绍R语言中的文件操作&#xff…...

锐捷路由器网关RG-NBR6135-E和锐捷交换机 Ruijie Reyee RG-ES224GC 电脑登录web方法

2025年1月17日22:29:35 最近淘了点东西&#xff0c;准备在家里搞一套深度学习的服务器&#xff0c;先把网关和交换机搞到了 锐捷路由器网关RG-NBR6135-E 电脑登录web方法 在拿到机器的时候&#xff0c;如果不是全新建议拿根牙签&#xff0c;差入reset 5-10秒,灯光会全部闪几下…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...