获取权限
以获取相机权限为例,先在 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 日志