03.HarmonyOS4.0开发踩坑总结

获取权限

以获取相机权限为例,先在 main/module.json5 中配置相应的权限

{
    "module":{
        "requestPermissions": [
          {
            "name": "ohos.permission.CAMERA",
            "usedScene": {
              "abilities": ["EntryAbility"],
              "when": "always"
            }
          }
        ]
    }
}

具体配置解释一下,搬运官方内容

标签是否必填说明
name权限名称。
reason描述申请权限的原因。
说明:当申请的权限为user_grant权限时,此字段必填。
usedScene描述权限使用的场景和时机。
说明:当申请的权限为user_grant权限时,此字段必填。
abilities标识需要使用到该权限的Ability,标签为数组形式。
适用模型:Stage模型
ability标识需要使用到该权限的Ability,标签为数组形式。
适用模型:FA模型
when标识权限使用的时机,值为 inuse/always。
– inuse:表示为仅允许前台使用。
– always:表示前后台都可使用。

配置完成后可以在 EntryAbility 配置权限申请

import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
const permissions: Array<Permissions> = ['ohos.permission.CAMERA'];

export default class EntryAbility extends UIAbility {

     onWindowStageCreate(windowStage: window.WindowStage) {
        // Main window is created, set main page for this ability
        let context = this.context;
        let atManager = abilityAccessCtrl.createAtManager();

        // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
        atManager.requestPermissionsFromUser(context, permissions).then((data) => {
          let grantStatus: Array<number> = data.authResults;
          let length: number = grantStatus.length;
          for (let i = 0; i < length; i++) {
            if (grantStatus[i] === 0) {
              // 用户授权,可以继续访问目标操作
              console.log("同意授权")
            } else {
              console.log("拒绝授权")
              // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
              return;
            }
          }
          // 授权成功
        }).catch((err) => {
          console.error(`requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);
        })

        windowStage.loadContent('pages/Index', (err, data) => {
          if (err.code) {
            hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
            return;
          }
          hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

}

状态栏设置

根据文档过滤出了 API9 对状态栏控制的方法,但新版的鸿蒙API目前并不支持修改状态栏的颜色等(提供了API但调用错误码 801)

官方文档地址

将页面顶到状态栏

效果

entryAbility 中添加

onCreate(want,launchParam){
    let promise = window.getLastWindow(this.context);
    promise.then((data)=>{
       let windowClass = data;
       // 隐藏顶部状态栏背景
      windowClass.setWindowLayoutFullScreen(true);
    })
}

沉浸式全屏设置(游戏全屏)

效果:

entryAbility 中添加

onWindowStageCreate(windowStage: window.WindowStage) {
    windowStage.getMainWindow((err, windowClass) => {
      // 隐藏状态栏显示(全屏沉浸式)
      windowClass.setWindowLayoutFullScreen(true)
      windowClass.setWindowSystemBarEnable(['navigation'])
    })
    ....
}

List组件嵌套web组件

在 App 开发中,对经常更新的模块会采用 webView 的方式, 让用户在不更新 APP 的情况下,更新部分内容,但鸿蒙系统中 List 组件嵌套 web 组件, web 组件区域会影响整体滑动, 效果图如下

原因: List组件嵌套Web组件产生了滑动冲突,这里您可以使用触摸测试控制来规避此种情况

解决方式:

ListItem(){
    Web({ src:$rawfile("index.html"), controller: this.webviewController})
    .width("100%")
    .height("220")
}.hitTestBehavior(HitTestMode.Block)

效果如下:

参考文档


真机状态下log无效

鸿蒙开发在真机调试下无法打印 log 日志, 但在预览模式和虚拟机下可以正常打印, 效果图

解决方式: 真机下关闭开发者模式和 USB调试,重新打开连接可以看到日志情况,如果控制台信息过多可以 ctrl + F 过滤自己的 log 日志

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇