首页
统计
壁纸
留言板
友情链接
更多
直播
实用工具
Search
1
浏览器 | 开启Chrome和Edge的多线程下载功能(Parallel downloading)
1,155 阅读
2
给孙小姐的一封情书
462 阅读
3
LabVIEW | 各版本及开发工具模块下载
266 阅读
4
armUbuntu系统构建
247 阅读
5
OpenWRT | 作为 旁路由/单臂路由/透明网关 设置 DDNS
247 阅读
取次花丛懒回顾
默认分类
C#
MySQL
LabVIEW
Java
Android
PHP
Python
handsome
相册
百度地图
嵌入式
嵌入式Ubuntu
I.MX6ULL
linux
Unity
Golang
Rust
OpenHD
教学计划
Search
标签搜索
C#
handsome
Git
动态壁纸
开源
Unity3d
Unity
csharp
Moao
累计撰写
183
篇文章
累计收到
25
条评论
首页
栏目
取次花丛懒回顾
默认分类
C#
MySQL
LabVIEW
Java
Android
PHP
Python
handsome
相册
百度地图
嵌入式
嵌入式Ubuntu
I.MX6ULL
linux
Unity
Golang
Rust
OpenHD
教学计划
页面
统计
壁纸
留言板
友情链接
直播
实用工具
搜索到
183
篇与
的结果
2025-06-23
Android | Android 开发环境信息记录(自用各个版本信息/个版本对应信息)
安卓自用开发环境信息名称版本信息Android Studio2024.2.2 Patch 2 February 26, 2025JDKjdk-17.0.15Gradlegradle-8.2各环境下载链接和安装教程:JDK官方下载连接Java SE Development Kit 17.0.15 downloads安装教程https://blog.1okk.com/archives/196.htmlGradle官方下载连接https://gradle.org/releases/gradle-8.2-all.zipgradle-8.2-bin.zip安装教程https://blog.1okk.com/archives/370.htmlAndroid Studio Ladybug Feature Drop | 2024.2.2 Patch 2 February 26, 2025官方下载连接InstallersChromeOS: android-studio-2024.2.2.15-cros.deb (1.0 GB)Mac (Apple Silicon): android-studio-2024.2.2.15-mac_arm.dmg (1.3 GB)Mac (Intel): android-studio-2024.2.2.15-mac.dmg (1.3 GB)Windows (64-bit): android-studio-2024.2.2.15-windows.exe (1.2 GB)SHA-256 checksumsd87c3d88318101005f47598de347da41b3d2b28966f3260ba77d20fb6f78fcb4 android-studio-2024.2.2.15-cros.debf859a4e6d6e2b7f3501026f15e2e81531832e70a72b461e8bc5349ae91c7e730 android-studio-2024.2.2.15-mac_arm.dmg762c2ef01578323b58f2a0b25ce508b6ebb818395be0fcb81388d8320efd0a29 android-studio-2024.2.2.15-mac.dmg3d9607d65b809ee8b22e977adede4806fd3494871cf3fd17b68399b0050955d0 android-studio-2024.2.2.15-windows.exeZip filesLinux: android-studio-2024.2.2.15-linux.tar.gz (1.3 GB)Windows (64-bit): android-studio-2024.2.2.15-windows.zip (1.2 GB)SHA-256 checksums595fe446f11d74cdd9a4f4dae6224ab9828789a31873b8786d76d6ab29094e17 android-studio-2024.2.2.15-linux.tar.gz81eb908e1548732234a5959901cb83c649f72131f8e1a186f10b6e1b9a5d789e android-studio-2024.2.2.15-windows.zipAndroid Studio 版本:https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2024.2.2.11/android-studio-2021.3.1.11-windows.zip
2025年06月23日
14 阅读
0 评论
0 点赞
2025-06-10
Android | 安卓动态申请权限,以蓝牙权限请求为例(使用 Android 的 `registerForActivityResult` API 简化权限请求)
使用 Android 的 registerForActivityResult API 简化权限请求在 Android 开发中,请求权限是一个常见的操作。从 Android 13 开始,Google 推出了新的 registerForActivityResult API,它让权限请求变得更简单。本文将展示如何用这个新 API 替换旧的 onRequestPermissionsResult 方法,并提供一个简单易懂的示例。为什么要替换?旧的 onRequestPermissionsResult 方法需要全局回调,用 requestCode 区分不同的权限请求,这使得代码复杂且难以维护。新的 registerForActivityResult API 让每个权限请求都有自己的回调,代码更清晰、更简洁。示例代码1. 权限请求工具类我们先定义一个工具类 PermissionRequestHelper,封装权限请求的逻辑。package net.moao.bluetoothuploader.utils; import android.app.Activity; import android.os.Build; import androidx.annotation.RequiresApi; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import java.util.HashMap; import java.util.Map; public class PermissionRequestHelper { private static final Map<String, String> PERMISSION_NAME_MAP = new HashMap<String, String>() {{ put("android.permission.ACCESS_FINE_LOCATION", "位置"); put("android.permission.BLUETOOTH_SCAN", "蓝牙扫描"); put("android.permission.BLUETOOTH_ADVERTISE", "蓝牙广告"); put("android.permission.BLUETOOTH_CONNECT", "蓝牙连接"); }}; /** * 获取权限的显示名称 * * @param permission 权限的英文名称 * @return 权限的显示名称 */ public static String getPermissionDisplayName(String permission) { return PERMISSION_NAME_MAP.getOrDefault(permission, permission); } /** * 请求权限 * * @param activity 当前的 Activity * @param permissions 请求的权限列表 * @param callback 权限请求结果的回调 */ @RequiresApi(api = Build.VERSION_CODES.TIRAMISU) public static void requestPermissions(Activity activity, String[] permissions, PermissionRequestCallback callback) { // 注册权限请求 ActivityResultLauncher<String[]> launcher = activity.registerForActivityResult( new ActivityResultContracts.RequestMultiplePermissions(), result -> { // 构建权限请求结果的字符串 StringBuilder resultBuilder = new StringBuilder(); for (String permission : permissions) { String permissionName = getPermissionDisplayName(permission); boolean isGranted = result.getOrDefault(permission, false); String status = isGranted ? "已开启" : "未开启"; resultBuilder.append(permissionName).append(": ").append(status).append("\n"); } // 调用回调方法 callback.onPermissionsResult(resultBuilder.toString()); } ); // 发起权限请求 launcher.launch(permissions); } /** * 权限请求结果的回调接口 */ public interface PermissionRequestCallback { /** * 权限请求结果的回调方法 * * @param result 权限请求的结果 */ void onPermissionsResult(String result); } }2. 在 Activity 中使用工具类接下来,我们展示如何在 Activity 中使用 PermissionRequestHelper 类来请求权限。package net.moao.bluetoothuploader; import android.os.Bundle; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import net.moao.bluetoothuploader.utils.PermissionRequestHelper; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 定义需要请求的权限 String[] requiredPermissions = { "android.permission.POST_NOTIFICATIONS", "android.permission.ACCESS_FINE_LOCATION", "android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT", "android.permission.BLUETOOTH_ADVERTISE" }; // 请求权限 PermissionRequestHelper.requestPermissions(this, requiredPermissions, new PermissionRequestHelper.PermissionRequestCallback() { @Override public void onPermissionsResult(String result) { // 处理权限请求的结果 Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show(); } }); } }代码解释1. 权限名称映射private static final Map<String, String> PERMISSION_NAME_MAP = new HashMap<String, String>() {{ put("android.permission.ACCESS_FINE_LOCATION", "位置"); put("android.permission.BLUETOOTH_SCAN", "蓝牙扫描"); put("android.permission.BLUETOOTH_ADVERTISE", "蓝牙广告"); put("android.permission.BLUETOOTH_CONNECT", "蓝牙连接"); }};PERMISSION_NAME_MAP:一个静态的 HashMap,把权限的英文名称映射为中文名称。这样在用户界面中展示权限名称时更友好。2. 获取权限的显示名称public static String getPermissionDisplayName(String permission) { return PERMISSION_NAME_MAP.getOrDefault(permission, permission); }getPermissionDisplayName:根据权限的英文名称获取对应的中文名称。如果权限名称不在映射表中,就返回原始的英文名称。3. 请求权限public static void requestPermissions(Activity activity, String[] permissions, PermissionRequestCallback callback) { // 注册权限请求 ActivityResultLauncher<String[]> launcher = activity.registerForActivityResult( new ActivityResultContracts.RequestMultiplePermissions(), result -> { // 构建权限请求结果的字符串 StringBuilder resultBuilder = new StringBuilder(); for (String permission : permissions) { String permissionName = getPermissionDisplayName(permission); boolean isGranted = result.getOrDefault(permission, false); String status = isGranted ? "已开启" : "未开启"; resultBuilder.append(permissionName).append(": ").append(status).append("\n"); } // 调用回调方法 callback.onPermissionsResult(resultBuilder.toString()); } ); // 发起权限请求 launcher.launch(permissions); }requestPermissions:这个方法用于请求权限。activity:当前的 Activity 实例。permissions:需要请求的权限列表。callback:权限请求结果的回调接口。ActivityResultLauncher:使用 registerForActivityResult 方法注册权限请求。ActivityResultContracts.RequestMultiplePermissions:指定请求多个权限。result:权限请求的结果,是一个 Map<String, Boolean>,键是权限名称,值是布尔值,表示权限是否被授予。resultBuilder:构建权限请求结果的字符串,用于在回调中展示。callback.onPermissionsResult:调用回调方法,把权限请求的结果传递给调用者。4. 权限请求结果的回调接口public interface PermissionRequestCallback { void onPermissionsResult(String result); }PermissionRequestCallback:一个回调接口,用于处理权限请求的结果。onPermissionsResult:权限请求结果的回调方法,参数 result 是权限请求结果的字符串。使用新 API 的好处代码更简洁:使用 registerForActivityResult API,代码更简洁,易于维护。避免全局回调:不再需要使用全局的 onRequestPermissionsResult 方法,避免了通过 requestCode 区分不同权限请求的复杂性。更直观:每个权限请求都有自己的回调,逻辑更清晰。
2025年06月10日
27 阅读
0 评论
0 点赞
2025-05-30
此内容被密码保护
加密文章,请前往内页查看详情
2025年05月30日
9 阅读
0 评论
0 点赞
2025-05-26
高校“双千”计划“微专业”设置备案表
附件2:高校“双千”计划“微专业”设置备案表学校名称:河南林业职业学院 微专业名称:人工智能应用与系统开发方向 专业负责人:[负责人姓名] 联系电话:[负责人电话] 申请时间:2025年5月20日一、“微专业”基本情况表微专业名称人工智能应用与系统开发方向类型应用技能型面向对象□专科面向学科及专业计算机类相关专业总学分20课程门数10招生名额30成班人数15开课时间2025年9月学制1年是否产教融合是产教合作单位[合作企业名称]微专业介绍本微专业旨在培养具备人工智能应用与系统开发能力的高素质技术技能型人才。通过学习Python程序设计、Java程序设计、数据结构与算法分析等课程,学生将掌握人工智能系统开发的核心技能,并具备解决实际问题的能力。微专业的社会需求及就业前景分析随着人工智能技术的快速发展,市场对具备人工智能应用与系统开发能力的人才需求旺盛。本微专业毕业生可在人工智能企业、互联网企业、软件开发企业等从事人工智能系统的开发、部署与运维等工作,就业前景广阔。微专业简介本微专业面向专科层次学生,以培养人工智能应用与系统开发能力为目标。课程设置注重实践能力培养,通过项目驱动教学模式,提升学生解决实际问题的能力。微专业课程体系设置情况课程设置围绕人工智能应用与系统开发的核心技能展开,包括Python程序设计、Java程序设计、数据结构与算法分析等课程,旨在培养学生的编程能力和系统开发能力。课程名称学时学分开课学期Python程序设计483第一学期Java程序设计483第一学期数据结构与算法分析483第二学期操作系统原理322第二学期计算机网络基础322第二学期数据库系统原理与应用483第一学期人工智能导论322第一学期机器学习基础483第二学期Web前端开发基础483第二学期人工智能系统部署与运维322第二学期二、“微专业”教学团队情况专业姓名职称所在单位主要从事专业/行业曾授课程拟授课程计算机科学与技术[教师1姓名]副教授计算机工程系计算机科学与技术Python程序设计Python程序设计计算机科学与技术[教师2姓名]讲师计算机工程系计算机科学与技术Java程序设计Java程序设计计算机科学与技术[教师3姓名]讲师计算机工程系计算机科学与技术数据结构与算法分析数据结构与算法分析计算机科学与技术[教师4姓名]讲师计算机工程系计算机科学与技术操作系统原理操作系统原理计算机科学与技术[教师5姓名]讲师计算机工程系计算机科学与技术计算机网络基础计算机网络基础计算机科学与技术[教师6姓名]讲师计算机工程系计算机科学与技术数据库系统原理与应用数据库系统原理与应用计算机科学与技术[教师7姓名]讲师计算机工程系计算机科学与技术人工智能导论人工智能导论计算机科学与技术[教师8姓名]讲师计算机工程系计算机科学与技术机器学习基础机器学习基础计算机科学与技术[教师9姓名]讲师计算机工程系计算机科学与技术Web前端开发基础Web前端开发基础计算机科学与技术[教师10姓名]讲师计算机工程系计算机科学与技术人工智能系统部署与运维人工智能系统部署与运维三、“微专业”负责人承诺本人自愿担任该“微专业”负责人,负责统筹推进招生办法和培养方案制定、师资队伍组建、课程与教材建设、教学研究与改革、教学条件优化等工作。微专业负责人(签字):[负责人姓名] 日期:2025年5月20日四、相关单位意见开设的“微专业”就业前景明确。本单位具备开设“微专业”所需的办学条件,能够保障“微专业”设置、建设、招生、运行等工作,同意申请。牵头单位院长签字(盖章):[院长姓名] 日期:2025年5月20日附件3:“双千”计划“微专业”设置汇总表报送单位:河南林业职业学院(公章)建设微专业名称急需紧缺型应用技能型交叉复合型基本素质提升类专业技能训练类人工智能应用类实习实践类河南林业职业学院人工智能应用与系统开发方向 √ 开设课程名称拟面向对象实际参加人数Python程序设计专科30Java程序设计专科30数据结构与算法分析专科30操作系统原理专科30计算机网络基础专科30数据库系统原理与应用专科30人工智能导论专科30机器学习基础专科30Web前端开发基础专科30人工智能系统部署与运维专科30附件5:高校学生就业能力提升“双千”计划实施情况统计表项目数据拟开设“微专业”(个)1其中:急需紧缺型(个)0应用技能型(个)1交叉复合型(个)0实际开设“微专业”(个)1其中:急需紧缺型(个)0应用技能型(个)1交叉复合型(个)0实际参加学生(人次)30其中:就业困难等重点帮扶群体参加学习人数(人)5涉及2024届毕业生“红黄牌”提示专业(个)02024届去向落实率低于50%(个)0去向落实情况处于本校后1/3等就业质量不高相关专业点(个)0以上专业点2025届毕业生参加学习人数(人)0
2025年05月26日
11 阅读
0 评论
0 点赞
2025-05-21
Gravatar 国内镜像站
如何使用 Gravatar 镜像站前言Gravatar 是一个很实用的头像服务,用邮箱就能关联头像和简介,在很多网站都能自动显示。但它的官方服务器在国内访问不太稳定,之前我用的镜像站也不靠谱,最近挂了。索性自己搭了个镜像站,今天就来简单说说怎么用,方便新手站长快速上手。镜像站介绍我搭的 Gravatar 镜像站有两个地址:Cloudflare 镜像站:https://gravatar.moao.net国内 CDN 镜像站:https://gravatar.cncdn.moao.net我会尽力长期维护,除非遇到不可抗力,不然会一直开着。要是哪天停了,我也会在这篇博客里发公告。使用方法1. 替换官方链接Gravatar 的头像链接通常是这样的:https://www.gravatar.com/avatar/邮箱地址的 MD5 哈希值想用镜像站,就把 https://www.gravatar.com 换成镜像站地址。比如,用 Cloudflare 镜像站:https://gravatar.moao.net/avatar/邮箱地址的 MD5 哈希值用国内 CDN 镜像站:https://gravatar.cncdn.moao.net/avatar/邮箱地址的 MD5 哈希值2. 在网站中使用如果你能改网站代码,按下面的方法换链接就行。HTML 中的使用原本的代码:<img src="https://www.gravatar.com/avatar/邮箱地址的 MD5 哈希值" alt="用户头像">换成镜像站链接:<img src="https://gravatar.moao.net/avatar/邮箱地址的 MD5 哈希值" alt="用户头像">或者:<img src="https://gravatar.cncdn.moao.net/avatar/邮箱地址的 MD5 哈希值" alt="用户头像">PHP 中的使用原本的代码:$avatar_url = "https://www.gravatar.com/avatar/" . md5(strtolower(trim($email))); echo '<img src="' . $avatar_url . '" alt="用户头像">';换成镜像站链接:$avatar_url = "https://gravatar.moao.net/avatar/" . md5(strtolower(trim($email))); echo '<img src="' . $avatar_url . '" alt="用户头像">';或者:$avatar_url = "https://gravatar.cncdn.moao.net/avatar/" . md5(strtolower(trim($email))); echo '<img src="' . $avatar_url . '" alt="用户头像">';3. 测试镜像站换完链接后,访问下面的链接测试一下:https://gravatar.moao.net/avatar/00000000000000000000000000000000https://gravatar.cncdn.moao.net/avatar/00000000000000000000000000000000能正常显示默认头像就行。要是访问不了,可能是镜像站临时出问题了,或者你网络不行。注意事项稳定性:我会尽量保证镜像站稳定,但网络复杂,难免出问题,耐心等或者试试别的镜像站。数据同步:镜像站和官方服务器同步可能有延迟,更新头像或简介后,可能要等一会儿才能在镜像站看到。隐私保护:镜像站遵循 Gravatar 的隐私政策,你得清楚并同意这些政策,保护好个人信息。结语用 Gravatar 镜像站能让头像加载更稳定,提升网站体验。希望这篇博客能帮到你,有问题可在本页进行留言。
2025年05月21日
36 阅读
1 评论
0 点赞
1
...
3
4
5
...
37