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

Android Framework定制sim卡插入解锁pin码的界面

文章目录

  • 手机设置SIM卡pin码
    • 一、安卓手机
    • 二、苹果手机
  • Android Framework中SIM卡pin码代码
    • 定位pin码提示文本位置
    • 定位pin码java代码位置
  • 定制pin码framework窗口
    • 数字按钮

手机设置SIM卡pin码

设置 SIM 卡 PIN 码可以提高手机的安全性,防止他人在未经授权的情况下使用你的 SIM 卡。但请务必牢记你的 PIN 码,因为连续多次输入错误的 PIN 码可能会导致 SIM 卡被锁定,需要使用 PUK 码解锁。如果你忘记了 PIN 码或 PUK 码,应及时联系你的运营商获取帮助。

以下介绍怎么在手机上开启锁定SIM卡并设置pin码。

一、安卓手机

  1. 打开手机 “设置”。
  2. 在设置中找到 “安全” 或 “密码与安全” 等选项。
  3. 点击进入后,查找 “SIM 卡锁定” 或类似名称的选项。
  4. 进入该选项后,你可能需要输入手机的解锁密码、指纹或面部识别等进行验证。
  5. 验证通过后,开启 “锁定 SIM 卡” 开关。
  6. 此时会提示你输入初始的 PIN 码,一般初始 PIN 码为 “1234” 或 “0000”,具体可咨询运营商。输入正确的初始 PIN 码后点击确定。
  7. 接着你可以设置新的 PIN 码,输入新的 PIN 码并确认。

二、苹果手机

  1. 打开手机 “设置”。
  2. 点击 “蜂窝网络”。
  3. 选择你要设置 PIN 码的 SIM 卡。
  4. 点击 “SIM 卡 PIN 码”。
  5. 开启 “SIM 卡 PIN 码” 开关。
  6. 输入初始 PIN 码(通常为 “1234” 或 “0000”),然后点击 “完成”。
  7. 设置新的 PIN 码并确认。

Android Framework中SIM卡pin码代码

如图打开SIM卡锁定并后,再插入SIM会弹出窗口,要求输入pin码。重启开机锁屏画面也是显示这个:
在这里插入图片描述
可以根据提示文本来定位代码在哪。

定位pin码提示文本位置

find frameworks/base/ -name “*.xml” | xargs grep “请输入 SIM”

frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:        <item quantity="one">请输入 SIM <xliff:g id="carrier" example="CARD 1">%1$s</xliff:g> PIN,您还可以尝试 <xliff:g id="number">%2$d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item>
frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:        <item quantity="other">请输入 SIM <xliff:g id="carrier" example="CARD 1">%1$s</xliff:g> PIN,您还可以尝试 <xliff:g id="number">%2$d</xliff:g> 次。</item>
frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:    <string name="kg_simlock_instructions">请输入 SIM LOCK 解锁密码</string>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:    <string name="keyguard_password_enter_puk_code" msgid="3813154965969758868">"请输入 SIM 卡 PUK 码和新的 PIN 码"</string>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:    <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"请输入 SIM 卡 PIN 码。"</string>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:      <item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:      <item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item>

其中最有可能的是这两处

frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:        <item quantity="other">请输入 SIM <xliff:g id="carrier" example="CARD 1">%1$s</xliff:g> PIN,您还可以尝试 <xliff:g id="number">%2$d</xliff:g> 次。</item>frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:      <item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>

打开第二个查看具体内容
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml

    <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818"><item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item><item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item></plurals>

得到关键字
kg_password_default_pin_message

定位pin码java代码位置

通过上面的关键字,在.java文件中搜索,可定位到java代码

find frameworks/base/ -name "*.java" | xargs grep "kg_password_default_pin_message"
frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java:                msgId = isDefault ? R.plurals.kg_password_default_pin_message :
frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java:                msgId = isDefault ? R.plurals.kg_password_default_pin_message_multi :

frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
这段代码是针对不同情况获取到不同的提示文本。

    private String getPinPasswordErrorMessage(int attemptsRemaining, boolean isDefault) {String displayMessage;int msgId;if (attemptsRemaining == 0) {// 这里是尝试多次pin码都错误情况下的错误提示displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked);} else if (attemptsRemaining > 0) {// 这里是还有可尝试输入pin码的次数情况int count = TelephonyManager.getDefault().getSimCount();if (count < 2) {msgId = isDefault ? R.plurals.kg_password_default_pin_message :R.plurals.kg_password_wrong_pin_code;displayMessage = getContext().getResources().getQuantityString(msgId, attemptsRemaining, attemptsRemaining);} else {msgId = isDefault ? R.plurals.kg_password_default_pin_message_multi :R.plurals.kg_password_wrong_pin_code_multi;int phoneId = SubscriptionManager.getPhoneId(mSubId);SubscriptionInfo info = Dependency.get(KeyguardUpdateMonitor.class).getSubscriptionInfoForSubId(mSubId);Log.d(LOG_TAG, "phoneId : " + phoneId + "; mSubId : " + mSubId + "; info : " + info);if (info!= null && !SubscriptionManager.isValidPhoneId(phoneId)) {phoneId = info.getSimSlotIndex();Log.d(LOG_TAG, "SubscriptionInfo:"+info.toString() + "; phoneId : " + phoneId);}displayMessage = getContext().getResources().getQuantityString(msgId,attemptsRemaining, phoneId + 1, attemptsRemaining);}} else {msgId = isDefault ? R.string.kg_sim_pin_instructions : R.string.kg_password_pin_failed;displayMessage = getContext().getString(msgId);}if (KeyguardEsimArea.isEsimLocked(mContext, mSubId)) {displayMessage = getResources().getString(R.string.kg_sim_lock_esim_instructions, displayMessage);}if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:"+ " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);return displayMessage;}

在SystemUI目录下搜索,发现如下这些地方,有多处,代表锁屏时不同的窗口
在这里插入图片描述

这是由KeyguardSecurityContainer.java中判断,调用哪个layout的view, 对应上面的不同view

    private int getSecurityViewIdForMode(SecurityMode securityMode) {switch (securityMode) {case Pattern: return R.id.keyguard_pattern_view;case PIN: return R.id.keyguard_pin_view;case Password: return R.id.keyguard_password_view;case SimPin: return R.id.keyguard_sim_pin_view;case SimPuk: return R.id.keyguard_sim_puk_view;// Unisoc: Support for SimLockcase SimLock: return !mHideSimLockView? R.id.keyguard_simlock_view : R.id.keyguard_operator_simlock_view;/* For SubsidyLock feature @{ */case SubsidyLock_Lock: return R.id.keyguard_subsidylock_lock_view;case SubsidyLock_EnterCode: return R.id.keyguard_subsidylock_entercode_view;case SubsidyLock_Init: return R.id.keyguard_subsidylock_init_view;/* @} */}return 0;}

这里就是要求用户输入pin码的弹窗代码
KeyguardSimPinView.java, 此类继承自KeyguardPinBasedInputView.java,再上一层父类是KeyguardAbsKeyInputView.java。

先只看KeyguardSimPinView.java的代码
如下是设置文本提示的地方,调用上面提到的getPinPasswordErrorMessage

setLockedSimMessage() {if (mSecurityMessageDisplay != null && getVisibility() == VISIBLE) {if (msg == null) {msg = getPinPasswordErrorMessage(mRemainingAttempts, true);} else {msg = msg.concat(getPinPasswordErrorMessage(mRemainingAttempts, true));}mSecurityMessageDisplay.setMessage(msg);}
}

它对应的layout是这个
keyguard_sim_pin_view.xml

<com.android.keyguard.KeyguardSimPinViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:androidprv="http://schemas.android.com/apk/res-auto"android:id="@+id/keyguard_sim_pin_view"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"androidprv:layout_maxWidth="@dimen/keyguard_security_width"androidprv:layout_maxHeight="@dimen/keyguard_security_max_height"android:gravity="center_horizontal"><!-- 这个是sim卡的图标 --><ImageViewandroid:id="@+id/keyguard_sim"android:layout_width="match_parent"android:layout_height="wrap_content"android:tint="@color/background_protected"android:src="@drawable/ic_lockscreen_sim"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:orientation="vertical"android:gravity="center"android:layout_weight="1"android:layoutDirection="ltr"><!-- 停用 eSIM 卡提示,默认不显示 --><include layout="@layout/keyguard_esim_area"android:id="@+id/keyguard_esim_area"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="@dimen/eca_overlap" /><RelativeLayoutandroid:id="@+id/row0"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:paddingBottom="16dp"><!-- 密码输入框 --><com.android.keyguard.PasswordTextViewandroid:id="@+id/simPinEntry"android:layout_width="@dimen/keyguard_security_width"android:layout_height="match_parent"android:gravity="center"android:layout_centerHorizontal="true"android:layout_marginRight="72dp"androidprv:scaledTextSize="@integer/scaled_password_text_size"android:textColor="?attr/wallpaperTextColor"android:contentDescription="@string/keyguard_accessibility_sim_pin_area"/><Viewandroid:id="@+id/divider"android:layout_width="match_parent"android:layout_height="1dp"android:layout_alignParentBottom="true"android:background="@drawable/pin_divider"/></RelativeLayout><!-- 数字1到9 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><com.android.keyguard.NumPadKeyandroid:id="@+id/key1"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="1"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key2"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="2"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key3"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="3"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><com.android.keyguard.NumPadKeyandroid:id="@+id/key4"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="4"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key5"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="5"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key6"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="6"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:orientation="horizontal"android:layout_weight="1"><com.android.keyguard.NumPadKeyandroid:id="@+id/key7"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="7"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key8"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="8"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key9"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="9"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><!-- 删除按钮 --><com.android.keyguard.AlphaOptimizedImageButtonandroid:id="@+id/delete_button"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"android:background="@drawable/ripple_drawable_pin"android:contentDescription="@string/keyboardview_keycode_delete"style="@style/Keyguard.ImageButton.NumPadDelete"/><!-- 数字0 --><com.android.keyguard.NumPadKeyandroid:id="@+id/key0"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="0"/><!-- 确认输入按钮 --><com.android.keyguard.AlphaOptimizedImageButtonandroid:id="@+id/key_enter"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"style="@style/Keyguard.ImageButton.NumPadEnter"android:background="@drawable/ripple_drawable_pin"android:contentDescription="@string/keyboardview_keycode_enter"/></LinearLayout></LinearLayout><!-- keyguard_eca,它实际是一个引用,指向另一个layout,引用说明在values-land/alias.xml中,代表紧急拔号的ui --><include layout="@layout/keyguard_eca"android:id="@+id/keyguard_selector_fade_container"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_gravity="bottom|center_horizontal"android:gravity="center_horizontal"/><!-- UNISOC: Add for SubsidyLock @{ --><TextViewstyle="?android:attr/buttonBarButtonStyle"android:id="@+id/kg_simpin_dismiss_button"android:layout_width="wrap_content"android:layout_marginTop="@dimen/eca_overlap"android:layout_height="wrap_content"android:text="@string/simlock_dismiss" <!-- 取消 -->android:textAppearance="?android:attr/textAppearanceMedium"android:textSize="@dimen/kg_status_line_font_size"android:textColor="?attr/wallpaperTextColor"android:textAllCaps="@bool/kg_use_all_caps"android:visibility="gone"/><!-- @} --></com.android.keyguard.KeyguardSimPinView>

定制pin码framework窗口

定位到代码后,就可以进行替换
如果把这个layout放到Android Studio中预览,就是如图的样子:
在这里插入图片描述
知道layout就可以做针对性的修改了,
比如不要显示最上方的sim卡图标,则在layout中加个android:visibility=“gone”
详情如下:

    <ImageViewandroid:id="@+id/keyguard_sim"android:layout_width="match_parent"android:layout_height="wrap_content"android:tint="@color/background_protected"android:visibility="gone"android:src="@drawable/ic_lockscreen_sim"/>

比如要改数字按钮,则就改com.android.keyguard.NumPadKey

数字按钮

代码NumPadKey.java

    public NumPadKey(Context context, AttributeSet attrs, int defStyle) {this(context, attrs, defStyle, R.layout.keyguard_num_pad_key);}

layout keyguard_num_pad.key.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android"><TextViewandroid:id="@+id/digit_text"style="@style/Widget.TextView.NumPadKey"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/klondike_text"style="@style/Widget.TextView.NumPadKey.Klondike"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</merge>

修改layout就会影响数字的样式。

作者:帅得不敢出门

相关文章:

Android Framework定制sim卡插入解锁pin码的界面

文章目录 手机设置SIM卡pin码一、安卓手机二、苹果手机 Android Framework中SIM卡pin码代码定位pin码提示文本位置定位pin码java代码位置 定制pin码framework窗口数字按钮 手机设置SIM卡pin码 设置 SIM 卡 PIN 码可以提高手机的安全性&#xff0c;防止他人在未经授权的情况下使…...

cc2530 Basic RF 讲解 和点灯讲解(1_1)

1. Basic RF 概述 Basic RF 是 TI 提供的一套简化版的无线通信协议栈&#xff0c;旨在帮助开发者快速搭建无线通信系统。它基于 IEEE 802.15.4 标准的数据包收发&#xff0c;但只用于演示无线设备数据传输的基本方法&#xff0c;不包含完整功能的协议。Basic RF 的功能限制包括…...

Android H5页面性能分析策略

文章目录 引言一、拦截资源加载请求以优化性能二、通过JavaScript代码监控资源下载速度三、使用vConsole进行前端性能调试四、使用Chrome DevTools调试Android端五、通过抓包分析优化网络性能六、总结 引言 在移动应用开发中&#xff0c;H5页面的性能直接影响到用户体验。本文…...

【前端面试】Typescript

Typescript面试题目回答 Typescript有哪些常用类型? Typescript的常用类型包括&#xff1a; 基本类型&#xff1a;boolean&#xff08;布尔类型&#xff09;、number&#xff08;数字类型&#xff09;、string&#xff08;字符串类型&#xff09;。特殊类型&#xff1a;nul…...

程序语言的内存管理:垃圾回收GC(Java)、手动管理(C语言)与所有权机制(Rust)(手动内存管理、手动管理内存)

文章目录 程序语言的内存管理&#xff1a;垃圾回收、手动管理与所有权机制引言一、垃圾回收机制&#xff08;GC&#xff09;&#xff08;Java&#xff09;1. 什么是垃圾回收机制2. 垃圾回收的工作原理3. 优点与缺点4. 示例代码 二、手动管理内存的分配和释放&#xff08;C语言&…...

研究生论文学习记录

文献检索 检索论文的网站 知网&#xff1a;找论文&#xff0c;寻找创新点paperswithcode &#xff1a;这个网站可以直接找到源代码 直接再谷歌学术搜索 格式&#xff1a;”期刊名称“ 关键词 在谷歌学术搜索特定期刊的关键词相关论文&#xff0c;可以使用以下几种方法&#…...

毕业设计选题:基于Django+Vue的图书馆管理系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 图书馆界面 图书信息界面 个人中心界面 后台登录界面 管理员功能界面 用户…...

#网络安全#NGSOC与传统SOC的区别

NGSOC是Next Generation Security Operation Center&#xff08;下一代安全运营中心&#xff09;的缩写。 NGSOC安全运营服务基于态势感知与安全运营平台来开展监测分析等一系列的服务工作&#xff0c;旨在通过专业、高效的运营服务工作&#xff0c;帮助用户尽可能发挥NGSOC作…...

GCN+BiLSTM多特征输入时间序列预测(Pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GCNBiLSTM多特征输入时间序列预测&#xff08;Pytorch&#xff09; 可以做风电预测&#xff0c;光伏预测&#xff0c;寿命预测&#xff0c;浓度预测等。 Python代码&#xff0c;基于Pytorch编写 1.多特征输入单步预测…...

LinkedList和链表之刷题课(下)

1. 给定x根据x把链表分割,大的结点放在x后面,小的结点放在x前面 题目解析: 注意此时的pHead就是head(头节点的意思) 基本上就是给定一个链表,我们根据x的值来把这个链表分成俩部分,大的那部分放在x后面,小的那部分放在x前面,并且我们不能改变链表本来的顺序,比如下面的链表,我…...

ollama 在 Linux 环境的安装

ollama 在 Linux 环境的安装 介绍 他的存在在我看来跟 docker 的很是相似&#xff0c;他把市面上已经存在的大语言模型集合在一个仓库中&#xff0c;然后通过 ollama 的方式来管理这些大语言模型 下载 # 可以直接通过 http 的方式吧对应的 shell 脚本下载下来&#xff0c;然…...

C语言二刷指针篇

&取得变量的地址 printf("%p\n", &a); printf("%p\n", a); printf("%p\n", &a[0]); printf("%p\n", &a[1]); 前三个输出相同&#xff0c;a[0]和a[1]之间相差4 指针就是保存地址的变量&#xff0c;指针里放的是别的…...

LeetCode题练习与总结:回文对--336

一、题目描述 给定一个由唯一字符串构成的 0 索引 数组 words 。 回文对 是一对整数 (i, j) &#xff0c;满足以下条件&#xff1a; 0 < i, j < words.length&#xff0c;i ! j &#xff0c;并且words[i] words[j]&#xff08;两个字符串的连接&#xff09;是一个回文…...

CesiumJS 案例 P7:添加指定长宽的图片图层(原点分别为图片图层的中心点、左上角顶点、右上角顶点、左下角顶点、右下角顶点)

CesiumJS CesiumJS API&#xff1a;https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库&#xff0c;它用于在网页中创建和控制 3D 地球仪&#xff08;地图&#xff09; 一、添加指定长宽的图片图层&#xff08;原点为图片图层的中心…...

Redis 主从同步 问题

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 主从同步 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 主从同步 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis &a…...

【SQL Server】探讨 IN 和 EXISTS之间的区别

前言 在使用 SQL 查询相关表数据时,通常需要根据另一个表中的值来筛选数据。而 IN 与 EXISTS 子句都是用于此场景的常用方式,但使用时两者存在工作方式不同。它们使用上的选择会显著影响查询的性能,尤其是在大型数据集中。本文我们一起探讨 IN 和 EXISTS 之间的区别、使用与…...

清理pip和conda缓存

当用户目录没有空间时&#xff0c;可清理pip和conda缓存 清理conda缓存&#xff1a; conda clean --all清理pip缓存&#xff1a; pip cache purgeNote&#xff1a; 可以利用软链接&#xff0c;将用户目录下的文件链接到其他位置 首先移动文件或文件夹到其他位置 mv ~/test /…...

git rebase和merge的区别

Git merge和Git rebase是两种不同的合并策略&#xff0c;它们在处理分支合并时有各自的优点和缺点。 Git fetch git fetch 命令用于从远程仓库获取最新的更改&#xff0c;但不会自动合并这些更改到你的本地分支。它会下载远程仓库的所有分支和标签&#xff0c;并更新你的本地…...

【elkb】linux麒麟v10安装ELKB 8.8.X版本(ARM架构)

下载软件 相关版本信息 elasticsearch&#xff1a;8.8.1kibana&#xff1a;8.8.1logstash&#xff1a;8.8.1filebeat&#xff1a;8.8.1 下载地址 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.1-linux-aarch64.tar.gzhttps://artifacts.elastic…...

bluez hid host介绍,连接键盘/鼠标/手柄不是梦,安排

零. 前言 由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...