需要权限 运行时权限 包括地理位置、相机、麦克风、文件、图片视频、日历、健身运动、身体传感器、音乐、等权限
- 数据包括个人数据(如照片、通讯录、日历、位置等)、设备数据(如设备标识、相机、麦克风等)。
- 功能包括设备功能(如访问摄像头/麦克风、打电话、联网等)、应用功能(如弹出悬浮窗、创建快捷方式等)
授权方式
根据授权方式的不同,权限类型可分为system_grant(系统授权)和user_grant(用户授权) 和 受限权限。
- system_grant(系统授权)如果在应用中申请了system_grant权限,那么系统会在用户安装应用时,自动把相应权限授予给应用,比如 ohos.permission.INTERNET 上网
- user_grant指的是用户授权类型, 需要用户运行时申请,
- 受限权限,需要在huawei申请。应用需要克隆、备份或同步图片/视频类文件。比如 READ_IMAGEVIDEO
声明
应用需要在module.json5配置文件的requestPermissions标签中声明权限
module 下面
- name 就是所需要的权限 地理位置、相机、麦克风、文件、图片视频 等等
- reason 当申请的权限为user_grant权限时此字段必填,用于描述申请权限的原因。会在弹出授权框时出现
- usedScene,abilities和when组成。其中abilities可以配置为多个UIAbility组件,when 表示调用时机。when:inuse(使用时)、always(始终),abilities 不配置也没事
ts
"requestPermissions": [
{
"name": 'ohos.permission.INTERNET'
},
{
// 相机权限为用户权限,需要用户授权同意。所以要对权限使用的原因和场景进行描述。
"name": "ohos.permission.CAMERA",
// reason 必须在string中
"reason": "$string:Camera_reason",
"usedScene": {
"when": "always"
"abilities": ["EntryAbility"]
}
}
]
检测是否有这个权限
使用 abilityAccessCtrl.AtManager 类来检测,需要tokenid,不知道为啥没成功
ts
try {
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION | bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_METADATA;
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags)
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
// 获取应用的唯一表示,相当于是那个应用向应用申请检测的
let tokenId = appInfo.accessTokenId
let status: abilityAccessCtrl.GrantStatus = atManager.checkAccessTokenSync(tokenId, 'ohos.permission.CAMERA')
if (status = abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
promptAction.showToast({ message: '已经获取了' })
} else {
promptAction.showToast({ message: '未获取,需要申请' })
}
} catch (e) {
console.error('错误了')
}
请求权限
使用abilityAccessCtrl.AtManager,里面还有这次是否弹窗
ts
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(getContext(this), ['ohos.permission.CAMERA']).then((data) => {
let grantStatus: Array<number> = data.authResults;
if (grantStatus[0] === 0) {
// 授权成功
promptAction.showToast({ message: '授权成功' })
} else {
}
}).catch((err: Error) => {
})
去设置页打开权限
这里面pushParams 就是自己这是你自己的bundleName
ts
AlertDialog.show({
title: "权限申请",
message: '去设置页面打开',
primaryButton: {
value: '取消', action: () => {
promptAction.showToast({ message: '取消了' })
}
},
secondaryButton: {
value: '确定', action: () => {
let wantInfo: Want = {
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_info_entry',
parameters: {
pushParams: 'com.nzy.test' // 打开指定应用的详情页面 这是你自己的bundleName
}
}
let context = getContext(this) as common.UIAbilityContext
context.startAbility(wantInfo)
}
}
})
选择图片
用户有时需要分享图片、视频等用户文件 可以使用 PhotoViewPicker,不需要使用权限就可以拿到了,这样拿到只读,可以选择图片或者视频,或者视频加图片,可以拿到 注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri
ts
@State src: PixelMap | ResourceStr | DrawableDescriptor = '';
let context = getContext(this) as common.UIAbilityContext; // 请确保 getContext(this) 返回结果为 UIAbilityContext
let photoPicker = new picker.PhotoViewPicker(context);
photoPicker.select({ MIMEType: picker.PhotoViewMIMETypes.IMAGE_TYPE },
(error, result: picker.PhotoSelectResult) => {
if (!error) {
this.message = ` ${JSON.stringify(result)}`
console.log(`result = > ${result}`)
this.photoUris = result.photoUris
if(this.photoUris.length>0){
// 线上到图片上
this.src = result.photoUris[0]
this.setResult()
}
}
})
通过使用fileIo.openSync接口,通过uri打开这个文件得到fd
ts
async setResult() {
let uri: string = this.photoUris[0];
let file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY);
console.info('file fd: ' + file.fd);
let buffer = new ArrayBuffer(114096);
let readLen = fileIo.readSync(file.fd, buffer);
console.info('readSync data to file succeed and buffer size is:' + readLen);
fileIo.closeSync(file);
}
指定URI获取图片或视频资源
需要这个了,就不考虑了 ohos.permission.READ_IMAGEVIDEO