
HarmonyOS权限申请
<p><span>权限这玩意儿,说白了就是应用想干点“出格”的事之前,得先跟系统打个报告,系统批准了,你才能调用那些敏感的API。比如你想访问用户的位置信息、读写外部存储、使用摄像头等等,没权限门儿都没有。鸿蒙的权限管理机制整体上跟Android有点神似,但具体实现细节和API差异还挺大的,得注意别搞混了。</span></p>
<p><strong><span>一、 权限类型先摸清楚</span></strong></p>
<p><span>鸿蒙把权限分成了几种不同的类别,申请和处理方式也略有不同。</span></p>
<ol start="1"><li><p><strong><span>normal权限</span></strong><span>:这类权限风险较低,比如设备振动、互联网访问等。你只需要在config.json里声明一下,系统在安装应用时就会自动授予,不需要运行时再弹窗找用户要。</span></p>
</li><li><p><strong><span>system_basic权限</span></strong><span>:这类权限涉及系统底层操作,风险较高。普通应用通常用不到,主要是系统级应用才需要,申请流程也更复杂。</span></p>
</li><li><p><strong><span>system_core权限</span></strong><span>:和system_basic类似,也是高风险核心权限,普通应用基本无缘。</span></p>
</li><li><p><strong><span>restricted权限</span></strong><span>:这才是我们平时打交道最多的敏感权限,比如location(位置)、microphone(麦克风)等。这些权限</span><strong><span>不仅要在config.json里声明,还必须在使用时动态向用户申请授权</span></strong><span>。</span></p>
</li></ol><p><strong><span>二、 权限申请实操步骤</span></strong></p>
<p><span>下面以申请位置权限为例,详细走一遍流程。</span></p>
<p><strong><span>第一步:配置config.json</span></strong></p>
<p><span>在项目的</span><code>config.json</code><span>文件中的</span><code>"module"</code><span>字段下,添加</span><code>"reqPermissions"</code><span>节点:</span></p>
<div class="md-code-block md-code-block-light"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">json</span></div><div class="d2a24f03 _246a029"><div class="efa13877"><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon" style="margin-right: 4px;"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.14926 4.02039C7.11194 4.02039 7.8798 4.02023 8.49594 4.07605C9.12125 4.13276 9.65789 4.25194 10.1414 4.53113C10.7201 4.86536 11.2008 5.34597 11.535 5.92468C11.8142 6.40824 11.9334 6.94488 11.9901 7.57019C12.0459 8.18631 12.0457 8.95426 12.0457 9.91687C12.0457 10.8795 12.0459 11.6474 11.9901 12.2635C11.9334 12.8889 11.8142 13.4255 11.535 13.9091C11.2008 14.4877 10.7201 14.9684 10.1414 15.3026C9.65789 15.5818 9.12125 15.701 8.49594 15.7577C7.87981 15.8135 7.11193 15.8134 6.14926 15.8134C5.18664 15.8134 4.41871 15.8135 3.80258 15.7577C3.17727 15.701 2.64063 15.5818 2.15707 15.3026C1.57837 14.9684 1.09775 14.4877 0.763519 13.9091C0.484335 13.4255 0.365153 12.8889 0.308441 12.2635C0.252618 11.6474 0.252777 10.8795 0.252777 9.91687C0.252777 8.95425 0.252634 8.18632 0.308441 7.57019C0.365153 6.94488 0.484335 6.40824 0.763519 5.92468C1.09774 5.34596 1.57836 4.86535 2.15707 4.53113C2.64063 4.25194 3.17727 4.13276 3.80258 4.07605C4.41871 4.02024 5.18663 4.02039 6.14926 4.02039ZM6.14926 5.37781C5.16178 5.37781 4.46631 5.37768 3.92563 5.42664C3.39431 5.47479 3.07856 5.5658 2.83578 5.70593C2.46317 5.92112 2.15351 6.23077 1.93832 6.60339C1.7982 6.84617 1.70718 7.16192 1.65903 7.69324C1.61007 8.23391 1.6102 8.9294 1.6102 9.91687C1.6102 10.9044 1.61006 11.5998 1.65903 12.1405C1.70718 12.6718 1.7982 12.9876 1.93832 13.2303C2.15352 13.6029 2.46318 13.9126 2.83578 14.1278C3.07856 14.2679 3.39431 14.3589 3.92563 14.4071C4.46631 14.4561 5.16179 14.4559 6.14926 14.4559C7.13679 14.4559 7.83221 14.4561 8.37289 14.4071C8.90422 14.3589 9.21996 14.2679 9.46274 14.1278C9.83532 13.9126 10.145 13.6029 10.3602 13.2303C10.5003 12.9876 10.5913 12.6718 10.6395 12.1405C10.6885 11.5998 10.6883 10.9044 10.6883 9.91687C10.6883 8.92941 10.6885 8.23391 10.6395 7.69324C10.5913 7.16192 10.5003 6.84617 10.3602 6.60339C10.145 6.23078 9.83533 5.92113 9.46274 5.70593C9.21996 5.5658 8.90421 5.47479 8.37289 5.42664C7.83221 5.37766 7.13679 5.37781 6.14926 5.37781ZM9.80161 0.368042C10.7638 0.368042 11.5314 0.367947 12.1473 0.423706C12.7725 0.480374 13.3093 0.598826 13.7928 0.877808C14.3716 1.21198 14.8521 1.69361 15.1864 2.27234C15.4655 2.75581 15.5857 3.29171 15.6424 3.91687C15.6983 4.53307 15.6971 5.30167 15.6971 6.26453V7.82996C15.6971 8.29271 15.6989 8.59 15.6649 8.84851C15.4668 10.3526 14.4009 11.5739 12.9832 11.9989V10.5468C13.6973 10.1904 14.2104 9.49669 14.3192 8.67175C14.3387 8.52354 14.3407 8.33586 14.3407 7.82996V6.26453C14.3407 5.27713 14.3398 4.58155 14.2909 4.04089C14.2427 3.50975 14.1526 3.19379 14.0125 2.95105C13.7974 2.57856 13.4875 2.26876 13.1151 2.05359C12.8723 1.91353 12.5564 1.82244 12.0252 1.77429C11.4847 1.72534 10.7888 1.72546 9.80161 1.72546H7.71469C6.75617 1.72565 5.92662 2.27704 5.52328 3.07898H4.07016C4.54218 1.51138 5.99317 0.368253 7.71469 0.368042H9.80161Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">复制</span></span></button><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.3694 11.4111L15.1234 12.8866C14.8869 14.3043 13.6602 15.3436 12.223 15.3437H3.77667C2.33951 15.3435 1.11273 14.3042 0.876282 12.8866L0.630188 11.4111L2.05402 11.1747L2.29913 12.6493C2.41966 13.3713 3.04469 13.9001 3.77667 13.9003H12.223C12.9551 13.9003 13.5799 13.3714 13.7005 12.6493L13.9456 11.1747L15.3694 11.4111ZM8.72198 8.99406C8.77711 8.9394 8.83786 8.88112 8.90265 8.81633L12.4827 5.2343L13.5042 6.25578L9.92218 9.83586C9.63943 10.1186 9.38757 10.3732 9.15851 10.5575C8.91886 10.7503 8.63947 10.9225 8.28644 10.9784C8.09704 11.0084 7.90357 11.0084 7.71417 10.9784C7.36099 10.9225 7.08084 10.7504 6.84113 10.5575C6.61209 10.3732 6.36016 10.1186 6.07745 9.83586L2.4964 6.25578L3.51691 5.2343L7.09698 8.81633C7.16213 8.88148 7.22324 8.94012 7.27863 8.99504V1.30656H8.72198V8.99406Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">下载</span></span></button></div></div></div></div></div><pre><span class="token punctuation">{</span>
<span class="token property">"module"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"reqPermissions"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span>
<span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"ohos.permission.LOCATION"</span><span class="token punctuation">,</span>
<span class="token property">"reason"</span><span class="token operator">:</span> <span class="token string">"需要获取您的位置信息以提供周边服务"</span><span class="token punctuation">,</span> <span class="token comment">// 这个reason很重要,要清晰描述用途</span>
<span class="token property">"usedScene"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"abilities"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token string">".MainAbility"</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token property">"when"</span><span class="token operator">:</span> <span class="token string">"always"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// ... 可以配置多个权限</span>
<span class="token punctuation">]</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></pre><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _33882ae"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _28d7e84"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg></div><p><span>注意</span><code>reason</code><span>字段,这里填写的理由会在系统弹窗时展示给用户,所以一定要写得清晰、合理,让用户明白为什么需要这个权限,别瞎写。</span></p>
<p><strong><span>第二步:在代码中动态申请</span></strong></p>
<p><span>光在配置文件里声明了还不够,在Ability中调用相关功能前,必须动态申请:</span></p>
<div class="md-code-block md-code-block-light"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">java</span></div><div class="d2a24f03 _246a029"><div class="efa13877"><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon" style="margin-right: 4px;"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.14926 4.02039C7.11194 4.02039 7.8798 4.02023 8.49594 4.07605C9.12125 4.13276 9.65789 4.25194 10.1414 4.53113C10.7201 4.86536 11.2008 5.34597 11.535 5.92468C11.8142 6.40824 11.9334 6.94488 11.9901 7.57019C12.0459 8.18631 12.0457 8.95426 12.0457 9.91687C12.0457 10.8795 12.0459 11.6474 11.9901 12.2635C11.9334 12.8889 11.8142 13.4255 11.535 13.9091C11.2008 14.4877 10.7201 14.9684 10.1414 15.3026C9.65789 15.5818 9.12125 15.701 8.49594 15.7577C7.87981 15.8135 7.11193 15.8134 6.14926 15.8134C5.18664 15.8134 4.41871 15.8135 3.80258 15.7577C3.17727 15.701 2.64063 15.5818 2.15707 15.3026C1.57837 14.9684 1.09775 14.4877 0.763519 13.9091C0.484335 13.4255 0.365153 12.8889 0.308441 12.2635C0.252618 11.6474 0.252777 10.8795 0.252777 9.91687C0.252777 8.95425 0.252634 8.18632 0.308441 7.57019C0.365153 6.94488 0.484335 6.40824 0.763519 5.92468C1.09774 5.34596 1.57836 4.86535 2.15707 4.53113C2.64063 4.25194 3.17727 4.13276 3.80258 4.07605C4.41871 4.02024 5.18663 4.02039 6.14926 4.02039ZM6.14926 5.37781C5.16178 5.37781 4.46631 5.37768 3.92563 5.42664C3.39431 5.47479 3.07856 5.5658 2.83578 5.70593C2.46317 5.92112 2.15351 6.23077 1.93832 6.60339C1.7982 6.84617 1.70718 7.16192 1.65903 7.69324C1.61007 8.23391 1.6102 8.9294 1.6102 9.91687C1.6102 10.9044 1.61006 11.5998 1.65903 12.1405C1.70718 12.6718 1.7982 12.9876 1.93832 13.2303C2.15352 13.6029 2.46318 13.9126 2.83578 14.1278C3.07856 14.2679 3.39431 14.3589 3.92563 14.4071C4.46631 14.4561 5.16179 14.4559 6.14926 14.4559C7.13679 14.4559 7.83221 14.4561 8.37289 14.4071C8.90422 14.3589 9.21996 14.2679 9.46274 14.1278C9.83532 13.9126 10.145 13.6029 10.3602 13.2303C10.5003 12.9876 10.5913 12.6718 10.6395 12.1405C10.6885 11.5998 10.6883 10.9044 10.6883 9.91687C10.6883 8.92941 10.6885 8.23391 10.6395 7.69324C10.5913 7.16192 10.5003 6.84617 10.3602 6.60339C10.145 6.23078 9.83533 5.92113 9.46274 5.70593C9.21996 5.5658 8.90421 5.47479 8.37289 5.42664C7.83221 5.37766 7.13679 5.37781 6.14926 5.37781ZM9.80161 0.368042C10.7638 0.368042 11.5314 0.367947 12.1473 0.423706C12.7725 0.480374 13.3093 0.598826 13.7928 0.877808C14.3716 1.21198 14.8521 1.69361 15.1864 2.27234C15.4655 2.75581 15.5857 3.29171 15.6424 3.91687C15.6983 4.53307 15.6971 5.30167 15.6971 6.26453V7.82996C15.6971 8.29271 15.6989 8.59 15.6649 8.84851C15.4668 10.3526 14.4009 11.5739 12.9832 11.9989V10.5468C13.6973 10.1904 14.2104 9.49669 14.3192 8.67175C14.3387 8.52354 14.3407 8.33586 14.3407 7.82996V6.26453C14.3407 5.27713 14.3398 4.58155 14.2909 4.04089C14.2427 3.50975 14.1526 3.19379 14.0125 2.95105C13.7974 2.57856 13.4875 2.26876 13.1151 2.05359C12.8723 1.91353 12.5564 1.82244 12.0252 1.77429C11.4847 1.72534 10.7888 1.72546 9.80161 1.72546H7.71469C6.75617 1.72565 5.92662 2.27704 5.52328 3.07898H4.07016C4.54218 1.51138 5.99317 0.368253 7.71469 0.368042H9.80161Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">复制</span></span></button><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.3694 11.4111L15.1234 12.8866C14.8869 14.3043 13.6602 15.3436 12.223 15.3437H3.77667C2.33951 15.3435 1.11273 14.3042 0.876282 12.8866L0.630188 11.4111L2.05402 11.1747L2.29913 12.6493C2.41966 13.3713 3.04469 13.9001 3.77667 13.9003H12.223C12.9551 13.9003 13.5799 13.3714 13.7005 12.6493L13.9456 11.1747L15.3694 11.4111ZM8.72198 8.99406C8.77711 8.9394 8.83786 8.88112 8.90265 8.81633L12.4827 5.2343L13.5042 6.25578L9.92218 9.83586C9.63943 10.1186 9.38757 10.3732 9.15851 10.5575C8.91886 10.7503 8.63947 10.9225 8.28644 10.9784C8.09704 11.0084 7.90357 11.0084 7.71417 10.9784C7.36099 10.9225 7.08084 10.7504 6.84113 10.5575C6.61209 10.3732 6.36016 10.1186 6.07745 9.83586L2.4964 6.25578L3.51691 5.2343L7.09698 8.81633C7.16213 8.88148 7.22324 8.94012 7.27863 8.99504V1.30656H8.72198V8.99406Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">下载</span></span></button></div></div></div></div></div><pre><span class="token comment">// 假设这是在MainAbility的onStart方法或其他需要位置信息的地方</span>
<span class="token comment">// 1. 先检查是否已有权限</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">verifySelfPermission</span><span class="token punctuation">(</span><span class="token string">"ohos.permission.LOCATION"</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token class-name">IBundleManager</span><span class="token punctuation">.</span><span class="token constant">PERMISSION_GRANTED</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 2. 如果没有权限,判断是否需要向用户展示理由</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">canRequestPermission</span><span class="token punctuation">(</span><span class="token string">"ohos.permission.LOCATION"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 3. 如果需要,则发起权限申请弹窗</span>
<span class="token function">requestPermissionsFromUser</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">{</span><span class="token string">"ohos.permission.LOCATION"</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 这个1是请求码,自己定义,用于回调识别</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token comment">// 走到这里,通常意味着用户之前已经拒绝过,并且选择了“不再询问”,需要引导用户去设置页手动开启</span>
<span class="token comment">// 这里可以给用户一个提示,然后跳转到应用详情页让用户自己开启权限</span>
<span class="token comment">// ...</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token comment">// 已经有权限了,直接执行业务逻辑,比如获取位置</span>
<span class="token function">doYourLocationWork</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></pre><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _33882ae"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _28d7e84"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg></div><p><strong><span>第三步:处理权限申请结果</span></strong></p>
<p><span>申请权限是异步的,用户操作后,结果会在</span><code>onRequestPermissionsFromUserResult</code><span>回调中返回:</span></p>
<div class="md-code-block md-code-block-light"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">java</span></div><div class="d2a24f03 _246a029"><div class="efa13877"><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon" style="margin-right: 4px;"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.14926 4.02039C7.11194 4.02039 7.8798 4.02023 8.49594 4.07605C9.12125 4.13276 9.65789 4.25194 10.1414 4.53113C10.7201 4.86536 11.2008 5.34597 11.535 5.92468C11.8142 6.40824 11.9334 6.94488 11.9901 7.57019C12.0459 8.18631 12.0457 8.95426 12.0457 9.91687C12.0457 10.8795 12.0459 11.6474 11.9901 12.2635C11.9334 12.8889 11.8142 13.4255 11.535 13.9091C11.2008 14.4877 10.7201 14.9684 10.1414 15.3026C9.65789 15.5818 9.12125 15.701 8.49594 15.7577C7.87981 15.8135 7.11193 15.8134 6.14926 15.8134C5.18664 15.8134 4.41871 15.8135 3.80258 15.7577C3.17727 15.701 2.64063 15.5818 2.15707 15.3026C1.57837 14.9684 1.09775 14.4877 0.763519 13.9091C0.484335 13.4255 0.365153 12.8889 0.308441 12.2635C0.252618 11.6474 0.252777 10.8795 0.252777 9.91687C0.252777 8.95425 0.252634 8.18632 0.308441 7.57019C0.365153 6.94488 0.484335 6.40824 0.763519 5.92468C1.09774 5.34596 1.57836 4.86535 2.15707 4.53113C2.64063 4.25194 3.17727 4.13276 3.80258 4.07605C4.41871 4.02024 5.18663 4.02039 6.14926 4.02039ZM6.14926 5.37781C5.16178 5.37781 4.46631 5.37768 3.92563 5.42664C3.39431 5.47479 3.07856 5.5658 2.83578 5.70593C2.46317 5.92112 2.15351 6.23077 1.93832 6.60339C1.7982 6.84617 1.70718 7.16192 1.65903 7.69324C1.61007 8.23391 1.6102 8.9294 1.6102 9.91687C1.6102 10.9044 1.61006 11.5998 1.65903 12.1405C1.70718 12.6718 1.7982 12.9876 1.93832 13.2303C2.15352 13.6029 2.46318 13.9126 2.83578 14.1278C3.07856 14.2679 3.39431 14.3589 3.92563 14.4071C4.46631 14.4561 5.16179 14.4559 6.14926 14.4559C7.13679 14.4559 7.83221 14.4561 8.37289 14.4071C8.90422 14.3589 9.21996 14.2679 9.46274 14.1278C9.83532 13.9126 10.145 13.6029 10.3602 13.2303C10.5003 12.9876 10.5913 12.6718 10.6395 12.1405C10.6885 11.5998 10.6883 10.9044 10.6883 9.91687C10.6883 8.92941 10.6885 8.23391 10.6395 7.69324C10.5913 7.16192 10.5003 6.84617 10.3602 6.60339C10.145 6.23078 9.83533 5.92113 9.46274 5.70593C9.21996 5.5658 8.90421 5.47479 8.37289 5.42664C7.83221 5.37766 7.13679 5.37781 6.14926 5.37781ZM9.80161 0.368042C10.7638 0.368042 11.5314 0.367947 12.1473 0.423706C12.7725 0.480374 13.3093 0.598826 13.7928 0.877808C14.3716 1.21198 14.8521 1.69361 15.1864 2.27234C15.4655 2.75581 15.5857 3.29171 15.6424 3.91687C15.6983 4.53307 15.6971 5.30167 15.6971 6.26453V7.82996C15.6971 8.29271 15.6989 8.59 15.6649 8.84851C15.4668 10.3526 14.4009 11.5739 12.9832 11.9989V10.5468C13.6973 10.1904 14.2104 9.49669 14.3192 8.67175C14.3387 8.52354 14.3407 8.33586 14.3407 7.82996V6.26453C14.3407 5.27713 14.3398 4.58155 14.2909 4.04089C14.2427 3.50975 14.1526 3.19379 14.0125 2.95105C13.7974 2.57856 13.4875 2.26876 13.1151 2.05359C12.8723 1.91353 12.5564 1.82244 12.0252 1.77429C11.4847 1.72534 10.7888 1.72546 9.80161 1.72546H7.71469C6.75617 1.72565 5.92662 2.27704 5.52328 3.07898H4.07016C4.54218 1.51138 5.99317 0.368253 7.71469 0.368042H9.80161Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">复制</span></span></button><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.3694 11.4111L15.1234 12.8866C14.8869 14.3043 13.6602 15.3436 12.223 15.3437H3.77667C2.33951 15.3435 1.11273 14.3042 0.876282 12.8866L0.630188 11.4111L2.05402 11.1747L2.29913 12.6493C2.41966 13.3713 3.04469 13.9001 3.77667 13.9003H12.223C12.9551 13.9003 13.5799 13.3714 13.7005 12.6493L13.9456 11.1747L15.3694 11.4111ZM8.72198 8.99406C8.77711 8.9394 8.83786 8.88112 8.90265 8.81633L12.4827 5.2343L13.5042 6.25578L9.92218 9.83586C9.63943 10.1186 9.38757 10.3732 9.15851 10.5575C8.91886 10.7503 8.63947 10.9225 8.28644 10.9784C8.09704 11.0084 7.90357 11.0084 7.71417 10.9784C7.36099 10.9225 7.08084 10.7504 6.84113 10.5575C6.61209 10.3732 6.36016 10.1186 6.07745 9.83586L2.4964 6.25578L3.51691 5.2343L7.09698 8.81633C7.16213 8.88148 7.22324 8.94012 7.27863 8.99504V1.30656H8.72198V8.99406Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">下载</span></span></button></div></div></div></div></div><pre><span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onRequestPermissionsFromUserResult</span><span class="token punctuation">(</span><span class="token keyword">int</span> requestCode<span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> permissions<span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> grantResults<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>requestCode<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">case</span> <span class="token number">1</span><span class="token operator">:</span> <span class="token comment">// 对应之前申请的请求码</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>grantResults<span class="token punctuation">.</span>length <span class="token operator"></span> <span class="token number">0</span> <span class="token operator">&&</span> grantResults<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token class-name">IBundleManager</span><span class="token punctuation">.</span><span class="token constant">PERMISSION_GRANTED</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 用户同意了,可以愉快地获取位置了</span>
<span class="token function">doYourLocationWork</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token comment">// 用户拒绝了</span>
<span class="token comment">// 这里可以给用户一个友好的提示,说明没有权限相关功能无法使用,并引导用户去设置中开启</span>
<span class="token function">promptUserToGrantPermissionInSettings</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></pre><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _33882ae"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _28d7e84"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg></div><p><strong><span>三、 踩坑提醒 & 最佳实践</span></strong></p>
<ol start="1"><li><p><strong><code>reason</code><span>字段是门面</span></strong><span>:写得好不好直接影响用户授权率。别写“用于功能需要”这种废话,要具体,比如“用于展示附近的餐厅和导航”。</span></p>
</li><li><p><strong><span>申请时机要巧妙</span></strong><span>:不要一进入应用就噼里啪啦把所有权限都申请一遍,用户会反感的。最好在用户即将使用到某个功能时,再动态申请对应的权限。例如,在用户点击“发布带位置的动态”按钮时,再申请位置权限。</span></p>
</li><li><p><strong><span>处理用户拒绝</span></strong><span>:用户拒绝是常态,要有预案。第一次拒绝后,下次再申请时,</span><code>canRequestPermission</code><span>可能会返回false(用户勾了“不再询问”)。这时候你的应用不应该就此卡死,而是应该通过一个友好的对话框,向用户解释为什么必须需要这个权限,并提供一个跳转到系统“应用管理”页面让用户手动开启的入口。</span></p>
</li><li><p><strong><span>权限组概念</span></strong><span>:鸿蒙部分权限存在分组。比如你申请了</span><code>LOCATION</code><span>权限,系统弹窗会直接请求“位置信息”这个权限组,用户一旦授权,同组的其他位置相关权限也会被默认授予(当然,你依然需要在config.json里声明你需要的所有具体权限)。</span></p>
</li><li><p><strong><span>测试要充分</span></strong><span>:在真机上多测试几种场景:首次申请、已授权状态、已拒绝状态、拒绝且不再询问状态。确保你的应用在各种情况下都不会崩溃,且有合理的交互引导。</span></p>
</li></ol><p><span>好了,关于HarmonyOS的权限申请大概就这些内容。核心就是“配置+动态申请+结果处理”三步曲,中间再注意一下用户体验和边界情况处理。权限申请是应用开发中非常基础但又至关重要的一环,搞明白了后面很多功能开发才能顺畅。希望这篇笔记能让大家少走点弯路,如果还有不清楚的,欢迎评论区交流。</span></p>
枚谜抛谴记http://x6.kpyc.MObi
http://s3.kpyc.MObi
http://4e.kpyc.MObi
http://e5.kpyc.MObi
http://8t.kpyc.MObi
http://d7.kpyc.MObi
http://0w.kpyc.MObi
http://h3.kpyc.MObi
http://d0.kpyc.MObi
http://9z.kpyc.MObi
http://3b.kpyc.MObi
http://6o.kpyc.MObi
http://r7.kpyc.MObi
http://3a.kpyc.MObi
http://7u.kpyc.MObi
http://w3.kpyc.MObi
http://3u.kpyc.MObi
http://7a.kpyc.MObi
http://jd.kpyc.MObi
http://5e.kpyc.MObi
永蟹倮睬付
舶诖拓旧纯纯鼓岛稍诖豢坊收驯邪坦饺灯邪追垦装腋芳坦源攀扔侄抑痛幼谰拓啃纯驯稍峦酥砂该遮较拓娜诔侄尘诖
<p><strong><span>一、 权限类型先摸清楚</span></strong></p>
<p><span>鸿蒙把权限分成了几种不同的类别,申请和处理方式也略有不同。</span></p>
<ol start="1"><li><p><strong><span>normal权限</span></strong><span>:这类权限风险较低,比如设备振动、互联网访问等。你只需要在config.json里声明一下,系统在安装应用时就会自动授予,不需要运行时再弹窗找用户要。</span></p>
</li><li><p><strong><span>system_basic权限</span></strong><span>:这类权限涉及系统底层操作,风险较高。普通应用通常用不到,主要是系统级应用才需要,申请流程也更复杂。</span></p>
</li><li><p><strong><span>system_core权限</span></strong><span>:和system_basic类似,也是高风险核心权限,普通应用基本无缘。</span></p>
</li><li><p><strong><span>restricted权限</span></strong><span>:这才是我们平时打交道最多的敏感权限,比如location(位置)、microphone(麦克风)等。这些权限</span><strong><span>不仅要在config.json里声明,还必须在使用时动态向用户申请授权</span></strong><span>。</span></p>
</li></ol><p><strong><span>二、 权限申请实操步骤</span></strong></p>
<p><span>下面以申请位置权限为例,详细走一遍流程。</span></p>
<p><strong><span>第一步:配置config.json</span></strong></p>
<p><span>在项目的</span><code>config.json</code><span>文件中的</span><code>"module"</code><span>字段下,添加</span><code>"reqPermissions"</code><span>节点:</span></p>
<div class="md-code-block md-code-block-light"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">json</span></div><div class="d2a24f03 _246a029"><div class="efa13877"><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon" style="margin-right: 4px;"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.14926 4.02039C7.11194 4.02039 7.8798 4.02023 8.49594 4.07605C9.12125 4.13276 9.65789 4.25194 10.1414 4.53113C10.7201 4.86536 11.2008 5.34597 11.535 5.92468C11.8142 6.40824 11.9334 6.94488 11.9901 7.57019C12.0459 8.18631 12.0457 8.95426 12.0457 9.91687C12.0457 10.8795 12.0459 11.6474 11.9901 12.2635C11.9334 12.8889 11.8142 13.4255 11.535 13.9091C11.2008 14.4877 10.7201 14.9684 10.1414 15.3026C9.65789 15.5818 9.12125 15.701 8.49594 15.7577C7.87981 15.8135 7.11193 15.8134 6.14926 15.8134C5.18664 15.8134 4.41871 15.8135 3.80258 15.7577C3.17727 15.701 2.64063 15.5818 2.15707 15.3026C1.57837 14.9684 1.09775 14.4877 0.763519 13.9091C0.484335 13.4255 0.365153 12.8889 0.308441 12.2635C0.252618 11.6474 0.252777 10.8795 0.252777 9.91687C0.252777 8.95425 0.252634 8.18632 0.308441 7.57019C0.365153 6.94488 0.484335 6.40824 0.763519 5.92468C1.09774 5.34596 1.57836 4.86535 2.15707 4.53113C2.64063 4.25194 3.17727 4.13276 3.80258 4.07605C4.41871 4.02024 5.18663 4.02039 6.14926 4.02039ZM6.14926 5.37781C5.16178 5.37781 4.46631 5.37768 3.92563 5.42664C3.39431 5.47479 3.07856 5.5658 2.83578 5.70593C2.46317 5.92112 2.15351 6.23077 1.93832 6.60339C1.7982 6.84617 1.70718 7.16192 1.65903 7.69324C1.61007 8.23391 1.6102 8.9294 1.6102 9.91687C1.6102 10.9044 1.61006 11.5998 1.65903 12.1405C1.70718 12.6718 1.7982 12.9876 1.93832 13.2303C2.15352 13.6029 2.46318 13.9126 2.83578 14.1278C3.07856 14.2679 3.39431 14.3589 3.92563 14.4071C4.46631 14.4561 5.16179 14.4559 6.14926 14.4559C7.13679 14.4559 7.83221 14.4561 8.37289 14.4071C8.90422 14.3589 9.21996 14.2679 9.46274 14.1278C9.83532 13.9126 10.145 13.6029 10.3602 13.2303C10.5003 12.9876 10.5913 12.6718 10.6395 12.1405C10.6885 11.5998 10.6883 10.9044 10.6883 9.91687C10.6883 8.92941 10.6885 8.23391 10.6395 7.69324C10.5913 7.16192 10.5003 6.84617 10.3602 6.60339C10.145 6.23078 9.83533 5.92113 9.46274 5.70593C9.21996 5.5658 8.90421 5.47479 8.37289 5.42664C7.83221 5.37766 7.13679 5.37781 6.14926 5.37781ZM9.80161 0.368042C10.7638 0.368042 11.5314 0.367947 12.1473 0.423706C12.7725 0.480374 13.3093 0.598826 13.7928 0.877808C14.3716 1.21198 14.8521 1.69361 15.1864 2.27234C15.4655 2.75581 15.5857 3.29171 15.6424 3.91687C15.6983 4.53307 15.6971 5.30167 15.6971 6.26453V7.82996C15.6971 8.29271 15.6989 8.59 15.6649 8.84851C15.4668 10.3526 14.4009 11.5739 12.9832 11.9989V10.5468C13.6973 10.1904 14.2104 9.49669 14.3192 8.67175C14.3387 8.52354 14.3407 8.33586 14.3407 7.82996V6.26453C14.3407 5.27713 14.3398 4.58155 14.2909 4.04089C14.2427 3.50975 14.1526 3.19379 14.0125 2.95105C13.7974 2.57856 13.4875 2.26876 13.1151 2.05359C12.8723 1.91353 12.5564 1.82244 12.0252 1.77429C11.4847 1.72534 10.7888 1.72546 9.80161 1.72546H7.71469C6.75617 1.72565 5.92662 2.27704 5.52328 3.07898H4.07016C4.54218 1.51138 5.99317 0.368253 7.71469 0.368042H9.80161Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">复制</span></span></button><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.3694 11.4111L15.1234 12.8866C14.8869 14.3043 13.6602 15.3436 12.223 15.3437H3.77667C2.33951 15.3435 1.11273 14.3042 0.876282 12.8866L0.630188 11.4111L2.05402 11.1747L2.29913 12.6493C2.41966 13.3713 3.04469 13.9001 3.77667 13.9003H12.223C12.9551 13.9003 13.5799 13.3714 13.7005 12.6493L13.9456 11.1747L15.3694 11.4111ZM8.72198 8.99406C8.77711 8.9394 8.83786 8.88112 8.90265 8.81633L12.4827 5.2343L13.5042 6.25578L9.92218 9.83586C9.63943 10.1186 9.38757 10.3732 9.15851 10.5575C8.91886 10.7503 8.63947 10.9225 8.28644 10.9784C8.09704 11.0084 7.90357 11.0084 7.71417 10.9784C7.36099 10.9225 7.08084 10.7504 6.84113 10.5575C6.61209 10.3732 6.36016 10.1186 6.07745 9.83586L2.4964 6.25578L3.51691 5.2343L7.09698 8.81633C7.16213 8.88148 7.22324 8.94012 7.27863 8.99504V1.30656H8.72198V8.99406Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">下载</span></span></button></div></div></div></div></div><pre><span class="token punctuation">{</span>
<span class="token property">"module"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"reqPermissions"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span>
<span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"ohos.permission.LOCATION"</span><span class="token punctuation">,</span>
<span class="token property">"reason"</span><span class="token operator">:</span> <span class="token string">"需要获取您的位置信息以提供周边服务"</span><span class="token punctuation">,</span> <span class="token comment">// 这个reason很重要,要清晰描述用途</span>
<span class="token property">"usedScene"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
<span class="token property">"abilities"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token string">".MainAbility"</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token property">"when"</span><span class="token operator">:</span> <span class="token string">"always"</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// ... 可以配置多个权限</span>
<span class="token punctuation">]</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></pre><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _33882ae"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _28d7e84"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg></div><p><span>注意</span><code>reason</code><span>字段,这里填写的理由会在系统弹窗时展示给用户,所以一定要写得清晰、合理,让用户明白为什么需要这个权限,别瞎写。</span></p>
<p><strong><span>第二步:在代码中动态申请</span></strong></p>
<p><span>光在配置文件里声明了还不够,在Ability中调用相关功能前,必须动态申请:</span></p>
<div class="md-code-block md-code-block-light"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">java</span></div><div class="d2a24f03 _246a029"><div class="efa13877"><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon" style="margin-right: 4px;"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.14926 4.02039C7.11194 4.02039 7.8798 4.02023 8.49594 4.07605C9.12125 4.13276 9.65789 4.25194 10.1414 4.53113C10.7201 4.86536 11.2008 5.34597 11.535 5.92468C11.8142 6.40824 11.9334 6.94488 11.9901 7.57019C12.0459 8.18631 12.0457 8.95426 12.0457 9.91687C12.0457 10.8795 12.0459 11.6474 11.9901 12.2635C11.9334 12.8889 11.8142 13.4255 11.535 13.9091C11.2008 14.4877 10.7201 14.9684 10.1414 15.3026C9.65789 15.5818 9.12125 15.701 8.49594 15.7577C7.87981 15.8135 7.11193 15.8134 6.14926 15.8134C5.18664 15.8134 4.41871 15.8135 3.80258 15.7577C3.17727 15.701 2.64063 15.5818 2.15707 15.3026C1.57837 14.9684 1.09775 14.4877 0.763519 13.9091C0.484335 13.4255 0.365153 12.8889 0.308441 12.2635C0.252618 11.6474 0.252777 10.8795 0.252777 9.91687C0.252777 8.95425 0.252634 8.18632 0.308441 7.57019C0.365153 6.94488 0.484335 6.40824 0.763519 5.92468C1.09774 5.34596 1.57836 4.86535 2.15707 4.53113C2.64063 4.25194 3.17727 4.13276 3.80258 4.07605C4.41871 4.02024 5.18663 4.02039 6.14926 4.02039ZM6.14926 5.37781C5.16178 5.37781 4.46631 5.37768 3.92563 5.42664C3.39431 5.47479 3.07856 5.5658 2.83578 5.70593C2.46317 5.92112 2.15351 6.23077 1.93832 6.60339C1.7982 6.84617 1.70718 7.16192 1.65903 7.69324C1.61007 8.23391 1.6102 8.9294 1.6102 9.91687C1.6102 10.9044 1.61006 11.5998 1.65903 12.1405C1.70718 12.6718 1.7982 12.9876 1.93832 13.2303C2.15352 13.6029 2.46318 13.9126 2.83578 14.1278C3.07856 14.2679 3.39431 14.3589 3.92563 14.4071C4.46631 14.4561 5.16179 14.4559 6.14926 14.4559C7.13679 14.4559 7.83221 14.4561 8.37289 14.4071C8.90422 14.3589 9.21996 14.2679 9.46274 14.1278C9.83532 13.9126 10.145 13.6029 10.3602 13.2303C10.5003 12.9876 10.5913 12.6718 10.6395 12.1405C10.6885 11.5998 10.6883 10.9044 10.6883 9.91687C10.6883 8.92941 10.6885 8.23391 10.6395 7.69324C10.5913 7.16192 10.5003 6.84617 10.3602 6.60339C10.145 6.23078 9.83533 5.92113 9.46274 5.70593C9.21996 5.5658 8.90421 5.47479 8.37289 5.42664C7.83221 5.37766 7.13679 5.37781 6.14926 5.37781ZM9.80161 0.368042C10.7638 0.368042 11.5314 0.367947 12.1473 0.423706C12.7725 0.480374 13.3093 0.598826 13.7928 0.877808C14.3716 1.21198 14.8521 1.69361 15.1864 2.27234C15.4655 2.75581 15.5857 3.29171 15.6424 3.91687C15.6983 4.53307 15.6971 5.30167 15.6971 6.26453V7.82996C15.6971 8.29271 15.6989 8.59 15.6649 8.84851C15.4668 10.3526 14.4009 11.5739 12.9832 11.9989V10.5468C13.6973 10.1904 14.2104 9.49669 14.3192 8.67175C14.3387 8.52354 14.3407 8.33586 14.3407 7.82996V6.26453C14.3407 5.27713 14.3398 4.58155 14.2909 4.04089C14.2427 3.50975 14.1526 3.19379 14.0125 2.95105C13.7974 2.57856 13.4875 2.26876 13.1151 2.05359C12.8723 1.91353 12.5564 1.82244 12.0252 1.77429C11.4847 1.72534 10.7888 1.72546 9.80161 1.72546H7.71469C6.75617 1.72565 5.92662 2.27704 5.52328 3.07898H4.07016C4.54218 1.51138 5.99317 0.368253 7.71469 0.368042H9.80161Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">复制</span></span></button><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.3694 11.4111L15.1234 12.8866C14.8869 14.3043 13.6602 15.3436 12.223 15.3437H3.77667C2.33951 15.3435 1.11273 14.3042 0.876282 12.8866L0.630188 11.4111L2.05402 11.1747L2.29913 12.6493C2.41966 13.3713 3.04469 13.9001 3.77667 13.9003H12.223C12.9551 13.9003 13.5799 13.3714 13.7005 12.6493L13.9456 11.1747L15.3694 11.4111ZM8.72198 8.99406C8.77711 8.9394 8.83786 8.88112 8.90265 8.81633L12.4827 5.2343L13.5042 6.25578L9.92218 9.83586C9.63943 10.1186 9.38757 10.3732 9.15851 10.5575C8.91886 10.7503 8.63947 10.9225 8.28644 10.9784C8.09704 11.0084 7.90357 11.0084 7.71417 10.9784C7.36099 10.9225 7.08084 10.7504 6.84113 10.5575C6.61209 10.3732 6.36016 10.1186 6.07745 9.83586L2.4964 6.25578L3.51691 5.2343L7.09698 8.81633C7.16213 8.88148 7.22324 8.94012 7.27863 8.99504V1.30656H8.72198V8.99406Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">下载</span></span></button></div></div></div></div></div><pre><span class="token comment">// 假设这是在MainAbility的onStart方法或其他需要位置信息的地方</span>
<span class="token comment">// 1. 先检查是否已有权限</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">verifySelfPermission</span><span class="token punctuation">(</span><span class="token string">"ohos.permission.LOCATION"</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token class-name">IBundleManager</span><span class="token punctuation">.</span><span class="token constant">PERMISSION_GRANTED</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 2. 如果没有权限,判断是否需要向用户展示理由</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">canRequestPermission</span><span class="token punctuation">(</span><span class="token string">"ohos.permission.LOCATION"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 3. 如果需要,则发起权限申请弹窗</span>
<span class="token function">requestPermissionsFromUser</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">{</span><span class="token string">"ohos.permission.LOCATION"</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 这个1是请求码,自己定义,用于回调识别</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token comment">// 走到这里,通常意味着用户之前已经拒绝过,并且选择了“不再询问”,需要引导用户去设置页手动开启</span>
<span class="token comment">// 这里可以给用户一个提示,然后跳转到应用详情页让用户自己开启权限</span>
<span class="token comment">// ...</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token comment">// 已经有权限了,直接执行业务逻辑,比如获取位置</span>
<span class="token function">doYourLocationWork</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></pre><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _33882ae"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _28d7e84"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg></div><p><strong><span>第三步:处理权限申请结果</span></strong></p>
<p><span>申请权限是异步的,用户操作后,结果会在</span><code>onRequestPermissionsFromUserResult</code><span>回调中返回:</span></p>
<div class="md-code-block md-code-block-light"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">java</span></div><div class="d2a24f03 _246a029"><div class="efa13877"><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon" style="margin-right: 4px;"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.14926 4.02039C7.11194 4.02039 7.8798 4.02023 8.49594 4.07605C9.12125 4.13276 9.65789 4.25194 10.1414 4.53113C10.7201 4.86536 11.2008 5.34597 11.535 5.92468C11.8142 6.40824 11.9334 6.94488 11.9901 7.57019C12.0459 8.18631 12.0457 8.95426 12.0457 9.91687C12.0457 10.8795 12.0459 11.6474 11.9901 12.2635C11.9334 12.8889 11.8142 13.4255 11.535 13.9091C11.2008 14.4877 10.7201 14.9684 10.1414 15.3026C9.65789 15.5818 9.12125 15.701 8.49594 15.7577C7.87981 15.8135 7.11193 15.8134 6.14926 15.8134C5.18664 15.8134 4.41871 15.8135 3.80258 15.7577C3.17727 15.701 2.64063 15.5818 2.15707 15.3026C1.57837 14.9684 1.09775 14.4877 0.763519 13.9091C0.484335 13.4255 0.365153 12.8889 0.308441 12.2635C0.252618 11.6474 0.252777 10.8795 0.252777 9.91687C0.252777 8.95425 0.252634 8.18632 0.308441 7.57019C0.365153 6.94488 0.484335 6.40824 0.763519 5.92468C1.09774 5.34596 1.57836 4.86535 2.15707 4.53113C2.64063 4.25194 3.17727 4.13276 3.80258 4.07605C4.41871 4.02024 5.18663 4.02039 6.14926 4.02039ZM6.14926 5.37781C5.16178 5.37781 4.46631 5.37768 3.92563 5.42664C3.39431 5.47479 3.07856 5.5658 2.83578 5.70593C2.46317 5.92112 2.15351 6.23077 1.93832 6.60339C1.7982 6.84617 1.70718 7.16192 1.65903 7.69324C1.61007 8.23391 1.6102 8.9294 1.6102 9.91687C1.6102 10.9044 1.61006 11.5998 1.65903 12.1405C1.70718 12.6718 1.7982 12.9876 1.93832 13.2303C2.15352 13.6029 2.46318 13.9126 2.83578 14.1278C3.07856 14.2679 3.39431 14.3589 3.92563 14.4071C4.46631 14.4561 5.16179 14.4559 6.14926 14.4559C7.13679 14.4559 7.83221 14.4561 8.37289 14.4071C8.90422 14.3589 9.21996 14.2679 9.46274 14.1278C9.83532 13.9126 10.145 13.6029 10.3602 13.2303C10.5003 12.9876 10.5913 12.6718 10.6395 12.1405C10.6885 11.5998 10.6883 10.9044 10.6883 9.91687C10.6883 8.92941 10.6885 8.23391 10.6395 7.69324C10.5913 7.16192 10.5003 6.84617 10.3602 6.60339C10.145 6.23078 9.83533 5.92113 9.46274 5.70593C9.21996 5.5658 8.90421 5.47479 8.37289 5.42664C7.83221 5.37766 7.13679 5.37781 6.14926 5.37781ZM9.80161 0.368042C10.7638 0.368042 11.5314 0.367947 12.1473 0.423706C12.7725 0.480374 13.3093 0.598826 13.7928 0.877808C14.3716 1.21198 14.8521 1.69361 15.1864 2.27234C15.4655 2.75581 15.5857 3.29171 15.6424 3.91687C15.6983 4.53307 15.6971 5.30167 15.6971 6.26453V7.82996C15.6971 8.29271 15.6989 8.59 15.6649 8.84851C15.4668 10.3526 14.4009 11.5739 12.9832 11.9989V10.5468C13.6973 10.1904 14.2104 9.49669 14.3192 8.67175C14.3387 8.52354 14.3407 8.33586 14.3407 7.82996V6.26453C14.3407 5.27713 14.3398 4.58155 14.2909 4.04089C14.2427 3.50975 14.1526 3.19379 14.0125 2.95105C13.7974 2.57856 13.4875 2.26876 13.1151 2.05359C12.8723 1.91353 12.5564 1.82244 12.0252 1.77429C11.4847 1.72534 10.7888 1.72546 9.80161 1.72546H7.71469C6.75617 1.72565 5.92662 2.27704 5.52328 3.07898H4.07016C4.54218 1.51138 5.99317 0.368253 7.71469 0.368042H9.80161Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">复制</span></span></button><button role="button" aria-disabled="false" class="ds-atom-button ds-text-button ds-text-button--with-icon"><div class="ds-icon ds-atom-button__icon" style="font-size: 16px; width: 16px; height: 16px; margin-right: 3px;"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.3694 11.4111L15.1234 12.8866C14.8869 14.3043 13.6602 15.3436 12.223 15.3437H3.77667C2.33951 15.3435 1.11273 14.3042 0.876282 12.8866L0.630188 11.4111L2.05402 11.1747L2.29913 12.6493C2.41966 13.3713 3.04469 13.9001 3.77667 13.9003H12.223C12.9551 13.9003 13.5799 13.3714 13.7005 12.6493L13.9456 11.1747L15.3694 11.4111ZM8.72198 8.99406C8.77711 8.9394 8.83786 8.88112 8.90265 8.81633L12.4827 5.2343L13.5042 6.25578L9.92218 9.83586C9.63943 10.1186 9.38757 10.3732 9.15851 10.5575C8.91886 10.7503 8.63947 10.9225 8.28644 10.9784C8.09704 11.0084 7.90357 11.0084 7.71417 10.9784C7.36099 10.9225 7.08084 10.7504 6.84113 10.5575C6.61209 10.3732 6.36016 10.1186 6.07745 9.83586L2.4964 6.25578L3.51691 5.2343L7.09698 8.81633C7.16213 8.88148 7.22324 8.94012 7.27863 8.99504V1.30656H8.72198V8.99406Z" fill="currentColor"></path></svg></div><span class=""><span class="code-info-button-text">下载</span></span></button></div></div></div></div></div><pre><span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onRequestPermissionsFromUserResult</span><span class="token punctuation">(</span><span class="token keyword">int</span> requestCode<span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> permissions<span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> grantResults<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span>requestCode<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">case</span> <span class="token number">1</span><span class="token operator">:</span> <span class="token comment">// 对应之前申请的请求码</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>grantResults<span class="token punctuation">.</span>length <span class="token operator"></span> <span class="token number">0</span> <span class="token operator">&&</span> grantResults<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token class-name">IBundleManager</span><span class="token punctuation">.</span><span class="token constant">PERMISSION_GRANTED</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 用户同意了,可以愉快地获取位置了</span>
<span class="token function">doYourLocationWork</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token comment">// 用户拒绝了</span>
<span class="token comment">// 这里可以给用户一个友好的提示,说明没有权限相关功能无法使用,并引导用户去设置中开启</span>
<span class="token function">promptUserToGrantPermissionInSettings</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span></pre><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _33882ae"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" class="_9bc997d _28d7e84"><path d="M-5.24537e-07 0C-2.34843e-07 6.62742 5.37258 12 12 12L0 12L-5.24537e-07 0Z" fill="currentColor"></path></svg></div><p><strong><span>三、 踩坑提醒 & 最佳实践</span></strong></p>
<ol start="1"><li><p><strong><code>reason</code><span>字段是门面</span></strong><span>:写得好不好直接影响用户授权率。别写“用于功能需要”这种废话,要具体,比如“用于展示附近的餐厅和导航”。</span></p>
</li><li><p><strong><span>申请时机要巧妙</span></strong><span>:不要一进入应用就噼里啪啦把所有权限都申请一遍,用户会反感的。最好在用户即将使用到某个功能时,再动态申请对应的权限。例如,在用户点击“发布带位置的动态”按钮时,再申请位置权限。</span></p>
</li><li><p><strong><span>处理用户拒绝</span></strong><span>:用户拒绝是常态,要有预案。第一次拒绝后,下次再申请时,</span><code>canRequestPermission</code><span>可能会返回false(用户勾了“不再询问”)。这时候你的应用不应该就此卡死,而是应该通过一个友好的对话框,向用户解释为什么必须需要这个权限,并提供一个跳转到系统“应用管理”页面让用户手动开启的入口。</span></p>
</li><li><p><strong><span>权限组概念</span></strong><span>:鸿蒙部分权限存在分组。比如你申请了</span><code>LOCATION</code><span>权限,系统弹窗会直接请求“位置信息”这个权限组,用户一旦授权,同组的其他位置相关权限也会被默认授予(当然,你依然需要在config.json里声明你需要的所有具体权限)。</span></p>
</li><li><p><strong><span>测试要充分</span></strong><span>:在真机上多测试几种场景:首次申请、已授权状态、已拒绝状态、拒绝且不再询问状态。确保你的应用在各种情况下都不会崩溃,且有合理的交互引导。</span></p>
</li></ol><p><span>好了,关于HarmonyOS的权限申请大概就这些内容。核心就是“配置+动态申请+结果处理”三步曲,中间再注意一下用户体验和边界情况处理。权限申请是应用开发中非常基础但又至关重要的一环,搞明白了后面很多功能开发才能顺畅。希望这篇笔记能让大家少走点弯路,如果还有不清楚的,欢迎评论区交流。</span></p>
枚谜抛谴记http://x6.kpyc.MObi
http://s3.kpyc.MObi
http://4e.kpyc.MObi
http://e5.kpyc.MObi
http://8t.kpyc.MObi
http://d7.kpyc.MObi
http://0w.kpyc.MObi
http://h3.kpyc.MObi
http://d0.kpyc.MObi
http://9z.kpyc.MObi
http://3b.kpyc.MObi
http://6o.kpyc.MObi
http://r7.kpyc.MObi
http://3a.kpyc.MObi
http://7u.kpyc.MObi
http://w3.kpyc.MObi
http://3u.kpyc.MObi
http://7a.kpyc.MObi
http://jd.kpyc.MObi
http://5e.kpyc.MObi
永蟹倮睬付
舶诖拓旧纯纯鼓岛稍诖豢坊收驯邪坦饺灯邪追垦装腋芳坦源攀扔侄抑痛幼谰拓啃纯驯稍峦酥砂该遮较拓娜诔侄尘诖
编辑于 2026-01-08 · 著作权归作者所有