-
开发的容器异常后,里面的数据丢失
-
若需在华为云开发者空间案例中心(cid:link_0)发布实践案例,可参照以下模板进行内容创作,能显著提升案例审核通过率。模板地址:muban:案例中心写作模板 - AtomGit
-
向大佬们请教一下38期的交互逻辑,我目前交互逻辑的大概实现如下(线上测试一直-1 run timeout):#include <algorithm> #include <cstdio> int N, K, B; int gpuCapacity[100]; int main() { scanf("%d %d %d", &N, &K, &B); for (int i = 1; i <= K; i++) { scanf("%d", &gpuCapacity[i]); } int requestCnt = 0; int tMax = 0; int curTimeStep = 0; int maxArrivalTime = 0; int requestLoutSum = 0; // 当requestCnt == N && curTimeStep > tMax时,结束循环 while (requestCnt < N || curTimeStep <= tMax) { int t, n; scanf("%d %d", &t, &n); for (int i = 0; i < n; i++) { int id, lIn, lOut, arrivalTime; scanf("%d %d %d %d", &id, &lIn, &lOut, &arrivalTime); requestCnt++; requestLoutSum += lOut; maxArrivalTime = std::max(maxArrivalTime, arrivalTime); if (requestCnt == N) { tMax = maxArrivalTime + requestLoutSum; } } curTimeStep++; // 直接输出0,按文档中说明,达到tMax时没有收到N个request的Scheduling应该是0分 printf("0\n"); fflush(stdout); } // fprintf(stderr, "tMax: %d, curTimeStep: %d, requestCnt: %d\n", tMax, curTimeStep, requestCnt); return 0; } 1. 程序全部输出0,按文档的说明,当t > t_max时,如果没有收到N个request的Scheduling,得分应该是0,但线上测试反馈是-1 run timeout,所以我猜测是交互器超时了。(当然,实际的算法会考虑Scheduled request的数量)2. 本地我使用AI写了一个评测程序,构造了一个测试用例,只包含一个Request,且该Request在4096000时刻才到达,测试用了大概90s,所以我猜测我的交互逻辑应该有问题。
-
【摘要】 本教程教你用华为云 AI Shell 体验 QQ 邮箱 Agently Mail Agent,从安装配置到收发邮件、下载附件,跑通一个完整的 AI 邮箱自动化闭环。给 AI 一个邮箱:AI Shell + QQ 邮箱 Agent 实战教程本教程教你用华为云 AI Shell 体验 QQ 邮箱 Agent Mail,从安装配置到收发邮件、下载附件,跑通一个完整的 AI 邮箱自动化闭环。📌 教程概览项目说明平台华为云 AI Shell(浏览器即开即用的 AI 终端)邮箱服务QQ 邮箱 Agent Mail(面向 AI Agent 的专属邮箱)难度⭐⭐ 初级,适合有基本终端经验的用户预计耗时20–30 分钟核心能力自然语言收发邮件、搜索邮件、下载附件、自动化工作流一、为什么选 AI Shell + QQ 邮箱 Agent?1.1 AI Shell 是什么?华为云 AI Shell 是一个浏览器端对话式 AI 终端,把大模型能力和命令行环境融合在一起。你用自然语言下达指令,AI 自动理解意图、生成命令并执行——不需要你逐条手敲 CLI。AI Shell官网:cid:link_1一键直达AI Shell:cid:link_0核心优势:🚀 即开即用:浏览器打开就能用,无需本地安装环境🤖 对话式操作:说"帮我查邮件"就行,不用记命令🔗 终端 + AI 结合紧密:适合演示 Agent 如何通过 CLI 工具接入外部服务🛡️ 沙箱隔离:操作在云端环境执行,不污染本地系统1.2 QQ 邮箱 Agent Mail 是什么?QQ 邮箱近期推出的 Agent Mail,是专门面向 AI Agent 的邮箱服务。可以理解为——给 AI 单独准备的工作邮箱。核心特点:📮 与个人邮箱隔离:AI 用的是专属邮箱,不碰你的私人邮件📨 完整邮件能力:收发邮件、搜索邮件、下载附件🤖 自然语言驱动:Agent 直接用自然语言操作邮箱⚙️ 自动化工作流:支持邮件触发 → 处理 → 回复的自动流程🔍 可追溯:后台可查看收发记录和授权状态💡 一句话理解:AI Shell 是 AI 的"手"(终端执行),Agent Mail 是 AI 的"信箱"(邮件收发),两者组合 = 一个能自己收发邮件的 AI 助手。二、开始前准备2.1 你需要准备三样东西序号准备项说明①华为云 AI Shell 入口进入 AI Shell 服务②QQ 邮箱 Agent Mail 体验权限前往 QQ 邮箱 Agently Mail 页面申请/开通③微信(用于扫码授权)安装 CLI 后需微信扫码完成绑定2.2 安全建议⚠️ 重要提醒:不要把个人主邮箱直接交给 AI!Agent Mail 的设计初衷就是把 AI 邮箱和个人邮箱隔离开。请始终使用专属邮箱进行测试,这样即使 Agent 出现误操作,影响范围也可控。三、在 AI Shell 里安装 Agently Mail CLI3.1 进入终端模式打开 AI Shell 后,确认你已进入可执行命令的终端模式。你应该能看到一个类似下方的界面:┌──────────────────────────────────────────────┐ │ AI Shell > 对话 / 终端 │ ├──────────────────────────────────────────────┤ │ │ │ user@ai-shell:~$ _ │ │ │ │ [对话输入框] 请输入你的指令... │ │ │ └──────────────────────────────────────────────┘3.2 让 Agent 自动安装在对话输入框中,直接对 AI Shell 说:请阅读 https://agent.qq.com/doc/cli-setup.md 文档, 按照步骤为我安装并配置 Agent Mail CLI。Agent 收到指令后会:拉取文档 — 自动访问 CLI 安装文档解析步骤 — 理解安装流程和依赖项执行安装 — 在终端中逐条运行安装命令处理依赖 — 自动解决环境依赖问题提示授权 — 安装完成后引导你进行扫码授权你看到的终端输出大致如下:# Agent 自动执行的过程 $ curl -sL https://agent.qq.com/install.sh | bash ↓ Downloading Agently Mail CLI... ✓ CLI installed to ~/.local/bin/agently-mail $ agently-mail --version Agently Mail CLI v1.0.0 $ agently-mail config init → Initializing configuration... → Please scan QR code to authorize...💡 这一步的重点:不是"你手敲多少命令",而是观察 Agent 是否能完整自主地完成 CLI 接入。这正是 AI Shell 的价值所在。四、扫码授权绑定4.1 微信扫码安装 CLI 后,Agent 会在终端中显示一个二维码:┌─────────────────────────┐ │ │ │ ██████████████████ │ │ ██ ██ │ │ ██ ▓▓▓▓▓▓▓▓ ██ │ │ ██ ▓▓▓▓▓▓▓▓ ██ │ │ ██ ▓▓▓▓▓▓▓▓ ██ │ │ ██ ██ │ │ ██████████████████ │ │ │ │ 请用微信扫码完成授权 │ └─────────────────────────┘操作步骤:打开手机微信扫描终端中显示的二维码在手机上确认授权终端显示绑定成功4.2 绑定成功确认授权完成后,终端会显示:✅ Authorization successful! Email: agent-xxxxx@qq.com Status: Connected Quota: 100 emails/day (trial) You can now use natural language to operate your mailbox.4.3 这一步意味着什么?概念说明AI 身份AI Shell 中的 Agent 实例邮箱身份Agent Mail 分配的专属邮箱地址绑定关系Agent 获得该专属邮箱的操作权限安全边界你的个人邮箱权限不暴露给 AI完成后,你可以在 Agent Mail 后台查看收发记录和授权状态,便于追踪 Agent 做了什么。五、第一次实战:让 AI 收发邮件5.1 从低风险任务开始🟢 建议:先让 Agent 搜索邮件,不要一上来就发信。任务 ①:查看最近收到的邮件你对 AI Shell 说:查一下最近收到的邮件Agent 执行并返回:📋 最近 5 封邮件: 1. 【发件人】noreply@github.com 【主题】Your weekly digest 【时间】2026-06-28 09:12 【摘要】本周 GitHub 活动汇总:3 个 PR 合并,2 个 Issue 关闭... 2. 【发件人】invoice@example.com 【主题】六月发票 - 订单 #2024-0615 【时间】2026-06-27 16:30 【摘要】附件包含六月电子发票 PDF... 3. 【发件人】hr@company.com 【主题】简历投递回复 - 面试邀请 【时间】2026-06-27 10:05 【摘要】已收到简历,邀请 6 月 30 日面试... ...任务 ②:搜索特定邮件你对 AI Shell 说:找出上周和项目有关的邮件Agent 执行并返回:🔍 搜索关键词:项目 | 时间范围:上周 找到 3 封相关邮件: 1. 【主题】项目周报 - 第 26 周 【发件人】pm@team.com | 2026-06-23 【关键信息】本周完成 5 个任务,下周计划 3 个里程碑... 2. 【主题】Re: 项目架构评审反馈 【发件人】architect@team.com | 2026-06-24 【关键信息】架构方案 v2 已更新,请 review... 3. 【主题】项目预算审批通过 【发件人】finance@company.com | 2026-06-25 【关键信息】Q3 预算已批准,总额 ¥120,000...任务 ③:下载附件你对 AI Shell 说:下载第一封邮件里的附件Agent 执行并返回:→ 正在获取邮件附件... → 邮件: 【六月发票 - 订单 #2024-0615】 → 附件: invoice_2024_06.pdf (245KB) ✅ 下载完成! 保存路径: ~/downloads/invoice_2024_06.pdf 文件大小: 245 KB MD5: a3f5e8b2c1d4...任务 ④:发送测试邮件🟡 注意:先发给自己的测试地址,确认格式、主题和签名都正常。你对 AI Shell 说:帮我发一封邮件给 test@example.com, 主题是"AI Agent 测试邮件", 内容写"这是一封由 AI Agent 自动发送的测试邮件,请忽略。"Agent 执行并返回:→ 正在发送邮件... 收件人: test@example.com 主题: AI Agent 测试邮件 正文: 这是一封由 AI Agent 自动发送的测试邮件,请忽略。 ✅ 发送成功! 邮件 ID: agent-mail-20260628-001 发送时间: 2026-06-28 14:32:05六、进阶:邮件自动化工作流当你熟悉了基本操作,可以尝试让 Agent 执行多步骤工作流:6.1 邮件摘要助手帮我整理今天的邮件: 1. 搜索今天收到的所有邮件 2. 按重要程度分类(工作/通知/广告) 3. 生成一份摘要报告Agent 返回示例:📊 今日邮件摘要报告 (2026-06-28) ═══════════════════════════════════ 📌 工作邮件 (3 封) ├─ 项目周报已提交,等待 review ├─ 客户反馈:产品 v2 建议增加导出功能 └─ 架构评审通过,可进入开发阶段 🔔 通知邮件 (2 封) ├─ GitHub: 3 个 PR 待合并 └─ 系统监控: 服务器 CPU 使用率正常 📢 广告邮件 (1 封) └─ 云服务促销:新用户优惠(可忽略) ⏱️ 需要处理: 2 封(项目周报 review + 客户回复)6.2 自动回复流程检查是否有来自 hr@company.com 的邮件, 如果有面试邀请,帮我回复确认参加, 并在我日历上标记面试时间。6.3 附件批量归档搜索所有包含发票附件的邮件, 把附件按月份下载到 ~/invoices/ 目录, 并生成一份文件清单。七、适合展示的实战场景场景描述适合人群🧾 发票归档自动搜索发票邮件,下载 PDF 附件,按月份归档财务/行政📰 订阅摘要汇总订阅邮件内容,生成每日/每周摘要信息工作者💼 简历投递回复自动筛选简历邮件,回复面试邀请HR📦 订单邮件整理提取订单号、物流信息,生成跟踪表电商运营🔔 告警邮件处理按优先级分类告警邮件,紧急的立即通知运维工程师八、风险与安全建议8.1 两条核心原则🔴 原则一:不要把个人邮箱直接交给 AIAgently Mail 的设计初衷就是把 AI 邮箱和个人邮箱隔离开。个人邮箱包含大量隐私信息(银行账单、私人通信、密码重置链接等),直接交给 AI 会带来隐私泄露和越权风险。🟡 原则二:先确认再执行第一次演示尽量使用低权限、低风险的测试邮箱。所有涉及发送、删除、转发的操作,建议先让 Agent 展示意图,确认后再执行。8.2 安全检查清单使用 Agently Mail 专属邮箱,而非个人邮箱测试环境与生产环境隔离发送邮件前确认收件人和内容定期检查 Agently Mail 后台操作日志敏感操作(删除、转发)设置二次确认不在公开代码仓库中暴露邮箱配置信息九、总结我们做了什么通过本教程,你完成了一个 AI 邮箱助手的最小可用闭环:安装 CLI → 扫码授权 → 查邮件 → 搜邮件 → 下附件 → 发邮件 → 自动化工作流核心收获AI Shell 不只是终端,而是一个可以执行邮箱任务的 Agent 工作台Agently Mail 不只是邮箱,而是专为 AI 设计的自动化邮件接口自然语言驱动,从"敲命令"到"说需求",交互方式发生了质变安全隔离,AI 邮箱与个人邮箱分开,风险可控下一步探索🔗 结合定时任务,实现每日邮件自动摘要推送📊 接入更多数据源,做邮件 + 日历 + 文档的联动🤖 搭建多 Agent 协作流程,让不同 Agent 处理不同类型邮件
-
开发者专属免费考证福利来了!【云学堂·云原生技术实战营】活动正式开营!集齐5个微认证兑换云原生入门级开发者认证证书。 一、【活动时间】2026年 06月 15日 - 2026年 09月 30日二、【报名链接】cid:link_1三、【活动福利】1、每通过1门微认证考试→获得对应华为云官方微认证证书2、通过指定5门云原生微认证→免费兑换华为云云原生入门级开发者认证证书3、一键免费领取华为云码道体验版,开启你的编码自动驾驶模式!四、参与流程Step1、AI智能编码辅助工具体验,0 门槛上手,小白也能变大神!支持 Java/Python/Go 等 7 种主流语言,代码生成、注释、调试、翻译一键搞定!一键免费领取体验版:https://developer.huaweicloud.com/codeartsco.html?source=dmznteducation&sourcead=dmznthd,立即体验,开启你的编码自动驾驶模式! Step2、集齐5个微认证证书免费兑换云原生入门级开发者认证证书序号认证名称(含免费激活入口)1云原生基础设施之容器入门2云原生基础设施之容器进阶3基于CCE Kubernetes编排实战4CCE网络与存储实战5云容器快速搭建网站通过序号1-5微认证且获得证书后,点此兑换云原生入门级开发者证书(我的认证→我的证书兑换)【考试说明】1、云原生5个微认证无需购买,点击表格中认证名称进入认证详情页,点击“免费激活”按钮即可,如考试未通过可再次点击“免费激活”。2、云原生5个微认证需要理论考试≥70分+实验考试≥60分才算考试通过。3、考试通过后第1个自然日后将发放证书,可前往我的学堂- 我的证书查看证书编号和下载电子证书。 不管是入门新手、在校同学还是职场开发者,都可以一站式学练考!
-
点击>>魔坊(ModelArts)模型训推平台 介绍
-
DevEco 什么时候才能完善,感觉少了很功能,包括CodeGenis功能也不全,插件市场也没有
-
HarmonyOS APP权限声明小技巧📌 核心要点:权限声明是鸿蒙应用安全的第一道防线,通过 module.json5 中的 requestPermissions 声明所需权限,理解 system_grant 与 user_grant 的区别、APL 级别划分,是构建安全应用的基础。一、背景与动机想象一下这个场景:你刚搬进一个新小区,小区有健身房、游泳池、地下车库等各种设施。但并不是每个住户都能随意使用所有设施——你需要先在物业那里登记,申请相应的门禁卡,才能进入对应的区域。鸿蒙系统的权限管理机制,本质上就是这样一个"物业登记"系统。你的应用想要访问用户的相册、摄像头、位置等敏感资源?没问题,但得先"声明"——告诉系统和用户:“我需要这些权限,这是我的理由。”如果你不声明权限就直接调用相关 API,系统会毫不留情地给你甩一个错误。就像你没办门禁卡就硬闯健身房,保安(系统)直接拦住你,连门都进不去。那为什么要把权限声明放在 module.json5 里呢? 因为这是一种"前置声明"机制——在应用安装时,系统就能扫描这个配置文件,知道你的应用到底需要哪些权限。这比运行时才发现应用在偷偷干坏事要好得多。用户在安装前就能看到权限列表,做出知情决策。二、核心原理2.1 权限声明的工作流程当你在 module.json5 中声明权限后,系统会根据权限类型走不同的授权流程:system_grantuser_grant允许拒绝应用在 module.json5 声明权限权限授签方式?系统自动授权安装时即获得权限应用可直接使用需要用户手动授权运行时弹窗请求用户选择?获得权限未获得权限需要处理拒绝逻辑2.2 两种授权方式:system_grant vs user_grant这是权限声明中最核心的概念区分,必须理解透彻。system_grant(系统授权):这类权限不涉及用户隐私,系统在应用安装时自动授予。比如网络访问权限——你的应用要联网,这不需要用户额外确认,装上就能用。user_grant(用户授权):这类权限涉及用户隐私数据,必须由用户亲自确认。比如相机权限——你的应用要拍照,用户得点头同意才行。打个比方:system_grant 就像小区的公共通道,住户自动拥有通行权;user_grant 则像邻居家的门,你得敲门,主人同意了才能进。2.3 APL 级别:权限的"安全等级"APL(Ability Privilege Level)是权限的等级标签,决定了哪些应用有资格申请该权限:APL 级别说明典型权限normal普通权限,所有应用可申请ohos.permission.INTERNETsystem_basic基础系统权限,系统应用或特权应用可申请ohos.permission.LOCATIONsystem_core核心系统权限,仅系统核心应用可申请ohos.permission.INSTALL_BUNDLE同时,应用自身也有 APL 级别(在 AppScope 中的 app.json5 里配置),应用的 APL 必须 ≥ 权限的 APL,才能成功申请该权限。就像你的职级必须达到某个等级,才能进入对应的会议室。2.4 module.json5 中的 requestPermissions 结构{ "module": { "requestPermissions": [ { "name": "ohos.permission.CAMERA", "reason": "$string:camera_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } } ] } } 各字段含义:name:权限名称,必须是系统定义的合法权限名reason:申请理由,对 user_grant 权限必填,向用户解释为什么需要该权限usedScene:使用场景,描述权限在哪些 Ability 中、何时使用abilities:使用该权限的 Ability 列表when:使用时机,inuse(仅前台使用)或 always(前后台都使用)三、代码实战示例1:基础权限声明配置这是一个完整的 module.json5 配置,展示了常见权限的声明方式:// module.json5 - 模块配置文件 { "module": { "name": "entry", "type": "entry", "description": "$string:module_desc", "mainElement": "EntryAbility", "deviceTypes": ["phone", "tablet"], "deliveryWithInstall": true, "installationFree": false, "pages": "$profile:main_pages", "abilities": [ { "name": "EntryAbility", "srcEntry": "./ets/entryability/EntryAbility.ets", "description": "$string:EntryAbility_desc", "icon": "$media:layered_image", "label": "$string:EntryAbility_label", "startWindowIcon": "$media:startIcon", "startWindowBackground": "$color:start_window_background", "exported": true, "skills": [ { "entities": ["entity.system.home"], "actions": ["action.system.home"] } ] } ], // ====== 权限声明区域 ====== "requestPermissions": [ { // 网络权限 - system_grant,安装即授权 "name": "ohos.permission.INTERNET" }, { // 相机权限 - user_grant,需要用户手动授权 "name": "ohos.permission.CAMERA", "reason": "$string:camera_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } }, { // 位置权限 - user_grant,需要用户手动授权 "name": "ohos.permission.LOCATION", "reason": "$string:location_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } }, { // 大概位置权限 - user_grant,精度较低的位置 "name": "ohos.permission.APPROXIMATELY_LOCATION", "reason": "$string:location_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } }, { // 文件读取权限 - user_grant "name": "ohos.permission.READ_MEDIA", "reason": "$string:read_media_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } } ] } } 对应的字符串资源文件(string.json):// base/element/string.json { "string": [ { "name": "camera_reason", "value": "用于拍摄照片上传头像" }, { "name": "location_reason", "value": "用于获取您的位置信息,提供附近服务推荐" }, { "name": "read_media_reason", "value": "用于读取相册图片,方便您选择和分享" } ] } 示例2:运行时校验权限声明是否生效在应用启动时,我们可以通过 Ability 的 onWindowStageCreate 回调来检查权限状态,确保声明已正确配置:// EntryAbility.ets - 应用入口Ability import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; import { window } from '@kit.ArkUI'; import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit'; export default class EntryAbility extends UIAbility { // 应用创建回调 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { console.info('[PermissionDemo] EntryAbility onCreate'); } // 窗口阶段创建回调 onWindowStageCreate(windowStage: window.WindowStage): void { console.info('[PermissionDemo] EntryAbility onWindowStageCreate'); // 检查已声明的权限状态 this.checkDeclaredPermissions(); // 设置主窗口内容 windowStage.loadContent('pages/Index', (err) => { if (err.code) { console.error('[PermissionDemo] Failed to load content: ' + JSON.stringify(err)); return; } console.info('[PermissionDemo] Succeeded in loading content'); }); } /** * 检查已声明权限的授权状态 * 通过此方法可以验证 module.json5 中的权限声明是否生效 */ private async checkDeclaredPermissions(): Promise<void> { try { // 获取访问控制管理器 const atManager = abilityAccessCtrl.createAtManager(); // 获取当前应用的Bundle名 const bundleInfo = await bundleManager.getBundleInfoForSelf( bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT ); const bundleName = bundleInfo.name; // 定义需要检查的权限列表(与 module.json5 中声明的一致) const declaredPermissions: Permissions[] = [ 'ohos.permission.INTERNET', 'ohos.permission.CAMERA', 'ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.READ_MEDIA' ]; console.info('[PermissionDemo] 开始检查权限声明状态...'); // 逐个检查权限授权状态 for (const permission of declaredPermissions) { try { const grantStatus = await atManager.checkAccessToken( bundleInfo.appInfo.accessTokenId, permission ); const statusText = grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED ? '已授权 ✅' : '未授权 ❌'; console.info(`[PermissionDemo] ${permission}: ${statusText}`); } catch (err) { console.error(`[PermissionDemo] 检查权限 ${permission} 失败: ${JSON.stringify(err)}`); } } } catch (error) { console.error('[PermissionDemo] 权限检查异常: ' + JSON.stringify(error)); } } onDestroy(): void { console.info('[PermissionDemo] EntryAbility onDestroy'); } } 示例3:权限声明验证工具页面创建一个可视化页面,展示当前应用所有已声明权限的状态信息,方便开发调试:// pages/PermissionCheckPage.ets - 权限声明验证页面 import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit'; // 权限信息接口 interface PermissionInfo { name: string; // 权限名称 grantMode: string; // 授权方式 isGranted: boolean; // 是否已授权 aplLevel: string; // APL级别 description: string; // 权限描述 } @Entry @Component struct PermissionCheckPage { // 权限列表状态 @State permissionList: PermissionInfo[] = []; // 加载状态 @State isLoading: boolean = true; // 已授权数量 @State grantedCount: number = 0; // 需要检查的权限列表 private readonly CHECK_PERMISSIONS: Array<{ name: Permissions; grantMode: string; aplLevel: string; description: string; }> = [ { name: 'ohos.permission.INTERNET', grantMode: 'system_grant', aplLevel: 'normal', description: '网络访问权限' }, { name: 'ohos.permission.CAMERA', grantMode: 'user_grant', aplLevel: 'normal', description: '相机权限' }, { name: 'ohos.permission.LOCATION', grantMode: 'user_grant', aplLevel: 'system_basic', description: '精确位置权限' }, { name: 'ohos.permission.APPROXIMATELY_LOCATION', grantMode: 'user_grant', aplLevel: 'system_basic', description: '大概位置权限' }, { name: 'ohos.permission.READ_MEDIA', grantMode: 'user_grant', aplLevel: 'system_basic', description: '读取媒体文件权限' }, { name: 'ohos.permission.WRITE_MEDIA', grantMode: 'user_grant', aplLevel: 'system_basic', description: '写入媒体文件权限' } ]; // 页面即将显示时检查权限 async aboutToAppear() { await this.checkAllPermissions(); } /** * 检查所有已声明权限的状态 */ private async checkAllPermissions(): Promise<void> { try { const atManager = abilityAccessCtrl.createAtManager(); const bundleInfo = await bundleManager.getBundleInfoForSelf( bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT ); const tokenId = bundleInfo.appInfo.accessTokenId; const results: PermissionInfo[] = []; let granted = 0; for (const perm of this.CHECK_PERMISSIONS) { try { const status = await atManager.checkAccessToken(tokenId, perm.name); const isGranted = status === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED; if (isGranted) granted++; results.push({ name: perm.name, grantMode: perm.grantMode, isGranted: isGranted, aplLevel: perm.aplLevel, description: perm.description }); } catch (err) { // 权限检查失败,可能未声明该权限 results.push({ name: perm.name, grantMode: perm.grantMode, isGranted: false, aplLevel: perm.aplLevel, description: perm.description + '(未声明或检查失败)' }); } } this.permissionList = results; this.grantedCount = granted; this.isLoading = false; } catch (error) { console.error('[PermissionCheck] 检查权限失败: ' + JSON.stringify(error)); this.isLoading = false; } } build() { Column() { // 标题区域 Text('权限声明验证工具') .fontSize(24) .fontWeight(FontWeight.Bold) .margin({ top: 20, bottom: 8 }) // 统计信息 Text(`已授权: ${this.grantedCount} / ${this.permissionList.length}`) .fontSize(16) .fontColor('#666666') .margin({ bottom: 16 }) // 加载中提示 if (this.isLoading) { LoadingProgress() .width(48) .height(48) .color('#4CAF50') } else { // 权限列表 List({ space: 12 }) { ForEach(this.permissionList, (item: PermissionInfo) => { ListItem() { this.PermissionItemBuilder(item) } }, (item: PermissionInfo) => item.name) } .width('100%') .layoutWeight(1) .padding({ left: 16, right: 16 }) // 刷新按钮 Button('重新检查') .width('80%') .height(44) .backgroundColor('#4CAF50') .fontColor(Color.White) .margin({ top: 16, bottom: 24 }) .onClick(() => { this.isLoading = true; this.checkAllPermissions(); }) } } .width('100%') .height('100%') .backgroundColor('#F5F5F5') } /** * 单个权限项的UI构建 */ @Builder PermissionItemBuilder(item: PermissionInfo) { Row() { // 授权状态图标 Text(item.isGranted ? '✅' : '❌') .fontSize(20) .margin({ right: 12 }) // 权限信息 Column() { Text(item.description) .fontSize(16) .fontWeight(FontWeight.Medium) .maxLines(1) .textOverflow({ overflow: TextOverflow.Ellipsis }) Text(item.name) .fontSize(12) .fontColor('#999999') .margin({ top: 4 }) .maxLines(1) .textOverflow({ overflow: TextOverflow.Ellipsis }) // 标签行 Row({ space: 8 }) { // 授权方式标签 Text(item.grantMode === 'system_grant' ? '系统授权' : '用户授权') .fontSize(11) .fontColor(Color.White) .backgroundColor(item.grantMode === 'system_grant' ? '#4CAF50' : '#FF9800') .borderRadius(4) .padding({ left: 6, right: 6, top: 2, bottom: 2 }) // APL级别标签 Text(item.aplLevel) .fontSize(11) .fontColor(Color.White) .backgroundColor(item.aplLevel === 'normal' ? '#2196F3' : '#9C27B0') .borderRadius(4) .padding({ left: 6, right: 6, top: 2, bottom: 2 }) } .margin({ top: 6 }) } .alignItems(HorizontalAlign.Start) .layoutWeight(1) } .width('100%') .padding(16) .backgroundColor(Color.White) .borderRadius(12) .shadow({ radius: 2, color: '#1A000000', offsetY: 1 }) } } 四、踩坑与注意事项坑1:reason 字段不填或填错导致审核被拒现象:user_grant 类型的权限声明中,reason 字段是必填的。如果你不填,或者填的内容过于笼统(比如"用于应用功能"),应用市场审核大概率会被打回。正确做法:reason 必须具体说明权限用途,比如"用于拍摄照片上传头像"比"用于拍照"更清晰。同时,reason 要引用字符串资源($string:xxx),不能直接写硬编码字符串。// ❌ 错误:直接硬编码 { "name": "ohos.permission.CAMERA", "reason": "拍照" // 不符合规范 } // ✅ 正确:引用字符串资源 { "name": "ohos.permission.CAMERA", "reason": "$string:camera_reason" // 规范写法 } 坑2:APL 级别不匹配导致权限申请失败现象:你的应用 APL 是 normal,但你声明了一个 system_basic 级别的权限(如 ohos.permission.LOCATION),结果安装时该权限不会被授予。解决方案:在 app.json5 中确认应用的 APL 级别。普通三方应用的 APL 默认是 normal,只能申请 normal 级别的权限。要申请 system_basic 权限,需要通过应用市场签名或者使用调试证书。// app.json5 - 应用级配置 { "app": { "bundleName": "com.example.myapp", "vendor": "example", "versionCode": 1000000, "versionName": "1.0.0", "icon": "$media:app_icon", "label": "$string:app_name", // 注意:三方应用无法直接修改此字段 // 需要通过签名工具或应用市场配置 "apiReleaseType": "Release" } } 坑3:LOCATION 和 APPROXIMATELY_LOCATION 必须同时声明现象:如果你只声明了 ohos.permission.LOCATION(精确位置),而没有声明 ohos.permission.APPROXIMATELY_LOCATION(大概位置),运行时请求位置权限会失败。原因:鸿蒙的位置权限设计要求,精确位置权限必须以大概位置权限为基础。也就是说,你必须"先有大范围,才能精确到点"。// ❌ 错误:只声明精确位置 "requestPermissions": [ { "name": "ohos.permission.LOCATION", "reason": "$string:location_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } } ] // ✅ 正确:同时声明两个位置权限 "requestPermissions": [ { "name": "ohos.permission.APPROXIMATELY_LOCATION", "reason": "$string:location_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } }, { "name": "ohos.permission.LOCATION", "reason": "$string:location_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } } ] 坑4:usedScene.when 字段选择不当现象:你的应用只需要在前台使用位置,但你声明了 "when": "always",审核时可能被质疑权限过度申请。原则:最小权限原则——只在必要时申请必要范围的权限。如果只需要前台使用,就填 inuse;只有确实需要后台持续定位(如导航应用),才填 always。坑5:权限名称拼写错误现象:权限名称写错了,比如把 ohos.permission.CAMERA 写成了 ohos.permission.Camera(大小写错误),编译不会报错,但运行时权限永远拿不到。建议:直接从官方文档复制权限名称,不要手动输入。权限名称是区分大小写的!五、HarmonyOS 6 适配5.1 权限声明格式变化HarmonyOS 6 对 requestPermissions 的校验更加严格:变化项HarmonyOS 5HarmonyOS 6reason 字段建议填写强制校验,不填直接编译警告usedScene可选user_grant 权限必须填写权限最小化建议实践编译时检查权限冗余,过度声明会警告新增权限-新增 AI 相关权限(如 ohos.permission.AI_VOICE)5.2 迁移指南// HarmonyOS 6 推荐的完整权限声明格式 "requestPermissions": [ { "name": "ohos.permission.CAMERA", "reason": "$string:camera_reason", // 必填 "usedScene": { // 必填 "abilities": ["EntryAbility"], // 指定使用的Ability "when": "inuse" // 明确使用时机 } } ] 5.3 HarmonyOS 6 新增的权限分级HarmonyOS 6 引入了更细粒度的权限分级,部分权限拆分为"基础"和"增强"两个层级:ohos.permission.READ_MEDIA → 拆分为 ohos.permission.READ_MEDIA(基础读取)和 ohos.permission.READ_MEDIA_V2(含元数据读取)新增 ohos.permission.SENSORS 传感器权限组,替代原来分散的各传感器权限六、总结权限声明知识图谱 ├── 声明位置 │ └── module.json5 → requestPermissions 数组 ├── 授权方式 │ ├── system_grant → 安装即授权(如 INTERNET) │ └── user_grant → 需用户确认(如 CAMERA) ├── APL 级别 │ ├── normal → 所有应用可申请 │ ├── system_basic → 系统应用可申请 │ └── system_core → 核心系统应用专属 ├── 声明字段 │ ├── name → 权限名称(区分大小写) │ ├── reason → 申请理由(user_grant 必填) │ └── usedScene → 使用场景(abilities + when) └── 最佳实践 ├── 最小权限原则 ├── reason 具体明确 ├── 位置权限成对声明 └── when 字段按需选择核心记忆口诀:声明在前,使用在后——先在 module.json5 声明,才能在代码中请求system 自动,user 手动——system_grant 自动授权,user_grant 需要运行时请求APL 匹配,等级够才行——应用 APL 必须 ≥ 权限 APLreason 要具体,when 要精确——权限理由和使用场景都不能含糊位置成对,大小写对——LOCATION 和 APPROXIMATELY_LOCATION 一起声明,权限名称严格区分大小写权限声明看似只是配置文件里几行 JSON,但它是整个权限管理体系的基石。声明错了,后面的动态申请、权限校验全都是空中楼阁。把这一步做扎实,后面的路才能走得稳。
-
6 月 13 日,G-Star Gathering Day 大连站 —— AI 助力全场景应用实践成功举行。来自开源社区、AI开发领域以及产业一线的开发者齐聚一堂,围绕 AI 基础设施、智能开发工具、开源生态建设以及 AI 商业化落地等热点话题展开深度分享与交流。从开源存储到 AI 编码,从游戏开发生态到产业级 AI 应用,本次活动不仅带来了丰富的技术实践案例,也让现场开发者看到了 AI 与开源协同发展的更多可能。AtomGit 大连站负责人不惑为大家带来开场介绍。他围绕 AtomGit 平台的发展历程、G-Star 开源摘星计划以及社区生态建设进行了分享。作为面向全球开发者的 AI 原生开源社区,AtomGit 正持续通过项目孵化、开发者运营、社区活动等方式,连接开发者与优质开源项目,推动更多优秀项目成长壮大。RustFS 核心贡献者小马哥围绕 AI 时代的数据存储需求,介绍了 RustFS 这一基于 Rust 语言开发的新一代分布式对象存储项目。分享重点解析了 RustFS 在 S3 协议兼容、纠删码架构、高可用部署、弹性扩容、安全合规以及云原生支持等方面的技术优势,并展示了其从 MinIO 平滑迁移的实践能力。通过丰富的案例和技术架构拆解,让开发者深入了解开源存储基础设施在 AI 场景下的发展趋势与应用价值。AtomGit 沈阳站主理人、GodotHub 开源社区负责人孙圣博分享了 GodotHub 社区的发展历程,以及开源视觉小说框架 Konado 的设计理念与实践成果。他重点介绍了 Konado 如何通过自定义脚本语言降低视觉小说创作门槛,并展示了 Konado 与 AtomCode 的深度结合,通过 AI Skills Plugin 实现脚本生成、语法学习和内容创作辅助,让开发者能够更高效地完成从创意到作品的开发过程。同时,他还分享了社区活动规划与生态建设愿景,展现了开源创作社区的活力与未来潜力。AtomGit 大连站负责人、华为云 HCDG 不惑围绕华为云 CodeArts 代码智能体展开分享,通过 Vibe Coding、Spec-Driven 开发、MCP 工具调用、Skill 插件开发以及多智能体协作等多个实战案例,展示了 AI 在软件开发全生命周期中的应用能力。从快速生成业务系统,到驱动 Photoshop 自动处理图片,再到构建自动化开发工作流,CodeArts 正在帮助开发者从“写代码”向“驾驭智能体”转变,进一步提升开发效率与创新能力。某国企资深算法工程师王旭结合自身在 GIS、计算机视觉、三维重建和工业智能化领域多年的实践经验,分享了对 AI 商业化发展的思考。他认为 AI 的核心价值不在于是否具备真正意义上的智能,而在于能否高效解决实际业务问题。围绕教育培训、AI工具、行业知识库、智能制造等方向,他分析了当前 AI 商业化的主要机会与挑战,并提出未来开发者需要在行业认知、工程能力与 AI 工具协同之间找到平衡。在 AI 技术不断普惠的背景下,个人开发者和“超级个体”将迎来更多发展机会,而人与 AI 的协同共创也将成为未来的重要趋势。在互动交流与自由提问环节,现场开发者围绕 AI Coding、开源项目运营、个人开发者成长、AI 商业化机会等话题进行了热烈讨论。不同领域开发者的经验分享与观点碰撞,也让本次活动不仅是一场技术交流,更成为一次连接开发者与开源生态的重要聚会。从 AI 基础设施建设,到 AI 编码工具创新;从开源社区生态协同,到产业场景落地实践,G-Star Gathering Day 大连站为开发者呈现了一场兼具技术深度与产业视角的交流盛会。未来,AtomGit 将继续携手更多开源社区伙伴,在全国更多城市开展系列活动,汇聚开发者力量,共同探索 AI 与开源融合发展的无限可能。期待下一站,与更多开发者再次相聚。 🚀
-
6 月 13 日,G-Star Gathering Day 长沙站:AI 助力应用开发实践技术沙龙在智谷大创基地一楼路演厅圆满落幕。本次活动由 AtomGit 与华为云开发者发展与支持部 HCDG 联合主办,聚焦 AI 辅助开发实战,吸引了众多开发者、高校学子与技术爱好者齐聚一堂,解锁智能开发新范式。干货满满|技术分享全回顾本次沙龙全程以“理论 + 实操”为核心形式,拒绝单向输出,让参与者边学边练,真正掌握可落地的 AI 开发技能。开场致辞:链接开源与 AI 的新起点AtomGit 长沙站负责人、华为云 HCDE、好学星城创始人傅湘平为活动开场致辞,分享了 AtomGit 开源社区的生态建设理念与本次沙龙的初衷 —— 希望以长沙为支点,为本地开发者搭建技术交流与成长的平台,推动 AI 与开源技术在湖南的落地与传播。深度拆解:AtomCode 智能开发工具实战AtomGit 技术专家范嗣利带来了主题为《原生 Rust 驱动,智能提效 ——AtomCode 全能力解析与实操演练》的分享。他从 Rust 底层架构出发,解析了 AtomCode 的智能补全、代码生成、错误修复等核心能力,并带领现场开发者进行实操演练,手把手教大家如何用 AtomCode 大幅提升编码效率,解决开发中的痛点问题。云端赋能:华为云 CodeArts AI 开发实践华为云技术专家曹安康则聚焦云端 AI 开发,带来《华为云码道 CodeArts 代码智能体助力构建 AI 智能应用》主题分享。他结合真实案例,讲解了如何利用 CodeArts 代码智能体快速构建 AI 应用,让开发者直观感受到云端智能开发的便捷与高效。互动交流与惊喜抽奖在现场提问互动环节,开发者们围绕工具使用、开发难题、行业趋势等问题积极提问,两位专家逐一解答,现场讨论氛围热烈。活动尾声的抽奖环节更是将气氛推向高潮,为本次沙龙增添了不少欢乐与惊喜。活动亮点|不止是技术分享本次沙龙以“全员实操、现场答疑、同好交流”为特色,打造了一场沉浸式的技术体验:所有分享均配套实操环节,开发者自备电脑即可同步上手;专家现场 Debug,针对性解决大家在实操中遇到的问题;搭建开发者交流社群,让志同道合的伙伴在线下相遇,拓展技术人脉。本次 G-Star Gathering Day 长沙站的落幕,不是终点,而是 AtomGit 赋能开发者的新起点。未来,我们还将持续推出更多技术沙龙、开发者训练营等活动,聚焦开源、AI 等前沿领域,为开发者提供更多学习与交流的机会。感谢所有到场参与者、分享嘉宾与合作方的支持!期待下一场相遇,我们继续携手,共探技术新可能。
-
本课程特邀拥有华为二十余年从业经验的资深架构师主讲。课程以讲师在华为二十余年的亲身经历为主线,涵盖电信、云计算、AI三大时代的技术演进与关键架构决策,并结合架构思维、创新方法及实战心法,为学员展现卓越工程师的系统性成长框架。 不止讲解技术知识,更聚焦职业成长、架构思维、创新方法、实战心法,通过学习本课程,学员将掌握从校园到架构师的成长路径,理解电信、云、AI三大时代的技术演进与关键架构决策,领悟架构本质、治理心法与决策艺术,培养创新思维与实战能力。无论你是尚未踏入职场的在校学生、初级/中级工程师、以及有意向成为架构师的技术人员,还是想要转型、晋升的资深工程师、技术管理者,都能从课程中汲取养分。 课程导览第1章 成长的起点第2章 电信时代的突围第3章 云时代的“从0到1”第4章 决胜AI时代第5章 架构师的修炼心法提问与交流 课程学习入口:cid:link_2,课程报名后可不限次数反复观看。 推荐:智能编码辅助工具体验——华为云码道(CodeArts)代码智能体(一键免费领取体验版) 0 门槛上手,小白也能变大神!支持 Java/Python/Go 等 7 种主流语言,代码生成、注释、调试、翻译一键搞定!5 分钟就能完成注册与首次使用,广泛覆盖了代码生成、研发知识问答、单元测试用例生成、代码解释、代码注释、代码调试、代码翻译、代码检查、代码优化等开发场景,提高软件研发生产力。依据开发者输入的需求描述,准确且高效地生成高质量代码, 如同开发者身边的专属技术顾问。一键免费领取体验版:https://developer.huaweicloud.com/codeartsco.html?source=dmznteducation&sourcead=dmznthd,立即体验,开启你的编码自动驾驶模式!
-
华为云开发者计算方式是什么?以4C-8G为例:每小时4个核时?这样的话,我24小时不关机,就是4x24小时的核时是吗?这个开发桌面的包月服务包含 的核时,无法包住1个月不关机的使用方式是吗?
-
前言本文介绍生成三合一收款码API,三合一聚合收款码整合微信、支付宝、QQ三大主流支付渠道,实现一码通用,彻底解决传统收款方式多码杂乱、扫码不便的痛点。商家仅需张贴一张二维码,就能满足顾客各类扫码付款需求,适配线下门店、便民网点、街边摊位等多种小微经营场景,大幅简化收银流程。应用场景该接口覆盖多行业,如线下便利店、日用小店、文具副食门店等个体实体店、街边零售摊位、流动摊贩等轻经营场景、小型个体经营门店、综合服务小微商户这些商铺都可支持。API介绍请求参数名称类型必须说明wxUrlString是微信支付链接alipayUrlString是支付宝支付链接qqUrlString是qq支付链接logoImgBase64String否logo 图片 base64logoImgUrlString否logo图片UrllogoImgFileString否logo文件paddingInteger否边距logoBorderboolean否是否有边框logoStyleString否logo 样式,NORMAL-普通、ROUND-椭圆、CIRCLE-圆形logoBgColorString否logo 背景色值logoBorderBgColorString否logo 色值bgImgBase64String否背景图base64bgImgUrlString否背景图链接bgImgFilefile否背景图文件drawBgColorString否背景渲染色值,默认#fff7f7bgWidthInteger否背景宽度, 默认500bgHeightInteger否背景高度, 默认500sizeInteger否二维码大小suffixString否图片后缀,默认png戳这里查看详细说明返回样例{ "code": 200,//返回码,详见返回码说明 "msg": "成功",//code对应的描述 "taskNo": "279392941232189858512786",//本次请求号 "data": { "link": "https://z.jmdat.com/aggregate-payment/t2o/visit/xxxx", //支付链接地址,只能在微信浏览器、QQ浏览器、支付宝打开 } }
-
前言MBTI:迈尔斯-布里格斯类型指标,这是一套基于荣格心理学理论发展而来的性格评估工具。它将人的性格从四个维度、每个维度两个对立方向,组合成 16 种不同的性格类型。为了方便记忆,常把16种类型归纳为四个“气质家族”,每个家族有各自鲜明的特点:分析家 (NT型):理性、有战略思维、追求能力与知识。外交家 (NF型):理想主义、善解人意、关注成长与意义。守护者 (SJ型):务实、尽职尽责、重视安全与合作。探险家 (SP型):务实、追求自由、活在当下。下面详细介绍人格测试相关API。详见此处API介绍测试时,尽量凭第一反应选择“你通常是怎么想、怎么做的”,而不是“你希望自己成为什么样的人”,这样结果会更贴近真实的自己。请求参数名称类型必须说明typeString是请求类型,1:获取问题,2:提交答案。versionString是版本类型,1:基础版48题,2:专业版93题,3:完整版200题。注意不同版本的问题不同。numString否获取问题时必须传问题编号,比如获取第1题则传1,问题编号不能超过对应版本的最大题数,例:num=1。qcanString否提交答案时必传,每一题的答案用英文逗号隔开,也就是每一题的选项,A或B。例:qcan=A,A,A,A,B,B,A,A,B,A,A,A,B,A,A,A,A,A,A,A,A,A,A,A,A,B,B,B,B,A,B,A,A,A,B,A,A,A,A,A,B,A,A,A,A,A,A,A。返回样例type=1时返回样例{ "code": 200,//返回码,详见返回码说明 "msg": "成功",//返回码对应描述 "taskNo": "045462265255962926697564",//本次请求号 "data": { "q": "你如何看待风险:",//问题 "a": "A. 作为必须仔细计算和管理的东西。",//选项A。 "b": "B. 作为探索新事物和学习的机会。" //选项B。 } } type=2返回样例{ "code": 200,//返回码,详见返回码说明 "msg": "成功",//返回码对应描述 "taskNo": "045462265255962926697564",//本次请求号 "data": { "mbtimsg": "**ESTP - 企业家/实践者** (外向-实感-思考-知觉)xxxxx",//人格类型简单介绍,提交答案返回。也可自行查询更详细的相关16个人格类型介绍展现给用户。 "mbti": "ESTP" //人格类型,提交答案返回。 } }
-
引领AI时代,技术破局前行! 当开源生态碰撞前沿AI智能,会给应用开发带来怎样的颠覆性变革?开发者如何紧跟技术浪潮,实现智能提效? 就在这个六月,星城的开发者们,你们的专属技术盛宴来啦!不仅仅是听讲,更是全员实操、现场Debug、启发创新的技术沙龙! 🔥 温馨提示:请务必自带电脑参加,现场跟着专家一起卷实战! 📍 活动指南:活动时间: 6月13日(星期六)14:00活动地点: 智谷大创基地一楼路演厅招募对象: 软件开发工程师、AI技术爱好者、开源社区贡献者、高校计算机相关专业学生及所有对 AI 辅助开发感兴趣的伙伴。 📢 成功提交报名信息后,页面将自动弹出“活动专属交流群”微信二维码。请务必扫码入群!我们将在群内提前发布【实操指南】、现场抽奖曲目及后续的小组答疑,期待在群里与你提前相遇!🚀 带上你的电脑,带上你的奇思妙想。6月13日,长沙智谷大创基地,我们不见不散!
上滑加载中
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中 -
一个AI团队帮你写代码:华为云码道Agent Space实战2026/06/25 周四 19:00-21:00
张翰文-华为云码道工程师/郭英旭-青软创新科技集团股份有限公司 软件架构师
本场直播聚焦华为云码道Agent Space两大模式:研发办公、代码开发,亲身体验从需求到代码的AI自动化能力。实操演示基于华为 CodeArts CLI,依托 OpenSpec 规格体系从零搭建业务项目。
回顾中
热门标签