申请权限、打开应用设置和选择图片Picker

需要权限 运行时权限 包括地理位置、相机、麦克风、文件、图片视频、日历、健身运动、身体传感器、音乐、等权限

  • 数据包括个人数据(如照片、通讯录、日历、位置等)、设备数据(如设备标识、相机、麦克风等)。
  • 功能包括设备功能(如访问摄像头/麦克风、打电话、联网等)、应用功能(如弹出悬浮窗、创建快捷方式等)

授权方式

具体权限在

根据授权方式的不同,权限类型可分为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

相关推荐
清水白石00812 分钟前
Python 类定义阶段自动注册子类:从 `__init_subclass__` 到插件系统实战
linux·前端·python
用户69371750013841 小时前
Kimi K3 综合能力处于全球第一梯队
android·前端·后端
anno1 小时前
Agent 新手 Skill 优先级指南:从第一套必装工作流,到专业能力补全
前端·后端
Liora_Yvonne1 小时前
前端请求层到底怎么封?为什么全局 axios 单例越用越难维护
前端
anno1 小时前
别再把文档“一刀切”:用 LangChain.js 做好 RAG 的第一公里
前端·后端
皮卡穆2 小时前
React 中使用 react-org-tree 实现组织结构树
前端·react.js·前端框架
MariaH2 小时前
费曼学习法与effort-learning理论
前端
qiaofugui2 小时前
如何用 Codex 做一次可靠的项目重构:方法、节奏和可复用提示词
前端
涛涛ing2 小时前
前端圈7月大地震:TS 7发布、Bun 11天从Zig迁Rust、Kimi K3登顶、大厂裁员50%
前端
遇乐的果园2 小时前
前端学习笔记-vue列表处理
前端·vue.js·学习