Android SMS发送技术指南

article/2025/8/12 10:36:17

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文详细介绍了在Android平台上如何使用编程接口(API)发送短信,包括 SmsManager 类的使用、调试技巧和设备兼容性处理。通过实例代码展示了如何实现文本消息的发送,并说明了发送短信所需声明的 SEND_SMS 权限。在模拟器和真实设备上测试时的注意事项,包括设备确认和运营商限制也被讨论。此外,对于开发者而言,了解如何利用 SmsManager 实现短信发送的基础和更复杂功能如批量发送、状态回调的实现也是必要的。 android sms send

1. Android短信服务概述

1.1 短信服务的重要性

在移动通信领域,短信服务(SMS)一直扮演着不可替代的角色。它不仅支持基础的文字信息传递,而且在很多应用场景中,如身份验证、营销推广、紧急通知等,都体现出它的重要性。对于开发者来说,掌握Android短信服务的应用和开发,是满足业务需求和提升用户体验的重要手段。

1.2 Android短信服务的演进

Android平台的短信服务随着版本的迭代经历了显著的改进与优化。从最初的简单文本消息服务,到现在的高级短信功能,如智能短信、富通信服务(RCS)等,Android不断拓展短信服务的边界,为开发者提供了更加丰富的工具和接口。

1.3 本章总结

本章首先介绍了短信服务在Android平台上的重要性,然后概述了Android短信服务的发展历程。这些内容为理解后续章节提供了基础背景知识,并且强调了掌握Android短信服务技能的必要性。接下来的章节将详细介绍如何使用Android SDK提供的SmsManager类来实现短信服务的相关功能。

2. SmsManager类使用方法

2.1 SmsManager基础功能

2.1.1 SmsManager的引入和初始化

在Android开发中, SmsManager 类是用于发送和接收短信的一个关键类。为了使用 SmsManager 类,首先需要在应用的 AndroidManifest.xml 文件中声明发送短信的权限。

<uses-permission android:name="android.permission.SEND_SMS"/>

对于Android 6.0(API级别23)及以上版本,还需要在运行时请求权限。 SmsManager 类是单例模式,因此可以通过调用 getDefault() 方法获取它的实例进行初始化,而无需手动创建对象。

SmsManager smsManager = SmsManager.getDefault();

2.1.2 发送普通短信

发送普通短信是最基本的操作。使用 SmsManager 类的 sendTextMessage() 方法可以实现发送短信的功能。此方法需要六个参数:接收者的手机号码、发送者的手机号码(可为null)、要发送的短信内容、发送短信时传给 onSendStatusUpdate() 方法的参数(可为null)、送达短信时传给 onStatusUpdate() 方法的参数(可为null)、发送短信的状态码(可为null)。

 smsManager.sendTextMessage(phoneNumber, null, message, null, null);

在发送短信时,确保已经正确处理用户请求和应用权限,否则可能会引起应用崩溃或无法发送短信。

2.1.3 发送带有状态报告的短信

为了获取短信发送状态报告,需要在发送短信时附加一个状态报告接收的Intent。这可以通过 SmsManager sendTextMessage() 方法实现,其参数之一可以是一个用于接收发送状态的PendingIntent。

PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT"), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent("SMS_DELIVERED"), 0);smsManager.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);

在应用中,需要实现 BroadcastReceiver 来接收状态报告:

private BroadcastReceiver mSmsSentReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {switch (getResultCode()) {case Activity.RESULT_OK://短信成功发送break;case SmsManager.RESULT_ERROR_GENERIC_FAILURE://发生错误break;//其他状态码...}}
};

通过注册 BroadcastReceiver 来监听短信发送状态,应用可以有效地接收到发送短信后的结果反馈,增强应用的健壮性和用户体验。

2.2 SmsManager高级特性

2.2.1 发送短信部分消息

在某些情况下,如果需要发送超出单条短信字符限制的长消息,则可将短信分割成若干部分,然后分别发送。 SmsManager 类提供了 divideMessage(String) -> SmsMessage[] 方法来帮助开发者实现这一功能。该方法将长消息分割成多个部分,并返回一个 SmsMessage 数组。

SmsMessage[] messages = SmsManager.divideMessage(message);
for(SmsMessage smsMessage : messages) {smsManager.sendTextMessage(phoneNumber, null, smsMessage.getMessageBody(), null, null);
}

每个短信部分将计为一条短信计费单位。使用这种方式,可以保证长短信也能被完整地发送到接收者手中。

2.2.2 管理短信发送的回调

SmsManager 类允许通过注册 BroadcastReceiver 来管理短信发送的回调。当短信发送状态发生变化时,系统会发送一个包含状态更新的Intent。

registerReceiver(mSmsSentReceiver, new IntentFilter(SmsManager.SMS_SENT_ACTION));
registerReceiver(mSmsDeliveredReceiver, new IntentFilter(SmsManager.SMS_DELIVERED_ACTION));

这些 BroadcastReceiver 需要实现 onReceive() 方法,在该方法中处理短信发送的状态更新。

2.2.3 短信送达状态的监听

在短信送达时,可以使用 SmsManager 发送短信时附加的送达状态的 PendingIntent 。与发送状态的处理类似,送达状态的 BroadcastReceiver 也需要实现 onReceive() 方法,并在该方法中根据 getResultCode() 来判断短信是否送达。

private BroadcastReceiver mSmsDeliveredReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {switch (getResultCode()) {case Activity.RESULT_OK://短信成功送达break;case Activity.RESULT_CANCELED://短信送达失败break;}}
};

在开发中,开发者需要在适当的生命周期方法中注册和注销这些 BroadcastReceiver ,以避免内存泄漏等问题。这样,应用可以准确地获取到短信送达的状态,使得短信发送的功能更为完善。

通过深入介绍 SmsManager 的基础功能和高级特性,本章为开发者提供了全面了解如何在Android应用中使用短信服务的入门知识。接下来,第三章将重点介绍发送短信权限的声明和使用,进一步加强对Android权限体系的理解和实践。

3. 发送短信的权限声明

在Android平台进行短信服务开发时,权限声明是一个不可或缺的环节。这不仅是因为它关系到应用的正常运行,更是因为在Android 6.0(API 级别 23)及以上版本中引入了动态权限请求机制。开发者必须正确声明和请求权限,以保证应用能够成功发送短信,同时也不影响用户体验。本章节将深入探讨Android短信服务中权限声明的重要性和最佳实践。

3.1 权限声明的重要性

3.1.1 Android权限体系简介

Android权限体系是用于保护用户隐私和设备安全的一套机制。每个应用在安装时会请求一系列权限,以确保应用能够正常访问和操作相关的系统资源和服务。对于短信服务而言,主要涉及到的是 SEND_SMS 权限,用于发送短信,以及 RECEIVE_SMS 权限用于接收短信。

Android的安全模型要求应用在使用特定权限之前必须明确声明,以告知用户应用将要执行的操作。如果应用试图在没有声明权限的情况下执行相关操作,系统会抛出 SecurityException ,导致应用崩溃。为了使应用能够在不同版本的Android系统上正常工作,开发者需要在应用的manifest文件中静态声明这些权限,同时在运行时请求用户授权。

3.1.2 发送短信权限的声明和使用

在应用的 AndroidManifest.xml 文件中,开发者需要声明 SEND_SMS 权限,如下所示:

<uses-permission android:name="android.permission.SEND_SMS" />

这行代码告诉系统,应用需要发送短信的权限。在Android 6.0及以上版本中,仅静态声明是不够的,还需要在代码中动态请求权限。以下是动态请求 SEND_SMS 权限的一个示例代码:

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SEND_SMS);
}

当用户拒绝权限请求时,应用必须提供相应的反馈并采取合适的策略,比如提示用户该功能的重要性或提供替代功能。

3.2 权限请求的最佳实践

3.2.1 动态权限请求流程

动态权限请求通常包括以下步骤:

  1. 在运行时检查权限是否已经被授予。
  2. 如果未授权,向用户显示一个对话框,解释为什么应用需要该权限,并请求该权限。
  3. 处理用户的响应。如果用户同意,则应用可以继续执行需要权限的操作;如果用户拒绝,则应用应相应地处理这一情况。

以下是动态权限请求的完整示例代码,包括权限请求回调的处理:

private static final int MY_PERMISSIONS_REQUEST_SEND_SMS = 1;// 检查是否已经有权限
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {// 如果没有权限,则请求权限ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SEND_SMS);
} else {// 已有权限,继续执行操作
}// 处理权限请求的回调
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {switch (requestCode) {case MY_PERMISSIONS_REQUEST_SEND_SMS: {// 如果请求被取消,则结果数组为空if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 权限被授予,执行发送短信的操作} else {// 权限被用户拒绝,通知用户}return;}}
}

3.2.2 用户拒绝权限后的处理策略

如果用户拒绝了权限请求,开发者应该根据应用的需求和用户的需求采取不同的策略。一般来说,有以下几种策略可供选择:

  • 信息提示 :向用户说明为何需要该权限,以及拒绝权限将如何影响应用的功能。
  • 功能降级 :提供不依赖权限的功能作为替代方案,确保用户可以继续使用应用的核心功能。
  • 频繁提醒 :在合理的时间间隔内再次向用户请求权限,但需谨慎使用,以免影响用户体验。

3.2.3 替代方案的考量和实现

在某些情况下,用户可能永久拒绝某些权限。这种情况下,开发者需要提供替代方案以保持应用的可用性。例如,如果 SEND_SMS 权限被拒绝,应用可以使用第三方云通讯服务,例如Twilio,通过其API在云端发送短信,从而绕过直接发送短信的限制。

以下是使用第三方服务发送短信的一个简单示例:

// 假设已经注册并获取了必要的API密钥和Token
String accountSid = "your_account_sid";
String authToken = "your_auth_token";
String fromNumber = "+1234567890";
String toNumber = "+0987654321";
String body = "This is a test SMS sent from a third-party service";TwilioRestClient client = new TwilioRestClient(accountSid, authToken);
client.getAccount().sendMessage(fromNumber, toNumber, body, null, null);

请注意,使用第三方服务发送短信通常是收费的,因此在使用前需要考虑成本因素。

总结本章节的内容,发送短信的权限声明和请求是实现Android短信服务的基础,它确保了用户隐私和系统安全。通过在Manifest文件中静态声明权限,并在运行时根据用户的选择动态请求权限,开发者可以确保应用的稳定运行。同时,开发者还应考虑用户拒绝权限后的应对策略,以及在必要时采用替代方案以提升用户体验。下一章节将介绍在Android Studio模拟器和真实设备上进行短信服务测试的最佳实践。

4. 模拟器和真实设备上的测试

在Android应用开发过程中,测试是一个不可或缺的环节。对于短信服务的测试,开发者们需要在模拟器和真实设备上分别进行以确保应用能够在不同的环境中正常工作。本章节将详细探讨如何在Android Studio模拟器以及真实设备上进行短信服务的测试,并分析遇到的问题和解决方法。

4.1 在Android Studio模拟器中测试

4.1.1 模拟器的配置和短信发送模拟

在Android Studio中,模拟器可以模拟真实设备的行为,以便开发者无需实际设备就能测试应用。首先,开发者需要配置模拟器:

  1. 打开Android Studio,点击菜单栏的 Tools -> AVD Manager
  2. 在弹出的窗口中点击 Create Virtual Device
  3. 选择一个设备,例如 Nexus 5X ,然后点击 Next
  4. 选择一个系统镜像,推荐选择最新的 Pie 系统镜像,点击 Next Finish 完成创建。

一旦模拟器启动,就可以进行短信发送的模拟。Android模拟器中内置了Emulator Control功能,可以用来模拟短信接收:

  1. 在Android Studio顶部工具栏,找到并点击 Android Virtual Device Manager
  2. 在AVD窗口中选择相应的设备,点击右侧的 Edit 按钮。
  3. 在打开的配置窗口中,找到 Emulated Performance 部分,启用 Telephony 选项,点击 Ok
  4. 在模拟器中点击 Tools -> Android -> AVD Manager ,然后点击 View -> Tool Windows -> Logcat 打开日志查看器。
  5. 点击 Emulator Control 标签页,进入模拟器控制面板。
  6. Phone 区域的 Send SMS to 文本框输入接收号码,填写短信内容,然后点击 Send 按钮。

4.1.2 模拟器中短信接收的观察和分析

在模拟器上发送短信后,应用可以接收到一个模拟的 SMS_RECEIVED 广播。为了观察短信接收,开发者可以在应用中注册一个 BroadcastReceiver ,如下示例代码所示:

private void registerSmsReceiver() {IntentFilter filter = new IntentFilter();filter.addAction("android.provider.Telephony.SMS_RECEIVED");registerReceiver(new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();if (bundle != null) {// 从bundle获取短信内容Object[] pdus = (Object[]) bundle.get("pdus");if (pdus != null) {for (Object pdu : pdus) {SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);String sender = smsMessage.getDisplayOriginatingAddress();String messageBody = smsMessage.getMessageBody();// 处理接收到的短信内容}}}}}, filter);
}

当短信被接收时, onReceive 方法会被触发,其中包含了接收到的短信内容。这段代码展示了如何从 pdus 对象中解析出短信的发信人地址和消息正文。

4.2 在真实设备上测试

4.2.1 真实设备的准备和连接

测试真实设备是为了确保应用在真实的硬件和操作系统上运行无误。准备工作如下:

  1. 确保真实设备开启了USB调试模式。在设备的 设置 -> 关于手机 中连续点击 Build number ,直到提示你已成为开发者。返回 设置 -> 开发者选项 ,启用 USB调试
  2. 使用USB线将Android设备连接到电脑。
  3. 确保电脑已安装相应的设备驱动程序。
  4. 在Android Studio中,通过 Run -> Run 'app' (或 Debug 'app' )选择运行或调试应用。

4.2.2 真实设备上的短信发送和接收测试

在真实设备上测试短信服务,开发者需要确保已经申请了必要的权限,并在代码中正确地使用 SmsManager 来发送短信。示例代码如下:

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("接收号码", null, "测试短信内容", null, null);

为了测试短信接收功能,可以在真实设备上使用其他手机发送短信到测试设备,然后在应用中观察是否能够正确接收并处理短信内容。

4.2.3 测试中遇到的常见问题和解决方法

在进行短信服务测试时,可能会遇到各种问题。一些常见的问题和解决方法如下:

  • 问题1:短信未能发送或接收
  • 解决方法 :确认设备网络连接正常,检查是否开启了飞行模式。同时,确认 SmsManager 对象是否正确创建,以及是否有错误的权限声明或请求。

  • 问题2:应用崩溃

  • 解决方法 :查看 Logcat 中的错误信息,根据堆栈跟踪定位问题代码。可能是因为在主线程中执行了网络操作或权限处理不当导致。

  • 问题3:权限请求被拒绝

  • 解决方法 :在用户拒绝授权后,向用户明确说明应用需要该权限的原因,并引导用户到设置中手动开启权限。在Android 6.0及以上版本,需要使用 requestPermissions 动态请求权限。

测试工具:使用Mermaid流程图分析问题解决方法

使用Mermaid流程图可以直观地展示问题解决的过程。以下是一个关于如何处理测试中遇到问题的流程图示例:

graph LRA[开始测试] --> B{是否有错误?}B -- 是 --> C[查看Logcat错误]C --> D{错误类型是什么?}D -- 权限不足 --> E[引导用户开启权限]D -- 网络问题 --> F[检查网络连接]D -- 其他错误 --> G[定位代码错误]B -- 否 --> H[继续其他测试]

以上流程图直观地展示了测试过程中的问题定位和解决方法,从检查Logcat错误开始,根据错误类型的不同采取相应的解决策略。

通过本章节的内容,开发者应该能够理解在Android Studio模拟器和真实设备上进行短信服务测试的流程以及可能出现的问题和解决方法。在下一章节中,我们将讨论设备兼容性和运营商限制的相关内容,这将有助于开发者更好地优化应用以适应不同的设备和网络环境。

5. 设备兼容性和运营商限制

5.1 设备兼容性问题探讨

在开发Android短信服务应用时,设备兼容性是必须要考虑的一个因素。不同Android版本的实现细节可能存在差异,此外,不同的手机制造商可能会基于原生Android系统进行定制,增加了开发的复杂性。

5.1.1 不同Android版本的短信服务兼容性

随着Android系统的迭代更新,Google对于短信API的更新也在不断演进。开发者在利用 SmsManager 进行短信服务开发时,需要关注不同版本的Android系统中对短信服务支持的差异。例如,在Android KitKat(API 19)中, SmsManager 类引入了 sendTextMessage() 方法的异步版本 sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) ,而在之前版本中只支持同步发送。这种差异可能会导致在老版本Android设备上运行的应用出现兼容性问题。

5.1.2 常见手机制造商对短信服务的定制

除了Android系统的更新,手机制造商对于短信服务的定制也是影响兼容性的一个重要因素。例如,华为、小米、OPPO等厂商可能会有自己的短信应用,这些应用可能会覆盖默认的短信处理行为,或者对短信API的调用进行限制。这就要求开发者在设计应用时,需要考虑到这些定制化因素,并在相应机型上进行充分的测试。

5.2 运营商限制和应对策略

另一个在短信服务领域需要关注的问题是运营商限制。由于运营商对于短信通道的管理和控制,开发者在面对不同的运营商时,可能会遇到限制短信发送速率、内容过滤等情况。

5.2.1 运营商短信通道的特点

不同国家和地区的运营商拥有自己的短信通道,并对通过这些通道发送的短信内容进行监控和管理。通常,为了防止垃圾短信,运营商会限制短信发送频率,并对短信内容进行过滤,这可能对大量发送短信的应用造成影响。

5.2.2 解决运营商限制的策略与方法

为了解决由运营商限制所带来的问题,开发者可以采用多种策略。例如,可以实现短信内容的多样化,以避免被内容过滤机制检测到。此外,也可以设计合理的短信发送间隔,避免触发运营商的限流机制。还可以使用第三方短信发送服务,这些服务通常拥有与多个运营商的合作关系,能够提供更稳定的短信发送能力。

5.2.3 高级短信服务(如RCS)的介绍和应用前景

随着技术的发展,短信服务也在向更高级的方向演进。例如,RCS(Rich Communication Services)是一种旨在取代传统短信服务的通信标准。RCS支持更丰富的消息格式,包括文本、图片、视频和音频等,还支持阅读回执和实时状态报告等功能。开发者可以关注和利用这一技术,为用户提供更加丰富和互动的通信体验。随着移动设备和网络技术的不断进步,预计RCS等高级短信服务将会得到更广泛的应用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文详细介绍了在Android平台上如何使用编程接口(API)发送短信,包括 SmsManager 类的使用、调试技巧和设备兼容性处理。通过实例代码展示了如何实现文本消息的发送,并说明了发送短信所需声明的 SEND_SMS 权限。在模拟器和真实设备上测试时的注意事项,包括设备确认和运营商限制也被讨论。此外,对于开发者而言,了解如何利用 SmsManager 实现短信发送的基础和更复杂功能如批量发送、状态回调的实现也是必要的。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif


http://www.hkcw.cn/article/ZYKlDNpTWC.shtml

相关文章

AndroidStudio创建Android虚拟机教程

前言 在 Android 开发的世界中&#xff0c;拥有一个可靠且灵活的测试环境是至关重要的。Android Studio 提供了虚拟设备&#xff08;AVD&#xff09;管理器&#xff0c;这是一个强大的工具&#xff0c;允许开发者创建自定义的虚拟设备来模拟不同的 Android 设备。通过 AVD&…

uniapp 小程序 web-view 打开H5页面传参以及调用postMessage回传参数

uniapp 小程序 web-view 打开H5页面传参以及调用postMessage回传参数 uniapp 运行微信小程序&#xff0c;在小程序内利用 web-view 打开H5页面进行数据流转的总结。 首先做点准备工作&#xff0c;官网明确的说了小程序是不支持本地的&#xff0c;那怎么进行调试呢&#xff0c;…

mac 下载nvm

先在终端查看是否安装brew brew -v显示版本&#xff0c;开始下一步&#xff0c;如果不显示版本&#xff0c;则需要先安装brew 安装brew 使用brew安装nvm 执行安装命令 brew install nvm配置环境变量 配置环境变量之前&#xff0c;先查看nvm下载的位置 brew list nvm这是…

Android的uid~package~pid的关系

UID &#xff1a; Linux 系统级用户标识&#xff0c;Android 中每个应用安装时分配唯一 UID&#xff08;如 1000&#xff09;。 Package&#xff1a; Android 应用包名(例如android)&#xff0c;一个 UID 可关联多个 Package&#xff08;共享 UID 场景如android:sharedUserI…

Rust 学习笔记:发布一个 crate 到 crates.io

Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io提供有用的文档注释常用标题文档注释作为测试注释所包含的项目 使用 pub use 导出一个方便的公共 API设置 crates.io 账户添加 metadata 到一个新的 crate发布到 c…

大白话 Seata 分布式事务浅析,详解TCC模式

大家好&#xff0c;我是此林。 说到分布式事务&#xff0c;第一时间想到 Seata&#xff0c;它支持多种事务模型&#xff0c;比如&#xff1a;XA模式、AT模式、TCC模式、Saga模式(长事务)。 其中 TCC 模式是高性能分布式事务解决方案&#xff0c;适用于核心系统等对 性能有很高…

超标量处理器设计6-指令解码

1. 指令缓存 指令缓存本质上是一个FIFO, 它能够将指令按照程序中指定的顺序存储起来&#xff0c;这样指令在解码的时候&#xff0c;仍然可以按照程序中指定的顺序进行解码。指令缓存是超标量处理器中必须的部件&#xff0c;其原因有两个&#xff1a; 1. 每周期可以取指的个数大…

技嘉华硕微星主板BIOS开启TPM模块教程

目录 一. TPM模块安装 二. 在BIOS开启TPM功能 华硕主板&#xff08;Intel平台&#xff09; 华硕主板&#xff08;AMD平台&#xff09; 技嘉主板&#xff08;Intel平台&#xff09; 技嘉主板&#xff08;AMD平台&#xff09; 微星主板&#xff08;Intel平台&#xff09; …

java基础知识

ASCII码 1. next() 示例​​ 读取一个字符串&#xff08;遇到空格或换行符停止&#xff09; 运行示例&#xff1a;​​ 输入: 张三 李四 输出: 张三 // 只读取了"张三"&#xff0c;"李四"留在输入缓冲区

【解决】【亲测下载obsidian可行】打不开github.com 或者 加速访问 github

Windows系统 基本思路&#xff1a;通过修改IP绑定来实现加速访问 1、hosts文件目录 C:\Windows\System32\drivers\etc\hosts2、修改内容 2.1 ping github.com 在Windows的cmd页面下直接输入&#xff1a; ping github.comPS&#xff1a;这一步只是看一下&#xff0c;没在后…

逆向入门(1)

前言&#xff1a; 本篇文章面向想入门逆向的新手小白。 NSSCTF和BUUCTF是两个刷题网站&#xff0c;知识点下面会有对应的题&#xff0c;大家可以自己试着做一下 NSSCTF:https://www.nssctf.cn/problem BUUCTF:https://buuoj.cn/challenges 1.看exe模式&#xff08;位数&am…

经典算法回顾之最小生成树

最小生成树&#xff08;Minimum Spanning Tree&#xff0c;简称MST&#xff09;是图论中的一个重要概念&#xff0c;主要用于解决加权无向图中连接所有顶点且总权重最小的树结构问题。本文对两种经典的算法即Prim算法和Kruskal算法进行回顾&#xff0c;并对后者的正确性给出简单…

Java八股文智能体——Agent提示词(Prompt)

这个智能体能够为正在学习Java八股文的同学提供切实帮助&#xff1a;不仅可以帮你优化答案表述&#xff0c;还能直接解答八股文相关问题——它会以面试者的视角&#xff0c;给出贴合求职场景的专业回答。 将以下内容发送给任何一个LLM&#xff0c;他会按照你提示词的内容&…

VScode编译调试debug,gpu的cuda程序,Nsight

进行下面操作的前提是&#xff0c;我们的环境已经能跑简单的CUDA程序了。 一、安装Nsight 二、创建launch.json文件 {"version": "0.2.0","configurations": [{"name": "CUDA C: Launch","type": "cuda-gdb…

飞牛fnNAS存储空间模式详解

目录 一、NAS的存储空间 二、多硬盘对NAS速度的提升原理 三、多硬盘对数据安全的提升原理 四、多硬盘对容量的提升原理 五、磁盘阵列模式 六、飞牛NAS支持的存储模式 七、具体如何选择存储空间模式 在数字化时代,数据是个人和企业发展的核心资产,但面临硬盘损坏、病毒…

vue3: baidusubway using typescript

项目结构&#xff1a; <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地图容器 --><div id"subway-container…

【递归、搜索与回溯】专题二、二叉树中的深搜

文章目录 1.计算布尔二叉树的值1.1 题目1.2 思路1.3 代码 2.求根节点到叶节点数字之和2.1 题目2.2 思路2.3 代码 3.二叉树剪枝3.1 题目3.2 思路3.3 代码 4.验证二叉搜索树4.1 题目4.2 思路4.3 代码 5.二叉搜索树中第K小的元素5.1 题目5.2 思路5.3 代码 6.二叉树的所有路径6.1 题…

Windows商店中的免费扫雷游戏应用

《扫雷》是一款经典的单人益智小游戏&#xff0c;1992年微软发布的Windows 3.1中加入该游戏&#xff0c;从此风靡全世界。游戏目标是通过逻辑推理&#xff0c;在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷。 此Windows应用实现了经典扫雷的…

无法运用pytorch环境、改环境路径、隔离环境

一.未建虚拟环境时 1.创建新项目后&#xff0c;直接运行是这样的。 2.设置中Virtualenv找不到pytorch环境&#xff1f;因为此时没有创建新虚拟环境。 3.选择conda环境&#xff08;全局环境&#xff09;时&#xff0c;是可以下载环境的。 运行结果如下&#xff1a; 是全局环境…

古老的传说(Player、Stage)是否还能在蓝桥云课ROS中重现-250601(失败)

古老的传说是否还能在蓝桥云课ROS中重现-250601 经典复现何其难&#xff0c;百分之二就凉凉&#xff01; 古老的传说 那是很久很久以前的故事……上个世纪的一个机器人项目 Player、Stage这个项目最早起源于1999年&#xff0c;由美国南加州大学机器人研究实验室开发&#xff0…